Ich habe die Lösungen von @ben-voight und @mclafee ausprobiert, aber ich glaube, sie sortieren in die falsche Richtung.
Bei der Verwendung von atan2 werden die Winkel auf folgende Weise angegeben:
Matlab Atan2
Der Winkel ist positiv bei Winkeln gegen den Uhrzeigersinn (nach oben y > 0), und negativ für Winkel im Uhrzeigersinn (untere Halbebene, y < 0).
Wikipedia Atan2
Das bedeutet, dass die Verwendung von ascending sort() von Numpy oder Matlab gegen den Uhrzeigersinn erfolgt.
Dies kann mit Hilfe der Schnürsenkelgleichung überprüft werden
Wikipedia Schnürsenkel
Python Schnürsenkel
Wenn man also die oben genannten Antworten so anpasst, dass die absteigende Sortierung verwendet wird, lautet die richtige Lösung in Matlab
cx = mean(x);
cy = mean(y);
a = atan2(y - cy, x - cx);
[~, order] = sort(a, 'descend');
x = x(order);
y = y(order);
Die Lösung in Numpy lautet
import numpy as np
def clockwise(points):
x = points[0,:]
y = points[1,:]
cx = np.mean(x)
cy = np.mean(y)
a = np.arctan2(y - cy, x - cx)
order = a.ravel().argsort()[::-1]
x = x[order]
y = y[order]
return np.vstack([x,y])
pts = np.array([[7, 2, 2, 7],
[5, 1, 5, 1]])
clockwise(pts)
pts = np.array([[1.0, 1.0],
[-1.0, -1.0],
[1.0, -1.0],
[-1.0, 1.0]]).transpose()
clockwise(pts)
Ausgabe:
[[7 2 2 7]
[5 1 5 1]]
[[2 7 7 2]
[5 5 1 1]]
[[ 1. -1. 1. -1.]
[ 1. -1. -1. 1.]]
[[-1. 1. 1. -1.]
[ 1. 1. -1. -1.]]
Bitte beachten Sie die [::-1]
zum Invertieren von Arrays/Listen verwendet.