Comment calculer des squelettes droits en utilisant Python?


12

Existe-t-il un package Python qui fournit une implémentation d'un algorithme Straight Skeleton?

Je suis conscient que le projet open source (C ++) CGAL contient une implémentation mais il semble que cgal-bindings n'inclut pas ce package CGAL .

Dans tous les cas, je préférerais une implémentation Python pure que je pourrais modifier / étendre en fonction de mes besoins.

Bien qu'une implémentation capable de gérer des polygones avec des trous soit préférable, elle n'est pas strictement nécessaire.


1
Avez-vous testé pySkeleton ou Skeletron ?
Farid Cheraghi

J'ai essayé pySkeleton. L'application GUI n'a pas fonctionné pour moi et je n'ai pas encore trouvé le temps de vérifier si le code est récupérable
underdark

importer les sommets des polygones = [(0,0), (0,5), (5,5), (5,0)] arêtes = [(0,1), (1,2), (2,3), (3,0)] p = polygon.Polygon (sommets, bords) skeleton_graph = p.straight_skeleton () __________________________________________________ Lors de l'exécution ci-dessus, j'ai l'erreur suivante: _________ Traceback (dernier appel en date): Fichier "C: \ pySkeleton \ pySkeleton \ test.py ", ligne 6, dans <module> p = polygon.Polygon (sommets, bords) Fichier" C: \ pySkeleton \ pySkeleton \ polygon.py ", ligne 44, dans init self.vertices = map (Point, vertices) TypeError: __init __ () prend exactement 3 arguments (2 donnés)
ramesh

Réponses:


6

Vous pouvez peut-être modifier pySkeleton d'Olivier Teboul selon vos besoins.

Je n'ai pas eu la chance de regarder le code réel mais d'après ce qu'il dit, ce devrait être du pur Python .


3

Vous pouvez utiliser pySkeleton comme suit:

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

Vous obtenez un objet graphique avec nœuds et arcs, auquel vous pouvez accéder simplement en:

nodes = skeleton_graph.nodes
arcs = skeleton_graph.arcs

Comme il est dit dans le fichier readme.txt de pySkeleton, les sommets des polygones doivent être dans le sens des aiguilles d'une montre. Pour les trous dans le polygone, les sommets doivent être dans le sens antihoraire.

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

Remarque: pour les polygones plus complexes avec plus de 100 sommets et arêtes, pySkeleton est incroyablement lent. En plus de cela, je reçois des résultats étranges pour certains polygones. Je suppose que cela ne fonctionne pas correctement dans tous les cas.

Un gros merci à Olivier Teboul pour cette bibliothèque.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.