¿Cómo calcular esqueletos rectos usando Python?


12

¿Existe un paquete de Python que proporcione una implementación de un algoritmo de esqueleto recto?

Soy consciente de que el proyecto CGAL de código abierto (C ++) contiene una implementación, pero parece que cgal-bindings no incluye este paquete CGAL .

En cualquier caso, preferiría una implementación pura de Python que podría modificar / ampliar para satisfacer mis necesidades.

Si bien sería preferible una implementación que pueda manejar polígonos con agujeros, no es estrictamente necesario.


1
¿Ha probado pySkeleton o Skeletron ?
Farid Cheraghi

Probé pySkeleton. La aplicación GUI no funcionó para mí y no he encontrado tiempo todavía para comprobar si el código es rescatable
infraoscuridad

importar vértices poligonales = [(0,0), (0,5), (5,5), (5,0)] aristas = [(0,1), (1,2), (2,3), (3,0)] p = polígono. Polígono (vértices, bordes) skeleton_graph = p.straight_skeleton () __________________________________________________ Al ejecutar arriba recibí el siguiente error: _________ Traceback (última llamada última): Archivo "C: \ pySkeleton \ pySkeleton \ test.py ", línea 6, en <module> p = polygon.Polygon (vértices, bordes) Archivo" C: \ pySkeleton \ pySkeleton \ polygon.py ", línea 44, en init self.vertices = map (Point, vértices) TypeError: __init __ () toma exactamente 3 argumentos (2 dados)
ramesh

Respuestas:


6

Tal vez pueda modificar pySkeleton por Olivier Teboul para satisfacer sus necesidades.

No he tenido la oportunidad de ver el código real, pero por lo que dice, debería ser Python puro .


3

Puede usar pySkeleton de la siguiente manera:

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()

Obtiene un objeto gráfico con nodos y arcos, al que puede acceder simplemente mediante:

nodes = skeleton_graph.nodes
arcs = skeleton_graph.arcs

Como dice en pySkeleton readme.txt, los vértices de los polígonos deben estar en el orden de las agujas del reloj. Para los agujeros dentro del polígono, los vértices deben estar en el sentido contrario a las agujas del reloj.

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

Observación: Para polígonos más complejos con más de 100 vértices y bordes, pySkeleton es inviablemente lento. Además de eso, recibo resultados extraños para algunos polígonos. Supongo que no funciona correctamente en todos los casos.

Sin embargo, muchas gracias a Olivier Teboul por esta biblioteca.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.