Ich habe einen Vektor mit n Zeilen mit xy-Koordinaten von Punkten. Diese Punkte bilden eine Kontur eines gegebenen CAD-Modells. Jetzt möchte ich die Kontur des Modells wiederherstellen. Also habe ich versucht, den Punkt mit der Atan2-Funktion zu sortieren. Dies ist der Code, mit dem ich die Punkte sortiere.Punkte im Vektor sortieren, um Konturen zu bilden
std::sort(matrix.begin(), matrix.end(), sort1);
matrix.erase(std::unique(matrix.begin(), matrix.end(), compare2),matrix.end());
matrix.push_back(std::vector<double>(3, 0));
Also zuerst sortiere ich die Punkte in der Vektormatrix. Als Vergleichsfunktion verwende ich diesen Code
bool sort1(vector<double> const& s1, vector<double> const& s2)
{
return atan2(s1[1],s1[0])<atan2(s2[1],s2[0]);
}
Nachdem der Vektor sortiert wurde, ich Duplikate löschen Sie einfach die Größe des Vektors zu reduzieren. Der letzte Schritt besteht darin, den ersten Punkt bis zum Ende des Vektors zurückzudrücken, um die Kontur zu schließen. Für Standardmodelle wie einen Würfel oder einen Ball funktioniert das gut, aber für kompliziertere Modelle funktioniert die atan2-Funktion einwandfrei. Dieses Bild zeigt also die unsortierten Punkte.
Wenn ich den Vektor ich diesen conture als Ergebnis erhalten sortieren war
Mein erster Ansatz, um die atan2 Funktion zu überprüfen, aber es funktioniert gut. Das Problem scheint das Ergebnis der atan2-Funktion zu sein. So Diese Liste zeigt die aktuellen Koordinaten und das Ergebnis der atan2 Funktion
x y z atan2
-5.44283 -1.94995 0 -2.79758
-5.36969 -1.93228 0 -2.79617
-5.33637 -1.92454 0 -2.79547
-13.15 -4.76500 0 -2.79395
-5.26308 -1.90750 0 -2.79389
-5.22970 -1.90005 0 -2.7931
-5.15626 -1.88364 0 -2.79134
Wie Sie während der x sehen und y-Koordinate der atan2 ändern bleibt im gleichen Bereich wie die anderen Werte. Für mich ist das das Problem, warum meine Konturen nicht stimmen. Muss ich meiner Sortierfunktion etwas hinzufügen, um die richtigen Ergebnisse zu erhalten?
Eine Idee war, die Koordinaten nicht nur nach atan2 zu sortieren, sondern auch nach der Länge des Vektors zwischen dem Punkt, dem niedrigsten atan2 und allen anderen Punkten. Aber hier ist mein Problem. Ich würde zuerst nach atan2 sortieren und dann wieder nach der Länge sortieren. Der zweite Sortiervorgang würde jedoch das Lochergebnis der ersten Sortierfunktion zerstören.
Also im Grunde ist atan2 nicht der richtige Weg zu sortieren und Sie möchten wissen, wie man sortiert, um eine Kontur für eine bestimmte Menge von Punkten zu erhalten. Dies scheint mehr mit Mathematik zu tun zu haben. – stefaanv
Für mich scheint atan2 ein guter Anfang zu sein, den Vektor zu sortieren. Aber ich denke, ich brauche mehr als nur diese eine Funktion, um den ganzen Vektor zu sortieren. – user3794592
atan2 führt einen kreisförmigen Scan durch, der für eine begrenzte Anzahl von Punkten zulässig ist, nicht für komplexere Konturen oder Konturen, bei denen der Ursprung nicht innerhalb ist. – stefaanv