Как и предполагалось, все готовое простое решение состоит в том, чтобы вычислить углы от некоторой внутренней точки до всех точек и отсортировать их.
Итак, вот вам функция numpy
для вычисления ccworder
:
In []: def ccworder(A):
..: A= A- mean(A, 1)[:, None]
..: return argsort(arctan2(A[1, :], A[0, :]))
..:
И простая демонстрация:
In []: A
Out[]:
array([[0, 0, 1, 1],
[0, 1, 1, 0]])
In []: ccworder(A)
Out[]: array([0, 3, 2, 1])
Обновление:
Может показаться, что такой порядок может быть утомительным для вычисления, но numpy
может обеспечить хорошую абстракцию, чтобы сделать их довольно простыми.
Предупреждение: Как Джодругие отмечали, что ccworder
будет формировать правильный порядок на выпуклой оболочке, только если все точки готовы на выпуклой оболочке.Т.е. как-то порядок отсутствует, так как, похоже, это случай ОП, его можно восстановить.Конечно, есть и другие ситуации, когда ccworder
используется полностью.