Delaunay-TriangulierungDie Delaunay-Triangulierung (seltener auch Delaunay-Triangulation) ist ein gebräuchliches Verfahren, um aus einer Punktemenge ein Dreiecksnetz zu erstellen. Sie ist nach dem russischen Mathematiker Boris Nikolajewitsch Delone (in der französischen Form des Nachnamens Delaunay) benannt, welcher 1924 darüber einen Artikel veröffentlicht hat.[1] PrinzipMit dem Verfahren der Delaunay-Triangulierung werden Punkte im so zu Dreiecken vernetzt, dass innerhalb des Kreises, auf dem die drei Dreieckspunkte liegen (Umkreis des Dreiecks), keine anderen Punkte enthalten sind. Man verwendet das Verfahren zum Beispiel zur Optimierung von Berechnungsnetzen für die Finite-Elemente-Methode. In einer Delaunay-Triangulierung erfüllen alle Dreiecke des Dreiecksnetzes die sogenannte Umkreisbedingung: Der Umkreis eines Dreiecks des Netzes darf keine weiteren Punkte der vorgegebenen Punktmenge enthalten. Dadurch wird, mathematisch gesprochen, „der kleinste Innenwinkel über alle Dreiecke maximiert“. Es wird also garantiert, dass der kleinste Winkel in den Dreiecken so groß wird, wie dieser in diesem Dreiecksnetz sein kann. Über die anderen Winkel wird jedoch keine Aussage getroffen.[2] Die Delaunay-Triangulierung ist nicht eindeutig, falls auf einem Umkreis mehr als drei Punkte liegen, d. h., der Anwender kann sich beliebig aussuchen, welche drei Punkte er zu einem Dreieck verbindet. In zweidimensionalen Netzen führt die Delaunaytriangulierung allgemein zu Dreiecken, deren Innenwinkel relativ groß sind. Diese Eigenschaft ist in der Computergrafik sehr erwünscht, denn sie minimiert Rundungsfehler. Im dreidimensionalen Raum wird statt der Umkreisbedingung die analoge Umkugelbedingung verwendet, welche dann aus jeweils vier Punkten ein Tetraeder erzeugt. Allerdings kann Delaunay-Triangulierung in drei- oder höherdimensionalen Räumen zur Bildung von Artefakten führen, die man Sliver (engl. für ‚Splitter‘) nennt.[3] Diese Artefakte weisen für die Computergrafik, Finite-Elemente-Methoden und viele andere Anwendungen negative Eigenschaften auf. Daher ist Delaunaytriangulierung kein eigenständiges Mittel, um Computergrafiken zu erzeugen, sondern muss durch eine Fehlerbehandlung begleitet werden.[3] Zusammenhang mit Voronoi-DiagrammenDie Delaunay-Triangulierung ist der duale Graph des Voronoi-Diagramms der Punktemenge, d. h., die Ecken der Voronoizellen sind die Umkreismittelpunkte der Dreiecke der Delaunay-Triangulierung. Man erhält die Voronoi-Zellen, wenn man von allen Dreieckseiten die Mittelsenkrechten bis zum gemeinsamen Schnittpunkt mit den anderen beiden Mittelsenkrechten desselben Dreiecks einzeichnet. Dieser Punkt kann bei stumpfwinkligen Dreiecken durchaus außerhalb der Dreiecksfläche liegen. Bei rechtwinkligen Dreiecken ist er der Halbierungspunkt der Hypotenuse. Die Kanten des Voronoi-Diagramms sind orthogonal zu den Kanten (Dreieckseiten) der Delaunay-Triangulierung und schneiden diese in deren Mittelpunkt, denn sie sind Teil von deren Mittelsenkrechten.
AlgorithmenEs gibt mehrere Ansätze, um eine Delaunay-Triangulierung durchzuführen. Die beste erreichte Laufzeit liegt bei bei einem Speicherbedarf von . Viele Algorithmen zum Berechnen von Delaunay-Triangulierungen verlassen sich auf schnelle Methoden, die erkennen, wann ein Punkt innerhalb des Umkreises eines Dreiecks liegt, und auf eine effiziente Datenstruktur zum Speichern von Dreiecken und Kanten. In zwei Dimensionen kann man feststellen, ob der Punkt im Umkreis von , , liegt, indem man folgende Determinante berechnet: Wenn , und im Gegenuhrzeigersinn angeordnet sind und wenn innerhalb des Umkreises liegt, ist diese Determinante positiv. Flip-AlgorithmusDer Flip-Algorithmus ist eine spezielle Ausprägung für zweidimensionale Dreiecksnetze. Er basiert auf einer lokalen Auswertung der Umkreisbedingung. Zunächst wird mit einem einfachen Algorithmus ein beliebiges Dreiecksnetz erzeugt. Dieses muss keineswegs die Umkreisbedingung erfüllen, es darf lediglich keine sich überschneidenden Kanten enthalten. Für jedes Dreieck wird geprüft, ob der Umkreis dieses Dreiecks einen weiteren Punkt einschließt, der Teil eines angrenzenden Dreiecks ist. In diesem Fall wird ein Flip der gemeinsamen Kante durchgeführt. Das heißt, die gemeinsame Kante wird durch eine neue Kante ersetzt, die die beiden Punkte verbindet, die vorher nicht verbunden waren. Nach dem Flip ist die Umkreisbedingung lokal erfüllt. Allerdings kann dadurch die Umkreisbedingung in den benachbarten Dreiecken wieder gestört worden sein. Im schlechtesten Fall müssten also nach einem Flip alle anderen Dreiecke wieder überprüft werden, weshalb der Rechenaufwand des Flip-Algorithmus ist.
PseudocodeWenn die Menge der Punkte, die Menge der Kanten, die Menge der Dreiecke und die euklidische Länge der Kanten ist, kann der Flip-Algorithmus wie folgt in Pseudocode notiert werden: 1: Initialisiere die leeren Mengen V, E, T und K = (V, E, T) 2: Markiere alle Kanten e ∈ E 3: Füge alle Kanten e ∈ E dem Stack s hinzu 4: Solange der Stack s nicht leer ist: 5: Entferne die Kante ei,j vom Stack s und entmarkiere ei,j 6: Falls die Kante ei,j die Umkreisbedingung nicht erfüllt: 7: ek,l = Flip der Kante ei,j 8: Berechne L(ek,l) 9: Für alle Kanten e ∈ {ek,j, ej,l, el,i, ei,j}: 10: Falls die Kante e nicht markiert ist: 11: Markiere die Kante e und lege die Kante e oben auf den Stack s Um den Algorithmus zu implementieren, sind zwei wesentliche Funktionen erforderlich, nämlich die Funktion Delaunay für die Kante und die Berechnung der neuen Kantenlänge , wenn die Kante gekippt wird. Beide benötigen nur die Kantenlängen der benachbarten Dreiecke und . Dafür kann man zunächst die Tangenten der Halbwinkel der Dreiecke mit dem Halbwinkelsatz berechnen. Wenn , und die Seitenlängen eines Dreiecks sind und der Winkel gegenüber der Seite mit der Länge ist, dann gilt: Daraus kann man den Kotangens berechnen: Für eine Grenzkante gibt die Funktion Delaunay true zurück. Für eine innere Kante gibt die Funktion true zurück, wenn der Kotangens auf der Kante nicht negativ ist, andernfalls false. Dafür muss die andere Diagonale in einem Viereck mit bekannten Seiten , , , und Diagonale berechnet werden. Die Werte von und erhält man mit dem Halbwinkelsatz. Daraus ergeben sich und und schließlich
Die korrekte Ausführung des Algorithmus hängt sowohl von der korrekten Auswertung der Funktion Delaunay als auch von der korrekten Berechnung der Längen gekippter Kanten ab, weil spätere Flips auf diese Weise von früheren Flips abhängen können.[4] Die Markierungen vermeiden mehrere Kopien derselben Kante auf dem Stack. Dies impliziert, dass die Größe des Stacks zu jedem Zeitpunkt kleiner als ist. Man beachte auch, dass der Stack anfänglich alle nicht indizierten Kanten enthält und dass diese Eigenschaft als Invariante des Algorithmus beibehalten wird. Das Delaunay-Lemma impliziert, dass die Triangulierung die Delaunay-Triangulierung ist, wenn der Algorithmus anhält, also wenn der Stack leer ist. Es ist jedoch noch nicht klar, dass der Algorithmus terminiert. Tatsächlich kann der Stack im Laufe des Algorithmus wachsen und schrumpfen, was den Nachweis erschwert, dass er jemals leer läuft.[5] Inkrementelle KonstruktionBei der inkrementellen Methode[6] werden die Punkte einer nach dem anderen hinzugefügt. Im Gegensatz zu den anderen Verfahren lässt sich so nicht nur die Delaunay-Triangulation einer festen Punktemenge erzeugen, sondern auch später noch durch Punkte erweitern, die zu Anfang noch nicht bekannt waren und erst durch einen Prozess bestimmt werden. Der Kern dieser Methode ist ein Algorithmus, der eine bestehende Delaunay-Triangulation voraussetzt und innerhalb dieser einen Punkt hinzufügt. Als Initialisierung genügt es, ein Dreieck vorzugeben, welches das Gebiet aller zu erwartenden Punkte einschließt. Der Algorithmus lässt sich in drei Schritte unterteilen:
Die Suchmethode mit für alle Punkte durchzuführen, hat den Aufwand , die Korrekturen für Punkte (bei zufälliger Reihenfolge) nur . Der Gesamtaufwand ist daher durch die Suche bestimmt. Eine einfache Möglichkeit zur Verbesserung der Suche ist, die Triangulation von einem beliebigen Dreieck ausgehend in Richtung des gesuchten Punktes zu durchlaufen. Der Aufwand dieser Methode ist . Eine etwas kompliziertere Suche lässt sich implementieren, wenn man die Geschichte aller erzeugten Dreiecke in einem Baum speichert. Diese Baumstruktur benötigt zwar zusätzlichen Speicherplatz, verbessert aber die Suche und damit den gesamten inkrementellen Algorithmus auf .[7] Divide and conquerDer Teile-und-herrsche-Ansatz verbindet jeweils zwei Delaunay-Triangulationen unter Einhaltung der Delaunay-Bedingung. Der Rechenaufwand liegt bei . SweepDer Sweep-Algorithmus fügt immer ein Dreieck unter Einhaltung der Delaunay-Bedingung hinzu. Im Gegensatz zur inkrementellen Konstruktion wird hier stets ein benachbartes Dreieck angefügt, während bei der inkrementellen Konstruktion ein beliebiges Dreieck angefügt werden kann. Der Rechenaufwand liegt bei . VoronoiBeim Voronoi-Ansatz wird zunächst der Voronoi-Graph für alle Punkte gebildet. Durch die Dualität zum Dreiecksnetz hat man so bereits alle nötigen Umkreismittelpunkte bestimmt und muss nun nur noch die dazugehörigen Kreise ziehen. Berechnung über die konvexe Hülle in 3DJeder 2D-Punkt wird um eine z-Koordinate mit erweitert. Um diese 3D-Punkte wird die konvexe Hülle – eine mit Dreiecken facettierte Oberfläche – erstellt. Die Orientierung der Dreiecksnormalen sei nach außen festgelegt. Werden alle nach unten orientierten Dreiecke (also jene mit negativer z-Koordinate ihres Normalenvektors) in die ursprüngliche xy-Ebene zurückprojiziert, erhält man dort das gesuchte 2D-Delaunay-Dreiecksnetz. Der Zeitaufwand liegt bei .[8] VerallgemeinerungDie Delaunay-Triangulierung kann vom zweidimensionalen Fall auf Dimensionen verallgemeinert werden. Für eine Menge von Punkten im -dimensionalen euklidischen Raum ist eine Delaunay-Triangulierung eine Triangulierung , so dass kein Punkt in innerhalb der -dimensionalen Umkugel (Hyperkugel) eines -Simplex in liegt. Es ist bekannt, dass es eine eindeutige Delaunay-Triangulierung für gibt, wenn eine Menge von Punkten in allgemeiner Position ist, das heißt, die affine Hülle von ist -dimensional und keine Menge von Punkten in liegt auf dem Rand einer Hyperkugel, deren Inneres nicht schneidet. Das Problem, eine Delaunay-Triangulierung einer Menge von Punkten im -dimensionalen euklidischen Raum zu finden, kann auf das Problem der Bestimmung der konvexen Hülle einer Menge von Punkten im -dimensionalen Raum zurückgeführt werden. Dies kann erreicht werden, indem jedem Punkt eine zusätzliche Koordinate gleich gegeben wird, wodurch er auf einem Hyperparaboloid liegt, dann die Unterseite von deren konvexer Hülle genommen wird (die obere Endkappe zeigt vom Koordinatenursprung weg nach oben und wird verworfen) und zurück auf den -dimensionalen Raum durch Löschen der letzten Koordinate projiziert wird. Weil die konvexe Hülle eindeutig ist, ist dies auch die Triangulierung, vorausgesetzt, alle Facetten der konvexen Hülle sind Simplizes. Nichtsimpliziale Facetten treten nur auf, wenn der ursprünglichen Punkte auf derselben -Hypersphäre liegen, d. h., die Punkte nicht in allgemeiner Position sind. AnwendungDie Delaunay-Triangulierung erlaubt beispielsweise einen einfachen Beweis für das Theorem von Thue, welches besagt, dass die hexagonale Kreispackung die dichteste aller möglichen Kreispackungen ist.[9] Literatur
WeblinksCommons: Delaunay triangulation – Sammlung von Bildern, Videos und Audiodateien
Einzelnachweise
|