Bei einem konkaven Polygon (ohne Selbstüberschneidungen) mit seinen Knoten im Uhrzeigersinn, wie können wir alle seine inneren Diagonalen (die innerhalb des Polygons liegen) bestimmen?Die Diagonalen eines Polygons finden
Ich interessiere mich für eine Lösung, die keine trigonometrischen Funktionen verwendet.
Hintergrund und was ich versucht:
In meiner Computational Geometry Klasse wurden wir den folgenden Algorithmus gegeben zu testen, ob [pi, pj]
eine innere Diagonale in einem Polygon p0, p1, ... pn-1
:
- Testen Sie, ob
[pi, pj]
intersects eine Kante des Polygons, die nicht benachbart ist. Wenn ja, ist es keine innere Diagonale. Wenn nicht, 2. -
- zu Schritt gehen, wenn
pi
ein konvexer Punkt (pi-1, pi, pi+1
biegen Sie rechts ab), dann ist[pi, pj]
eine innere Diagonale iffpi, pj, pi+1
undpi, pi-1, pj
links abbiegen. - Wenn
pi
kein konvexer Punkt ist (pi-1, pi, pi+1
links abbiegen), dann ist[pi, pj]
eine innere Diagonale, wennpj, pj-1, pi
eine Linkskurve macht.
- zu Schritt gehen, wenn
Dieser Algorithmus zu uns für einen Triangulierungsalgorithmus beteiligt Ohr-Clipping gegeben. Ich habe diesen Algorithmus implementiert und es scheint dort gut zu funktionieren, aber der Haken ist, dass der Algorithmus zum Abschneiden von Ohren nur Diagonalen der Form [pi, pi+2]
verwendet.
Betrachten Sie jedoch den Brute-Force-Triangulationsalgorithmus, der alle sich nicht überschneidenden Diagonalen auswählt. Mit was ich als ein Unterprogramm beschrieben für innere Diagonalen Prüfung (zusammen mit einem Segmentschnittverfahren), ich folgendes Ergebnis:
Es ist einfach zu überprüfen, ob der Algorithmus, den ich gepostet die innere Diagonale [3, 6]
ablehnt, in der Tat sollte es nicht:
3 ist kein konvexer Punkt, und 6, 5, 3
machen eine Rechtskurve statt einer Linkskurve, so wird es abgelehnt.
Beachten Sie, dass bei der Verwendung des Algorithmus zum Abschneiden des Ohrs dieses Polygon korrekt trianguliert wird.
Ich bin daran interessiert, wie dieser Algorithmus angepasst werden kann, um alle Diagonalen in einem Polygon zu erkennen. Ich hatte kein Glück, es zur Arbeit zu bringen.
Ich habe auch andere Probleme mit dieser Methode gefunden, wie Polygone, für die äußere Diagonalen gezeichnet werden. Auch diese arbeiten mit dem Ohr-Clipping-Algorithmus. Uns wurde nie gesagt, dass diese Methode nur für eine spezielle Form von Diagonalen gilt, daher suche ich nach Erklärungen.
Hinweis: Ich konnte nicht entscheiden, ob diese auf math.stackexchange.com zu veröffentlichen oder hier, da Computational Geometry Angebote in etwas gleichermaßen sowohl mit der Programmierung und Mathematik, aber ich fühlte, dass Programmierer besser vertraut sein könnten mit diese Art von Algorithmen als Mathematiker, da jemand dies wahrscheinlich irgendwann einmal umgesetzt hat.
Bitte überprüfen. Scheint diese sehr ähnlich http://stackoverflow.com/questions/693837/how-to-determine-a-diagonal-is-in-oder-out-of-a-concave-polygon –
Ich vermute, dass es zusätzliche Bedingungen für den Algorithmus gibt, den Sie beschrieben haben (selbst für Punkte der Form [p, p + 2]), weil es einfach ist, Gegenbeispiele zu konstruieren, bei denen der Algorithmus sagt, dass es innen ist, aber das Polygon das Liniensegment schneidet - z. B. ein Sechseck mit einem einzelnen konkaven Scheitel -1, p + 1], wobei p 3 Ecken vom konkaven Scheitelpunkt entfernt ist – lijie
@lijie - nicht wirklich, das wird von Schritt 1 des Algorithmus abgedeckt werden. @belisarius - Ich werde es überprüfen. – IVlad