假设在平面中散布的随机点 P1到P20 。 那么有没有办法以时钟方式或反时钟方式对这些点进行排序。
这里我们不能使用度,因为你可以从图像中看到许多点可以具有相同的度数。 例如, P4,P5和P13 获得相同的学位。
答案 0 :(得分:3)
您是说要订购结果P1,P2,... P13?
如果是这种情况,您需要找到convex hull点。然后在船体周围行走将为您提供所需点数的顺序。
在实际意义上,请查看OpenCV的documentation - 使用convexHull
调用clockwise=true
可以按照您想要的顺序为您提供点数向量。该链接适用于C ++,但也有C和Python API。像Matlab这样的其他软件包应该具有类似的功能,因为这是一个常见的几何问题需要解决。
修改强>
一旦你获得凸包,你可以从外面迭代地折叠它以获得剩余的点。当船体内部没有更多像素时,您的迭代将停止。您必须设置折叠函数,以便首先包含更近的点,即得到:
而不是:
在两个图中,绿色是原始的凸包,其他颜色是折叠区域。
答案 1 :(得分:3)
如果您的图片在点之间具有实际距离,您可以随意选择一个点,比如说P1
,然后总是选择最近的未访问的邻居作为您的下一个点。旅行推销员,有点。
答案 2 :(得分:2)
找到最右边的点(在O(n)
中)并按相对于该点的角度排序(O(nlog(n))
)。
这是格雷厄姆凸壳算法的第一步,因此这是一个非常常见的程序。
编辑:实际上,这是不可能的,因为你的点的多边形表示(即输出顺序)是不明确的。上面的算法只适用于凸多边形,但它也可以扩展为适用于星形多边形(你需要选择一个不同的“参考点”)。
您需要更准确地定义实际需要的顺序。