从2D网格创建多边形的高效算法? (顶点+边缘)

时间:2016-02-17 22:13:47

标签: algorithm polygon mesh vertices edges

给定一个由顶点列表(2D坐标)和边(作为顶点对)组成的网格,如下所示:

Mesh

所以边缘定义如下:

a: 2,3 
b: 3,4
c: 4,8
d: 5,8
e: 6,7
etc..

边缘是方向中性的,即定义边缘的任意两个顶点的顺序是随机的(边缘不是顺时针或逆时针)。

多边形可以是凸面或凹面,但它们从不重叠或自相交(边缘永远不会相互交叉)。

问题:如何生成所有多边形的列表?

更具体地说,在上面的例子中,我需要4个多边形,如下所示:

(a,b,c,d,i)
(d,g,h)
(f,i,j,k)
(e,h,k)

多边形也没有方向,顺时针或逆时针不适用,实际上定义多边形的边的顺序也可以是随机的。例如,(a,i,d,b,c)对于5面的那个也可以。

不是将多边形定义为边列表,也可以是连接顶点列表,如下所示:

(2,3,4,8,5)
(6,5,8)
(2,5,7,1)
(7,6,5)

在这种情况下,顶点的顺序不能是随机的(顶点列表应该是圆形序列),但方向(顺时针或逆时针)仍然无关紧要。因此,4边多边形也可以是(5,2,1,7)或(1,7,5,2)等等。

构建多边形列表的高效(快速)方法是什么?在边或顶点中定义?

1 个答案:

答案 0 :(得分:2)

对于每条边vw,生成两个半边v->ww->v。按头分区(x->y的头部是y)。在每个分区中,按角度排序(如果使用比较排序,则有一种方法可以避免触发)。

对于样本图,结果为

7->1, 2->1
1->2, 5->2, 3->2
2->3, 4->3
8->4, 3->4
7->5, 6->5, 8->5, 2->5
8->6, 5->6, 7->6
6->7, 5->7, 1->7
5->8, 6->8, 4->8

。现在,定义一个排列,其中v->w映射到包含w->v的列表中w->v后面的半边(必要时包裹)。这种排列的周期是多边形。

例如,5->8映射到2->58->5之后)映射到3->25->2之后)映射到4->3(之后) 2->3)映射到8->4(在3->4之后)映射到5->84->8之后)。