Como calcular esqueletos retos usando Python?

12

Existe um pacote Python que fornece uma implementação de um algoritmo Straight Skeleton?

Estou ciente de que o projeto CGAL de código aberto (C ++) contém uma implementação, mas parece que as ligações cgal não incluem este pacote CGAL .

Em qualquer caso, eu preferiria uma implementação Python pura que pudesse modificar / estender para atender às minhas necessidades.

Embora uma implementação que possa lidar com polígonos com furos seja preferível, isso não é estritamente necessário.

underdark
fonte
1
Você já testou pySkeleton ou Skeletron ?
Farid Cheraghi 4/15
Eu tentei pySkeleton. A aplicação GUI não funcionou para mim e eu não ter encontrado ainda tempo para verificar se o código é aproveitável
Subterrâneo
importar polígonos vértices = [(0,0), (0,5), (5,5), (5,0)] arestas = [(0,1), (1,2), (2,3), (3,0)] p = polygon.Polygon (vértices, arestas) skeleton_graph = p.straight_skeleton () __________________________________________________ Durante a execução acima, recebi o seguinte erro: _________ Traceback (última chamada mais recente): Arquivo "C: \ pySkeleton \ pySkeleton \ test.py ", linha 6, em <module> p = polígono.Polygon (vértices, arestas) Arquivo" C: \ pySkeleton \ pySkeleton \ polygon.py ", linha 44, em init self.vertices = map (Point, vértices) TypeError: __init __ () leva exatamente 3 argumentos (2 dado)
ramesh

Respostas:

6

Talvez você possa modificar o pySkeleton by Olivier Teboul para atender às suas necessidades.

Eu não tive a chance de olhar o código real, mas pelo que ele diz, deveria ser um Python puro .

Kersten
fonte
3

Você pode usar pySkeleton da seguinte maneira:

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

Você obtém um objeto gráfico com nós e arcos, que você pode acessar simplesmente:

nodes = skeleton_graph.nodes
arcs = skeleton_graph.arcs

Como diz o pySkeleton readme.txt, os vértices do polígono precisam estar no sentido horário. Para furos no polígono, os vértices precisam estar no sentido anti-horário.

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

Observação: para polígonos mais complexos, com mais de 100 vértices e arestas, o pySkeleton é invencivelmente lento. Além disso, recebo resultados estranhos para alguns polígonos. Presumo que não funcione corretamente em todos os casos.

No entanto, muito obrigado a Olivier Teboul por esta biblioteca.

poechtma
fonte