Ich habe folgendes Problem: Ich habe eine Box voller Punkte mit einer bestimmten unbekannten Verteilung und möchte das Voronoï-Diagramm berechnen. Das Problem ist, dass die Anzahl der Punkte so groß ist, dass dies für die vollständige Verteilung möglicherweise nicht möglich ist.
Daher habe ich geplant, dies nur für eine Region innerhalb der Box zu tun, in der die Anzahl der Punkte nicht so groß war. Dazu muss ich wissen, wie der minimale Bereich berechnet wird, der sich auf das Voronoi-Diagramm eines bestimmten kleineren Bereichs in diesem Feld auswirken kann.
Mit anderen Worten, ich möchte das Voronoï-Diagramm der Punkte innerhalb des kleinen Würfels der folgenden Abbildung berechnen, das zum Voronoï-Diagramm passt, in dem die Punkte der vollständigen Box das kleinstmögliche Voronoï-Diagramm im Speicher speichern.
quelle
Antworten:
Um das Voronoi-Diagramm von riesigen (> 100 Millionen) Punktmengen zu berechnen, können Sie den folgenden Algorithmus verwenden:
Der Algorithmus wird mit weiteren Details in meinem Artikel erklärt . Es kann trivial parallelisiert werden (fügen Sie einfach "#pragma omp parallel for" vor der Hauptschleife hinzu), da keine Datenabhängigkeit besteht. Es ist in meiner GEOGRAM C ++ - Programmierbibliothek implementiert (zusammen mit einem speichereffizienten Kd-Tree, der auf mehr als 100 Millionen Punkte skaliert). Beachten Sie, dass es in GEOGRAM auch eine parallele Standard-Delaunay / Voronoi-Implementierung gibt, die mit bis zu 100 Millionen Standorten gut funktioniert.
In Bezug auf parallele Umsetzung des klassischen (Boywer-Watson) Algorithmus wird die Geogramm Implementierung dokumentiert hier (siehe auch die dazugehörige c ++ Quelldatei , die umfangreichen Kommentare hat). Ich habe keinen veröffentlichten Artikel darüber, ich werde einen schreiben, wenn es die Zeit erlaubt. Die Hauptidee besteht darin, Spinlocks zu verwenden, die den Tetraedern zugeordnet sind, um sicherzustellen, dass nur ein einzelner Faden ein Tetraeder modifizieren kann.
quelle
Scheint, als würden die Experten Ihre Frage nicht beantworten, also werde ich versuchen, eine Idee zu liefern. Aber bevor ich das tue, empfehle ich dringend, dass Sie in der Literatur nach einigen hoch entwickelten Methoden suchen, die bereits entwickelt wurden. Ohne jedoch zu garantieren, dass dies ein guter, schneller oder effizienter Vorschlag ist, schlage ich die folgende Methodik vor. Denken Sie daran, dass ich möglicherweise einige Fehler gemacht habe, daher kann ich nicht garantieren, dass alles vollständig korrekt ist, aber ich hoffe, dass die Idee der Methode Ihnen einen Ansatz bietet, der Ihnen bei der Lösung Ihres Problems hilft.
Sei die Menge deiner Punkte im ganzen "großen" Würfel. Fix Ihre „kleine“ Würfel C irgendwo in den großen Würfeln und lassen V C die Menge der Punkte, die in enthalten sind , C , dh V C = V ∩ C . Anfangs wird V ' C = V C gesetzt .V. C. V.C. C. V.C.= V.∩ C.. V.'C.= V.C.
Schritt 1: Erzeugen Sie das Voronoi-Diagramm . Für jeden Punkt bezeichnet v ∈ V ′ C mit V o r ( v ) seine Voronoi-Zelle, die ein konvexes Polyeder im Dreiraum ist. Weiterhin bezeichnen mit W ( v ) die Eckpunkte der Voronoi-Zelle, die bei v ∈ V ′ C zentriert sind , und mit W ( V ′ C ) = ∪ v ∈ V ′V.o r ( V.'C.) v ∈ V.'C. V.o r ( v ) W.( v ) v ∈ V.'C. die Eckpunkte aller Voronoi-Zellen aus dem Voronoi-DiagrammVor(V′C).W.( V.'C.) = ∪v ∈ V.'C.W.( v ) V.o r ( V.'C.)
Schritt 2: Färben Sie alle Punkte von und alle Voronoi-Eckpunkte W ( V ' C ) weiß.V.'C. W.( V.'C.)
Schritt 3: Zeichnen Sie für jeden Voronoi-Scheitelpunkt die bei w zentrierte Delaunay-Kugel, dh die Kugel mit dem Mittelpunkt w und dem Radius, dem Abstand zwischen w und einem der Punkte von V ′ C, dessen Voronoi-Zelle w hat als Scheitelpunkt (egal welcher Punkt, es gibt mehrere, aber das Ergebnis ist immer das gleiche).w ∈ W.( V.'C.) w w w V.'C. w
Fall 3.1. Wenn die Delaunay-Kugel von im Würfel C enthalten ist , färben Sie w schwarz.w C. w
Fall 3.2. Wenn die Delaunay-Kugel nicht im Würfel enthalten ist, aber keinen Punkt von V in ihrem (offenen) Inneren enthält, färben Sie den Punkt w schwarz.C. V. w
Fall 3.3. Wenn die Delaunay-Kugel von Punkte von V in ihrem (offenen) Inneren enthält, (1) addiere die Punkte von V, die im Inneren der Kugel enthalten sind, zur Menge V ' C und (2) halte die Farbe des Punktes w weiß .w V. V. V.'C. w
Schritt 4: Überprüfen Sie für jeden Punkt , ob alle Voronoi-Eckpunkte W ( v ) seiner Vornoi-Zelle schwarz sind. Wenn nicht alle schwarz sind, behalten Sie die Farbe v weiß bei. Wenn sie schwarz sind, färben Sie v schwarz.v ∈ V.'C. W.( v ) v v
Schritt 5: Überprüfen Sie, ob alle Punkte des Originalsatzes schwarz sind.V.C.
Fall 5.1. Wenn sie alle schwarz sind, ist das auf den Würfel C beschränkte Voronoi-Diagramm der lokale Teil des auf C beschränkten globalen Voronoi-Diagramms V o r ( V ) . Ende.V.o r ( V.'C.) C. V.o r ( V.) C.
Fall 5.2. Wenn es in weiße Eckpunkte gibt , kehren Sie zu Schritt 1 zurück. In Schritt 1 werden beim Erzeugen des neuen Voronoi-Diagramms V o r ( V ' C ) die Voronoi-Zellen um schwarze Punkte von V ' C gleich gehalten. Hält alle schwarzen Voronoi-Eckpunkte von W ( V ′ C ) fern und ändert sich nur in Bezug auf die weißen.V.C. V.o r ( V.'C.) V.'C. W.( V.'C.)
Ich hoffe das hilft.
quelle
Der einfachste Weg, dies zu tun, besteht darin, Ihre Iner-Box mit einer größeren Box zu umgeben, die mindestens alle nächsten Nachbarn der Punkte in Ihrer inneren Box enthält. Beachten Sie, dass ein Problem auftritt, wenn sich das innere Feld nahe am Rand des umfassenden Datenfelds befindet: Sie haben keine externen Punkte.
Die Berechnung einer Voronoi / Delaunay-Tessellation kann subtiler sein, als Sie vielleicht denken. Eine der Fragen ist, wie genau entschieden werden kann, ob sich ein Punkt auf der einen oder anderen Seite einer Tessellationsebene / -linie befindet.
Unter http://www.cgal.org/ finden Sie hierfür die sehr vollständige "CGAL" C ++ - Bibliothek . Meine Kollegen und ich haben dies in mehreren veröffentlichten Artikeln zur Astrophysik verwendet: Es scheint absolut solide zu sein, um alle potenziellen Fallstricke bei der Erstellung dieser Tessellationen anzugehen.
quelle
Ich verstehe Ihre Frage wie folgt: Ich möchte ein Voronoi-Diagramm für eine Teilmenge von Punkten so zeichnen, dass es dem entspricht, das bei Betrachtung der vollständigen Menge von Punkten erhalten wird. Voronoi-Diagramme werden gezeichnet, indem zuerst benachbarte Punkte verbunden werden und dann eine Ebene senkrecht zur Linie am Mittelpunkt gezeichnet wird. Sie tun dies für alle nächsten Nachbarn und haben ein Voronoi-Diagramm in der Nähe eines Punktes. Tun Sie dies für alle Punkte und Sie haben ein Voronoi-Diagramm für alle Punkte. Sie sehen, Voronoi-Diagramme werden lokal definiert. Es gibt keinen Effekt für den zweitnächsten Nachbarn oder den drittnächsten Nachbarn. Nur erster nächster Nachbarschaftseffekt. Alles, was Sie tun müssen, um ein Voronoi-Diagramm mit einer Teilmenge von Punkten zu erhalten, ist, die Punkte in der interessierenden Teilregion zu identifizieren und sie mit allen ihren nächsten Nachbarn zu verbinden. und zeichnen Sie eine Ebene, die durch Mittelpunkte dieses Liniensegments und senkrecht zum Liniensegment verläuft. Dieses Diagramm ist für eine lokale Region gleich, unabhängig davon, ob Sie eine Unterregion oder eine vollständige Region betrachten.
quelle
Ich empfehle Ihnen einen visuellen und intuitiven Ansatz mit Grasshopper für Rhinoceros3D. Obwohl Rhinoceros ein kommerzielles CAD-Paket und Grasshopper ein Plugin dafür ist, können Sie Plugins ohne Einschränkungen kostenlos ausführen und Ihre Experimente durchführen (nicht lizenziertes Rhino3D beschränkt nur das Speichern von Rhino-Dateien). Grasshopper enthält eine große Anzahl mathematischer Funktionen, die in einer Leinwand verwendet werden, und 3D-Voronoi-Diagramme sind eine davon.
quelle