给定一个由顶点列表(2D坐标)和边(作为顶点对)组成的网格,如下所示:
所以边缘定义如下:
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)等等。
构建多边形列表的高效(快速)方法是什么?在边或顶点中定义?
答案 0 :(得分:2)
对于每条边vw
,生成两个半边v->w
和w->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->5
(8->5
之后)映射到3->2
(5->2
之后)映射到4->3
(之后) 2->3
)映射到8->4
(在3->4
之后)映射到5->8
(4->8
之后)。