Czy istnieje taki algorytm do sortowania tablicy punktów 2D w kolejności zgodnej z ruchem wskazówek zegara?
W moim przypadku mam do czynienia z trójkątem prostokątnym, więc tylko 3 punkty.
Chciałbym jednak wiedzieć, czy taki algorytm istnieje, a jeśli nie, to w jaki sposób można zwrócić 3 punkty mojego trójkąta w kolejności zgodnej z ruchem wskazówek zegara?
Edycja: Próbuję obliczyć punkty zgodnie z ruchem wskazówek zegara w stosunku do środka ciężkości wielokąta, który jest wypukły.
Aktualizacja: jest to implementacja, z której korzystałem w oparciu o wybraną odpowiedź, nie jest krytyczna pod względem wydajności i zdarza się tylko raz na jakiś czas, więc działa.
ArrayList<PVector> pointList = new ArrayList<PVector>();
pointList.add(A);
pointList.add(B);
pointList.add(C);
Collections.sort( pointList, new TriangleVectorComparator(origin) );
return pointList;
// Comparator
package triangleeditor;
import java.util.Comparator;
import processing.core.PVector;
public class TriangleVectorComparator implements Comparator<PVector> {
private PVector M;
public TriangleVectorComparator(PVector origin) {
M = origin;
}
public int compare(PVector o1, PVector o2) {
double angle1 = Math.atan2(o1.y - M.y, o1.x - M.x);
double angle2 = Math.atan2(o2.y - M.y, o2.x - M.x);
//For counter-clockwise, just reverse the signs of the return values
if(angle1 < angle2) return 1;
else if (angle2 < angle1) return -1;
return 0;
}
}