Вы можете посмотреть на это как поле высоты на треугольнике B=[(0,0),(0,1),(1,0)]
.
Поскольку плоскость определяется как высота по углам B
, высоту плоскости по внутренней точке B
можно рассчитать с помощью барицентрических координат. С учетом:
- самолет с высотой
(a,b,c)
по углам B
- точка
P
в B
с барицентрическими координатами (x,y,z) [x+y+z=1, x,y,z>=0]
,
высота плоскости в точке P
равна x*a + y*b + z*c
.
Естественные барицентрические координаты для точки P=(x,y)
в B
равны (x,y,1-x-y)
.
При этом легко вычислить линию пересечения двух плоскостей (a1,b1,c1)
и (a2,b2,c2)
в барицентрических координатах.
Просто выровняйте, где 2 плоскости имеют одинаковую высоту
x*a1 + y*b1 + (1-x-y)*c1 = x*a2 + y*b2 + (1-x-y)*c2
=>
x*(a1-c1-(a2-c2)) + y*(b1-c1-(b2-c2)) + c1-c2 = 0
При 0 <= x,y <= 1
и x+y <= 1
, 2 плоскостях это уравнение линии пересечения 2 плоскостей в B
.
Я думаю, что есть 2 подхода, которые можно использовать для создания результирующего поля высоты (самый верхний слой):
Итеративное добавление нового треугольника
Для его поддержки необходимо иметь структуру, которая
разбиение треугольника B
на многоугольники. Полигон - это область треугольника, где одна плоскость является самой высокой. Поскольку мы имеем дело с плоскостями, многоугольники будут выпуклыми, и одна плоскость может создать не более одного многоугольника.
Добавление нового треугольника и вычисление пересечений с существующими полигонами поля высоты даст
новый многоугольник (линии пересечения и граница B
).
Этот новый многоугольник добавляется в поле высоты. Если существующий многоугольник пересекается, то часть удаляется. Если существующий многоугольник перекрывается, то многоугольник удаляется.
Распространение линии фронта пересечения
- Начните с одного угла и возьмите плоскость, которая является самой высокой на нем (например, плоскость с максимумом (a_i)). Установите переднюю линию в этот угол.
- Найдите плоскости, которые пересекают начальную плоскость с линиями пересечения, ближайшими к фронту. Переместите фронт к этим линиям пересечения.
- Возьмите одну (любую) плоскость, которая находится на линии фронта, и сделайте пересечение с необработанными плоскостями с линиями пересечения, ближайшими к фронту. Переместите фронт к этим линиям пересечения.
Повторяйте 3. пока передняя линия не закроет треугольник B
.
Я предпочитаю второй алгоритм.