Come calcolare Straight Skeletons usando Python?


12

Esiste un pacchetto Python che fornisce un'implementazione di un algoritmo Straight Skeleton?

Sono consapevole che il progetto CGAL open source (C ++) contiene un'implementazione ma sembra che cgal-bindings non includa questo pacchetto CGAL .

In ogni caso, preferirei un'implementazione Python pura che potrei modificare / estendere in base alle mie esigenze.

Mentre un'implementazione in grado di gestire poligoni con fori sarebbe preferibile, non è strettamente necessaria.


1
Hai provato pySkeleton o Skeletron ?
Farid Cheraghi,

Ho provato pySkeleton. L'applicazione GUI non ha funzionato per me e non ho ancora trovato il tempo per verificare se il codice è recuperabile
underdark

importazione vertici poligonali = [(0,0), (0,5), (5,5), (5,0)] bordi = [(0,1), (1,2), (2,3), (3,0)] p = polygon.Polygon (vertici, spigoli) skeleton_graph = p.straight_skeleton () __________________________________________________ Durante l'esecuzione sopra ho ricevuto il seguente errore: _________ Traceback (ultima chiamata più recente): File "C: \ pySkeleton \ pySkeleton \ test.py ", riga 6, in <modulo> p = polygon.Polygon (vertici, bordi) File" C: \ pySkeleton \ pySkeleton \ polygon.py ", riga 44, in init self.vertices = map (Point, vertici) TypeError: __init __ () accetta esattamente 3 argomenti (2 dati)
ramesh

Risposte:


6

Forse puoi modificare pySkeleton di Olivier Teboul in base alle tue esigenze.

Non ho avuto la possibilità di guardare il codice reale, ma da quello che dice dovrebbe essere puro Python .


3

È possibile utilizzare pySkeleton come segue:

from pySkeleton import polygon

vertices = [(0,0), (0,5), (5,5), (5,0)]
edges = [(0,1), (1,2), (2,3), (3,0)]

p = polygon.Polygon(vertices, edges)
skeleton_graph = p.straight_skeleton()

Ottieni un oggetto grafico con nodi e archi, a cui puoi accedere semplicemente:

nodes = skeleton_graph.nodes
arcs = skeleton_graph.arcs

Come dice nel readme.txt di pySkeleton, i vertici poligonali devono essere in senso orario. Per i buchi all'interno del poligono, i vertici devono essere in senso antiorario.

vertices = [(25.0, 15.0), (45.0, 15.0), (45.0, 35.0), (25.0, 35.0), # polygon
            (30.0, 20.0), (30.0, 30.0), (40.0, 30.0), (40.0, 20.0)] # hole in polygon

edges = [(0, 1), (1, 2), (2, 3), (3, 0), # polygon
         (4, 5), (5, 6), (6, 7), (7, 4)] # hole in polygon

Nota: per poligoni più complessi con oltre 100 vertici e bordi pySkeleton è incredibilmente lento. Oltre a ciò ricevo strani risultati per alcuni poligoni. Presumo che non funzioni correttamente in tutti i casi.

Tuttavia, un grande grazie a Olivier Teboul per questa biblioteca.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.