【发布时间】:2016-12-31 07:08:00
【问题描述】:
我有一长串 xy 坐标,如下所示:
>>> data = [(x1,y1),(x2,y2),(x3,y3),...]
每对坐标代表图像中轮廓的一个点,我想对它们进行排序,就像它们沿着轮廓排列(最短路径)一样。轮廓的形状很复杂(它是一个国家的形状),这就是为什么ConvexHull 不会工作。
我试过这段代码,但不够精确:
>>> import math
>>> import matplotlib.patches as patches
>>> import pylab
>>> pp=[(1,1),(2,3),(3,4)]
# compute centroid
>>> cent=(sum([p[0] for p in pp])/len(pp),sum([p[1] for p in pp])/len(pp))
# sort by polar angle
>>> pp.sort(key=lambda p: math.atan2(p[1]-cent[1],p[0]-cent[0]))
# plot points
>>> pylab.scatter([p[0] for p in pp],[p[1] for p in pp])
# plot polyline
>>> pylab.gca().add_patch(patches.Polygon(pp,closed=False,fill=False))
>>> pylab.grid()
>>> pylab.show()
我已经尝试过this case 中的建议 但效果不佳,因为我的坐标列表太长了。
由于点彼此非常接近,this question 的解决方案 对我来说可能看起来太复杂了。
【问题讨论】:
-
你描述的这个任务叫做旅行商问题,一般很难解决。如果您可以向我们展示一些示例图像和相同的示例数据,也许有人会注意到一种模式,可以让我们提出一种有效的算法。
-
因为它是一个计数,通常可以假设对于每个点有 2 个最近的邻居——路径上的一个之前和之后的一个——并且最短路径也将只包括这样的对.因此,您可以使用运行时间为 O(n*n) 或更好的贪心算法。
-
你能解释一下为什么“这个问题对我来说似乎太复杂了”吗?你有没有试过他的解决方案,有什么问题?
标签: python sorting coordinates shortest-path