Von Voronoi-Tessellation zu formschönen Polygonen

7

Aus einer Reihe von Punkten habe ich die Voronoi-Tessellation mit scipy :

%Vor%

Nun möchte ich ein Polygon in Shapely aus den Regionen erstellen, die der Voronoi-Algorithmus erstellt hat. Das Problem besteht darin, dass die Polygon-Klasse eine Liste von Scheitelpunkten gegen den Uhrzeigersinn benötigt. Obwohl ich weiß, wie man diese Scheitelpunkte kann ich das Problem nicht lösen, weil das oft mein Ergebnis ist:

(überlappendes Polygon) Dies ist der Code (ein zufälliges Beispiel):

%Vor%

Wie kann ich dieses Problem lösen?

    
marcodena 18.12.2014, 14:03
quelle

3 Antworten

20

Wenn Sie gerade hinter einer Sammlung von Polygonen sind, müssen Sie den Punkt nicht vorbestellen, um sie zu erstellen.

Das scipy.spatial.Voronoi -Objekt hat ein ridge_vertices -Attribut, das Indizes von Scheitelpunkten enthält, die die Linien des Voronoi-Grats bilden. Wenn der Index -1 ist, geht der Grat in die Unendlichkeit.

Beginnen Sie zuerst mit einigen zufälligen Punkten, um das Voronoi-Objekt zu erstellen.

%Vor%

Sie können damit eine Sammlung von Shapely LineString-Objekten erstellen.

%Vor%

Das Modul shapely.ops hat eine polygonize , die einen Generator für formschönes Polygon zurückgibt Objekte.

%Vor%

Oder wenn Sie ein einzelnes Polygon wollen, das aus der von der Voronoi-Tesselation eingeschlossenen Region besteht, können Sie die Shapely unary_union -Methode verwenden:

%Vor%

    
om_henners 30.12.2014, 09:48
quelle
2

Wie andere bereits gesagt haben, liegt es daran, dass Sie die Polygone anhand der resultierenden Punkte anhand von Indizes korrekt neu erstellen müssen. Obwohl Sie die Lösung haben, ich dachte, ich sollte erwähnen, es gibt auch eine andere Pypi unterstützt Tesselation-Paket namens Gräfin (Disclaimer: Ich bin der Paketbetreuer), wo die Voronoi-Funktion die Voronoi-Polygone zurückgibt, die vollständig für dich erstellt wurden.

    
Karim Bahgat 25.06.2015 20:39
quelle
0

Die von Ihnen implementierte Funktion (order_vertices ()) kann in Ihrem Fall nicht funktionieren, da sie einfach eine bereits geordnete Folge von Koordinaten benötigt, die ein Rechteck bildet und die Richtung des Polygons umkehrt (und möglicherweise nur mit Rechtecken funktioniert). ..). Aber Sie haben eine nicht geordnete Folge von Koordinaten

Im Allgemeinen können Sie kein Polygon aus einer beliebigen Folge nicht geordneter Scheitelpunkte erstellen, da es keine eindeutige Lösung für konkave Polygone gibt, wie in diesem Beispiel gezeigt: Ссылка

Wenn Sie jedoch sicher sind, dass Ihre Polygone immer konvex sind, können Sie mit diesem Code eine konvexe Hülle erstellen: Ссылка (im Moment getestet, hat es für mich funktioniert)

Wahrscheinlich kannst du die konvexe Hülle auch mit scipy bauen, aber ich teste es nicht: scipy.spatial.ConvexHull

    
Tommaso Di Bucchianico 22.12.2014 11:48
quelle

Tags und Links