Ni55aN
@Ni55aN

Как найти координаты луча, который делит фигуру на равные по площади части?

В three.js использую Shape. На его основе строю контур с использование кривых Безье.
Необходимо найти Y координату по которой делится фигура по этому контуру на равные по площади части.

Пока приходит на мысль только триангуляция фигуры, деление пополам и подсчет площади по каждую сторону, и так двигаться в направлении к части с большей площадью пока площадь обеих частей не будет одинакова с допустимой погрешностью
  • Вопрос задан
  • 214 просмотров
Решения вопроса 1
Ni55aN
@Ni55aN Автор вопроса
Решение: https://codepen.io/Ni55aN/pen/aYyPoB

Алгоритм:
1. Триангулировать Shape (сразу получаем ShapeGeometry)
2. Получить площадь фигуры (из полученной геометрии)
3. Задать начальную координату y = 0.5, относительно которой по Y будет поделена фигура
4. Отсекаем верхнюю часть геометрии
5. Получаем площадь оставшейся нижней геометрии
6. Рассчитываем погрешность delta = 0.5-area/originalArea, где area - площадь нижней части, originalArea - площадь всей фигуры. Таким образом получаем коэффициент, по которому нужно сместить координату, чтобы уравнять площади нижней и верхней частей
7. Повторяем с пункта 4 с новым y = y + delta * h до тех пор, пока разница в площади половин фигур будет допустимой, где h - высота фигуры
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
1. Считаем кол-во точек внутри фигуры - это общая площадь
2. Находим центр масс
3. Если фигуру можно вращать: находим линию симметрии проходящую через центр масс и поворачиваем фигуру так, чтобы линия симметрии оказалась по горизонтали (вдоль оси X).
4. Отсекаем горизонтальным лучом, проходящим через центр масс фигуру пополам.
5. Сравниваем площади верхней и нижней частей.
6. Смещаем луч выше или ниже для уравнивания площадей.
7. Profit!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы