2D空间中的点的排序

时间:2011-02-01 10:46:44

标签: algorithm math geometry

假设在平面中散布的随机点 P1到P20 。 那么有没有办法以时钟方式反时钟方式对这些点进行排序。 enter image description here

这里我们不能使用度,因为你可以从图像中看到许多点可以具有相同的度数。 例如, P4,P5和P13 获得相同的学位。

3 个答案:

答案 0 :(得分:3)

您是说要订购结果P1,P2,... P13?

如果是这种情况,您需要找到convex hull点。然后在船体周围行走将为您提供所需点数的顺序。

在实际意义上,请查看OpenCV的documentation - 使用convexHull调用clockwise=true可以按照您想要的顺序为您提供点数向量。该链接适用于C ++,但也有C和Python API。像Matlab这样的其他软件包应该具有类似的功能,因为这是一个常见的几何问题需要解决。

修改

一旦你获得凸包,你可以从外面迭代地折叠它以获得剩余的点。当船体内部没有更多像素时,您的迭代将停止。您必须设置折叠函数,以便首先包含更近的点,即得到:

enter image description here

而不是:

enter image description here

在两个图中,绿色是原始的凸包,其他颜色是折叠区域。

答案 1 :(得分:3)

如果您的图片在点之间具有实际距离,您可以随意选择一个点,比如说P1,然后总是选择最近的未访问的邻居作为您的下一个点。旅行推销员,有点。

答案 2 :(得分:2)

找到最右边的点(在O(n)中)并按相对于该点的角度排序(O(nlog(n)))。

这是格雷厄姆凸壳算法的第一步,因此这是一个非常常见的程序。

编辑:实际上,这是不可能的,因为你的点的多边形表示(即输出顺序)是不明确的。上面的算法只适用于凸多边形,但它也可以扩展为适用于星形多边形(你需要选择一个不同的“参考点”)。

您需要更准确地定义实际需要的顺序。