Wie kann man bei einem konkaven Polygon (ohne Selbstschneidungen), dessen Knoten im Uhrzeigersinn angeordnet sind, alle inneren Diagonalen (die innerhalb des Polygons liegen) bestimmen?
Ich bin an einer Lösung interessiert, bei der keine trigonometrischen Funktionen verwendet werden.
Hintergrund und was ich ausprobiert habe :
In meinem Kurs in Computergeometrie sollten wir mit dem folgenden Algorithmus prüfen, ob [pi, pj]
ist eine innere Diagonale in einem Polygon p0, p1, ... pn-1
:
- Test ob
[pi, pj]
eine Kante des Polygons schneidet, die nicht an dieses angrenzt. Wenn ja, handelt es sich nicht um eine innere Diagonale. Wenn nicht, gehen Sie zu Schritt 2. -
- wenn
pi
ist ein konvexer Punkt (pi-1, pi, pi+1
nach rechts abbiegen), dann[pi, pj]
ist eine innere Diagonale, wennfpi, pj, pi+1
ypi, pi-1, pj
nach links abbiegen. - wenn
pi
kein konvexer Punkt ist (pi-1, pi, pi+1
nach links abbiegen), dann[pi, pj]
ist eine innere Diagonale, wennfpj, pj-1, pi
nach links abbiegen.
- wenn
Dieser Algorithmus wurde uns für einen Triangulationsalgorithmus zur Verfügung gestellt, der das Abschneiden von Ohren beinhaltet. Ich habe diesen Algorithmus implementiert, und er scheint gut zu funktionieren, aber der Haken an der Sache ist, dass der Ohr-Clipping-Algorithmus nur Diagonalen der folgenden Form verwendet [pi, pi+2]
.
Betrachten wir jedoch den Brute-Force-Triangulationsalgorithmus, der alle sich nicht schneidenden Diagonalen auswählt. Wenn ich das, was ich als Unterprogramm für die Überprüfung innerer Diagonalen beschrieben habe (zusammen mit einer Segmentschnittmethode), verwende, erhalte ich das folgende Ergebnis:
Es ist leicht zu überprüfen, dass der von mir veröffentlichte Algorithmus die innere Diagonale ablehnt [3, 6]
wenn dies eigentlich nicht der Fall sein sollte:
3 ist kein konvexer Punkt, und 6, 5, 3
nach rechts statt nach links abbiegen, so dass er abgelehnt wird.
Beachten Sie, dass dieses Polygon bei Verwendung des Algorithmus zum Abschneiden der Ohren korrekt trianguliert wird.
Ich bin daran interessiert, wie dieser Algorithmus angepasst werden kann, um alle Diagonalen in einem Polygon zu erkennen. Ich hatte bisher kein Glück, dass es funktioniert.
Ich habe auch andere Probleme mit dieser Methode gefunden, z. B. Polygone, für die äußere Diagonalen gezeichnet werden. Auch diese funktionieren mit dem Algorithmus zum Abschneiden der Ohren. Es wurde uns jedoch nie gesagt, dass diese Methode nur für eine spezielle Form von Diagonalen gilt, weshalb ich nach Klarstellungen suche.
Note : Ich konnte mich nicht entscheiden, ob ich dies auf math.stackexchange.com oder hier posten sollte, da sich die Computergeometrie in etwa gleichem Maße mit Programmierung und Mathematik befasst. Ich hatte jedoch das Gefühl, dass Programmierer mit dieser Art von Algorithmen vielleicht vertrauter sind als Mathematiker, da jemand dies wahrscheinlich tatsächlich irgendwann einmal implementiert hat.