Распаковав лямбда-функцию я обнаружил, чтобы понять, что делает Python - PullRequest
0 голосов
/ 03 октября 2018

Я реализую первую половину алгоритма 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]))

1 Ответ

0 голосов
/ 03 октября 2018

Метод сортировки Python сначала будет сортироваться на основе slope(p, start), затем на -p[1], а затем на p[0] (для разрыва связей).Чтобы быть более точным в вашем запросе, p[1] - это y-координата, а -p[1] будет сортироваться по убыванию y-координат.Точно так же, p[0] - это x-координата, поэтому сортировка будет выполняться в порядке возрастания x-координат.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...