Я реализую первую половину алгоритма Grahm Scan выпуклой оболочки , чтобы найти некомплексный многоугольник из моего списка точек.
Мой код в настоящее время
#!/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)] или список контрольных точек.
Я послеуточнение
-p[1], p[0]
в конце лямбда-функции
points.sort(key=lambda p: (slope(p, start), -p[1], p[0]))