确定顶点的排序以形成四边形

时间:2011-08-10 10:44:21

标签: algorithm 2d computational-geometry

假设我在2D空间中有4个顶点。有什么知道一个有效的算法,它会给我一个对应于简单四边形的顶点的排序吗?也就是说,它会标记顶点1, 2, 3, 4,这样如果我跟随1-2, 2-3, 3-4,我将追踪一个简单的(即非相交的)四边形。

只提供我可以google的标准算法的名称就可以了。

5 个答案:

答案 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曲线将传递它。但由于更好的空间填充属性,我建议使用希尔伯特曲线或摩尔曲线。