Ich denke, Guibas und Stolfis "Randalgebra" -Formalismus ist ein bisschen unnötig.
Alles, was wirklich notwendig ist, ist sich an die Unterscheidung zwischen primären und dualen Graphen zu erinnern. Jede Fläche des ursprünglichen Graphen hat einen entsprechenden dualen Vertex f * ; jede Kante e des Urgraphen hat eine entsprechende Doppelkante e ∗ ; und jeder Scheitelpunkt v des ursprünglichen Graphen hat eine entsprechende doppelte Fläche v ∗ . Ursprüngliche Kanten verbinden Urscheitelpunkte und separate Urflächen. Doppelkanten verbinden Doppelscheitelpunkte und separate Doppelflächen. Das Doppelte des Doppelten von allem ist das Ursprüngliche. Siehe Abbildung 4 in der Arbeit von Guibas und Stolfi:ff∗ee∗vv∗
Guibas und Stolfi schlagen vor, jede Kante (entweder die ursprüngliche oder die duale) als Sammlung von vier gerichteten, orientierten Kanten zu betrachten. Der Einfachheit halber werde ich diese Pfeile nennen . Jeder Pfeil Punkte von einem Endpunkt Schwanz ( → e ) an den anderen Endpunkt Kopf ( → e )e⃗ Schwanz ( e⃗ )Kopf ( e⃗ ) und lokal trennen zwei Flächen und rechts ( → e ) . Die Wahl des Endpunkts, der als Tail bezeichnet werden soll ( → e ), liegt beim Dartlinks ( e⃗ )richtig ( e⃗ )Schwanz ( e⃗ )Richtung und die Wahl, welches Gesicht nach ist seine Ausrichtung . (Guibas und Stolfi verwenden "Org" und "Dest" anstelle von "Tail" und "Head", aber ich bevorzuge die kürzeren Labels, weil unnötige Abkürzungen böse sind.)links ( e⃗ )
Für jeden Dart assoziieren Guibas und Stolfi drei verwandte Darts:e⃗
- : Der Pfeil verlässt den Schwanz ( → e ) im Gegenuhrzeigersinn nach → e .tailNext ( e⃗ )Schwanz ( e⃗ )e⃗
- : Der "gleiche" Pfeil wieFlip ( e⃗ )e⃗ links ( e⃗ )richtig ( e⃗ )
- drehen ( e⃗ )e⃗
Diese drei Funktionen erfüllen alle Arten von wundervollen Identitäten, wie zum Beispiel die folgenden:
- rechts ( tailNext ( e⃗ ) ) = links ( e⃗ )
- rechts ( Flip ( e⃗ ) ) = links ( e⃗ )
- rechts ( drehen ( e⃗ ) ) = Kopf ( e⃗ )∗
- flip ( flip ( e⃗ ) ) = e⃗
- drehen ( drehen ( drehen ( drehen ( e⃗ ) ) ) ) = e⃗
- tailNext ( drehen ( tailNext ( drehen ( e⃗ ) ) ) ) = e⃗
e F l i pe.Flip
Darüber hinaus kann man unter Berücksichtigung dieser drei Funktionen mehrere andere nützliche Funktionen definieren, wie z
- umgekehrt ( e⃗ ) = drehen ( drehen ( drehen ( e⃗ ) ) )
- leftNext ( e⃗ ) = drehen ( tailNext ( drehen ( drehen ( drehen ( e⃗ ) ) ) ) )e⃗ links ( e⃗ )
Wenn Sie diese Funktionen kennen, erfahren Sie schließlich alles über die Topologie der Unterteilung, und jede polygonale Unterteilung einer beliebigen Oberfläche (orientierbar oder nicht) kann mit diesen drei Funktionen codiert werden.
Die Vierkantendatenstruktur ist eine besonders praktische Darstellung eines Oberflächendiagramms, das den Zugriff auf alle diese Funktionen sowie auf mehrere andere zeitlich konstante Vorgänge wie Einfügen, Löschen, Zusammenziehen, Erweitern und Spiegeln von Kanten ermöglicht. Teilen oder Zusammenführen von Eckpunkten oder Flächen; und Hinzufügen oder Löschen von Ziehpunkten oder Kreuzkappen.
Habe Spaß!