我正在实现Grahm Scan convex hull algorithm的前半部分,以从我的点列表中找到一个非复杂的多边形。
我的代码当前为
#!/usr/bin/env python
import random
def sortPoints(points):
# Computes the cross product of vectors p1p2 and p2p3
# value of 0 means points are colinear; < 0, cw; > 0, ccw
# Find the smallest left point and remove it from points
start = min(points, key=lambda p: (p[0], p[1]))
points.pop(points.index(start))
# Sort points so that traversal is from start in a ccw circle.
points.sort(key=lambda p: (slope(p, start), -p[1], p[0]))
print points
def slope(p1, p2):
return 1.0*(p1[1]-p2[1])/(p1[0]-p2[0]) if p1[0] != p2[0] else float('inf')
if __name__ == '__main__':
templist = [(0,0), (1,5), (6,6), (3,3), (6,1)]
random.shuffle(templist)
sortPoints(templist)
代码有效,示例返回[(6,1),(6,6),(3、3),(1,5)]或ccw点列表。
我已经弄清楚了
-p[1], p[0]
lambda函数结尾
points.sort(key=lambda p: (slope(p, start), -p[1], p[0]))
答案 0 :(得分:0)
Python的sort方法将首先基于slope(p, start)
进行排序,然后基于-p[1]
进行排序,然后基于p[0]
进行排序(用于平局)。
为了更具体地针对您的查询,p[1]
是y坐标,-p[1]
将根据y坐标的降序进行排序。
同样,p[0]
是x坐标,因此排序将以x坐标的升序执行。
希望有帮助。