假设我在2D空间中有4个顶点。有什么知道一个有效的算法,它会给我一个对应于简单四边形的顶点的排序吗?也就是说,它会标记顶点1, 2, 3, 4
,这样如果我跟随1-2, 2-3, 3-4
,我将追踪一个简单的(即非相交的)四边形。
只提供我可以google的标准算法的名称就可以了。
答案 0 :(得分:4)
如果你的形状是凸的,你可以绕着你的点的重心(即重心,或“平均”)绕行顺序:
B = (X_1 + X_2 + X_3 + X_4) / 4
每个顶点的两个坐标都高于或低于重心的相应坐标:
(-,+) (+,+)
X X
B
X
(-,-) X
(+,-)
所以从任何一点开始,只需移动到一个点,两个符号中只有一个会发生变化,但不会同时发生变化。
如果你的形状不是凸面,你可以先用内边缘对其进行三角测量,对每个三角形应用具有一致方向的顶点排序,然后通过抵消成对相对的内部来合并边缘。
注意,对于非凸集点(即集合的凸包的开放内部中包含一个点的集合),可能存在多个四边形,这些点作为顶点(想想所有将内顶点连接到两个外顶点的方法。)
答案 1 :(得分:4)
您可能对convex hull计算方法感兴趣,例如Graham scan。
答案 2 :(得分:4)
您可以按顺时针方式谷歌搜索点,然后得到例如:
Sort four points in clockwise order
Sort points in clockwise order?
答案 3 :(得分:2)
有一个解决方案不需要计算"中心",只涉及一些乘法和加法,并且优雅地处理退化情况(例如所有点共线)。
考虑带有ABCD角的四边形(即有AB,BC,CD和DA线)。
考虑四个三角形ABC,ABD,ACD,BCD
有一个简单的公式可以计算出每个三角形的面积,如果顶点是(Ax,Ay),(Bx,By),(Cx,Cy)
http://www.cs.princeton.edu/~rs/AlgsDS07/16Geometric.pdf第9页>面积=(Bx - Ax)(Cy - Ay) - (By - Ay)(Cx - Ax)
如果区域为正,则点为逆时针,负值为顺时针,零为共线。
非交叉四边形可能有三个共线点。因此,三角形ABC,ABD,ACD,BCD中的一个可以具有区域零。但是如果它们中的两个具有零面积,则意味着ABCD必须是共线的,因此所有四个三角形都具有零面积。在这种情况下,不可能进行非交叉排列。
因此,计算与ABC,ABD和ACD相对应的区域(您只需要考虑三个三角形)。
如果其中两个区域为零,则三个区域都为零,四个ABCD共线。
如果其中一个区域为零,则选择其他两个区域。
如果它们都没有零区域,只需选择三个区域中的任意两个区域。
如果四边形不相交,则这两个三角形必须以相同的方式缠绕,即顺时针或逆时针两者。这意味着两个区域的产品必须是正面的(正面是正面,负面是负面)。因此,简单地形成两个区域的产品,这两个区域都是非零的,以获得非零结果。如果区域的乘积大于零,则四边形不会自相交,如果小于零,则它会自相交。
答案 4 :(得分:1)
莫顿曲线或z曲线将传递它。但由于更好的空间填充属性,我建议使用希尔伯特曲线或摩尔曲线。