我正在尝试计算任意数量的飞机的最顶部交叉点,没有快乐!我正在使用actionscript,但只需要找到一个我可以实现的算法。
问题:
这是一张图片,用于阐明我对2个三角形的含义:
然而,当我们允许超过2个三角形时,我会遇到尴尬的交叉线。
答案 0 :(得分:1)
我对你的问题很感兴趣所以我描述了算法并用C ++实现它(我不知道AS和C ++一样好)。算法的主要思想是在添加新三角形的同时迭代重新计算顶部曲面。
截取三角形后,可以将其形状更改为具有自定义顶点数的多边形。因此每个三角形最初都转换为普通多边形。每个多边形实例包括其平面方程和一组多边形面。作为数据结构的每个面包括多边形的一个顶点和与多边形顶点序列中的顶点和下一个顶点交叉的垂直边界平面的方程。 (因此,集合中面部的顺序很重要。)
让我们将顶部曲面视为多边形集。在添加新多边形的同时,我们应该迭代地重新计算所有表面多边形的面。面部重新计算算法包括以下步骤:
不要在此页面上泛滥我已将代码放入pastebin。
答案 1 :(得分:1)
您正在构建三个垂直“轴”之间的感兴趣表面。表面在底部以下方为界。将其绑定在上面,以便将问题包含在三棱柱中。
{ 有关凸壳的理论和代码很多。
我不知道ActionScript,但是对“凸面相交的平面船体”进行了快速的互联网搜索,而这些条款让我得到了这个(声称)解决问题的代码:
希望这有帮助, 格伦
答案 2 :(得分:0)
可能效率不高,但这是一个想法。
您计算每两个单独三角形之间的交叉线。
然后在该集合中添加三角形边,并计算其中每两条线之间的交点
找出从顶部看不到哪些点,并从集合中删除它们。这可以使用光线投射和寻找交叉点来完成,但可能有更有效的方法
最终得到一组点,这些点是最顶层网格的顶点。
答案 3 :(得分:0)
您可以将此视为三角形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)
。
通过这种方法,可以很容易地计算出重心坐标中2个平面(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
的边界)。
这个新的多边形被添加到高度字段。如果现有多边形相交,则删除零件。如果现有多边形重叠,则删除多边形。
交叉口前线的传播
重复3.直到前线覆盖三角形B
。
我更喜欢第二种算法。