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.