x,y座標的列表,我還有很長的XY座標列表如下所示:排序在python
>>> 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 的解決方案可能看起來過於複雜。
This might illustrate my problem
你所描述的被稱爲旅行商的問題,是很難在一般的要解決的任務。如果您可以向我們展示一些樣本圖片和相同的樣本數據,也許有人會注意到一種模式,可以讓我們提出一個有效的算法。 –
由於它是一個countour它通常可以假設對於每個點有2個最近鄰 - 所述一個之前和路徑上一前一後 - 並且所述最短路徑也將僅包括這樣的對。因此,您可以使用運行時間爲O(n * n)或更好的貪婪算法。 – janbrohl
你能再解釋一下爲什麼「這個問題看起來對我來說太複雜了」?你有沒有試過他的解決方案,有什麼問題? – Jason