您可以将其视为三角形B=[(0,0),(0,1),(1,0)] 上的高度字段。
由于平面被定义为B 角上的高度,所以B 内点上的平面高度可以用重心坐标计算。给定:
- 平面高度为
(a,b,c),位于B 的拐角处
- 在
B 中用重心坐标(x,y,z) [x+y+z=1, x,y,z>=0] 点P,
点P 上的平面高度为x*a + y*b + z*c。
B 中点 P=(x,y) 的自然重心坐标为 (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 平面这是B 中2 平面相交线的方程。
我认为有两种方法可用于创建结果高度场(最顶层):
迭代添加新三角形
为了支持它,它需要具有以下结构
将三角形B 划分为多边形。多边形是三角形的区域,其中一个平面最高。由于我们处理的是平面,多边形将是凸的,一个平面最多可以产生一个多边形。
添加新三角形并计算与现有高度场多边形的交点将产生
新多边形(B 的交叉线和边界)。
这个新的多边形被添加到高度字段中。如果现有多边形相交,则部分被删除。如果现有的多边形重叠,则多边形会被删除。
路口前线传播
- 从一个拐角开始,取其上最高的平面(例如,具有 max(a_i) 的平面)。将前线设置到那个角落。
- 查找与起始平面相交的平面与最靠近前面的相交线。向前移动到这些交叉线。
- 取一个(任何)位于前线上的平面,并与最靠近前线的未处理平面相交。向前移动到这些交叉线。
重复 3. 直到前线覆盖三角形B。
我更喜欢第二种算法。