Wie kann man aus einem Voronoï-Diagramm triangulieren?


13

Ich habe ein Voronoï-Diagramm aus einer Reihe von Punkten berechnet (mit Boost.polygon ).

Ich versuche, eine Delaunay-Triangulation zu finden, die jedes Zellzentrum für jede Voronoï-Kante verbindet, aber ich vermisse einige Kanten.

In der folgenden Abbildung sind die roten Punkte meine Anfangspunkte, die blauen Linien die Voronoï-Kanten (ich habe unendliche Kanten ignoriert) und die grünen Linien die Triangulationskanten (eine grüne Kante für jede blaue Kante, die zwei Zellursprünge verbindet).

Wir können sehen, dass diagonale Kanten fehlen. Was vermisse ich?

Voronoi-Diagramm

Antworten:


19

Der Mittelpunkt in Ihrem Diagramm ist eine entartete Kante des Voronoi-Diagramms. Wenn Sie ein Voronoi-Diagramm für eine unregelmäßige Punktwolke erstellen, hat jeder Scheitelpunkt Grad 3. Ein Scheitelpunkt mit Grad 4 (oder mehr) kann nur auftreten, wenn zwei (oder mehr) Scheitelpunkte zusammenfallen. Das bedeutet, dass sich zwischen ihnen eine Kante mit der Länge Null befindet. Diese Kante sollte jedoch immer noch eine entsprechende Kante in der Delaunay-Triangulation haben. Das Problem ist, dass es beliebig ist, welche der beiden möglichen Kanten Sie auswählen, da der Kante mit der Länge Null keine Richtung zugeordnet ist.

Um zu veranschaulichen, wovon ich spreche, sollten Sie mit vier Punkten beginnen, die weniger regelmäßig voneinander entfernt sind (so dass wir nur mit Eckpunkten 3. Grades beginnen) und diese schrittweise in ihre regulären Positionen übersetzen.

Wir können dies auf zwei verschiedene Arten tun, die beide zu dem entarteten Fall in Ihrem Diagramm führen. Sie werden feststellen, dass Sie am Ende zwei verschiedene Delaunay-Triangulationen haben, die beide gültige Grenzen für den entarteten Fall sind:

Bildbeschreibung hier eingebenBildbeschreibung hier eingeben

Ich gehe davon aus, dass in Ihrem Code dieser degenerierte Fall aus dem einen oder anderen Grund fehlt, aber ohne zu sehen, wie Sie die Delaunay-Triangulation aus dem Voronoi-Diagramm berechnen, ist es unmöglich, Sie weiter zu führen.

Beachten Sie auch, dass noch höhere Entartungen (durch mehr als vier Punkte, die in gleichen Winkeln um einen Kreis verteilt sind) möglicherweise zusätzliche Aufmerksamkeit erfordern:

Bildbeschreibung hier eingebenBildbeschreibung hier eingeben

Diese Animationen zeigen auch, dass sich (auch in einem nicht entarteten Fall) die entsprechenden Kanten von Voronoi und Delaunay nicht notwendigerweise tatsächlich in ihrer endlichen Ausdehnung kreuzen. Das könnte es schwieriger machen zu sehen, dass die 2 (oder 3) Kanten, die das reguläre Polygon am Ende triangulieren, tatsächlich mehreren degenerierten Kanten entsprechen, die sich alle in der Mitte befinden. Beachten Sie auch, dass es insgesamt 5 verschiedene Triangulationen des Fünfecks und 14 Triangulationen des Sechsecks gibt (obwohl ich nicht weiß, ob alle 14 durch Verformen einer nicht entarteten Triangulation erhalten werden können).

Bearbeiten (nach OP)

Mit Boost.polygon berechnete Voronoi-Diagramme ermöglichen das Durchlaufen jedes Voronoi-Scheitelpunkts und jeder mit diesen Scheitelpunkten verknüpften Kante (im oder gegen den Uhrzeigersinn). Auf diese Weise ist es möglich, für jedes Kantenpaar ein Dreieck zu erstellen (zwei verbundene Kanten werden mit 3 Zellen verknüpft).


Sie können auch hier antworten oder ich lösche meine andere Frage.
arthur.sw

3
@ arthur.sw Cross-Posting wird in SE generell nicht empfohlen. Ich nehme an, dass das Löschen dort die bessere Option wäre.
Martin Ender

ein interaktiver voronoï-Diagrammersteller: alexbeutel.com/webgl/voronoi.html
arthur.sw

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.