Jak obliczyć proste szkielety za pomocą Pythona?

12

Czy istnieje pakiet Python, który zapewnia implementację algorytmu szkieletu prostego?

Wiem, że projekt CGAL typu open source (C ++) zawiera implementację, ale wygląda na to, że wiązania cgal nie zawierają tego pakietu CGAL .

W każdym razie wolałbym czystą implementację Pythona, którą mógłbym zmodyfikować / rozszerzyć, aby dopasować do moich potrzeb.

Chociaż implementacja, która może obsługiwać wielokąty z otworami, byłaby lepsza, nie jest to absolutnie konieczne.

podmrok
źródło
1
Czy testowałeś pySkeleton lub Skeletron ?
Farid Cheraghi
Próbowałem pySkeleton. Aplikacja GUI nie działała dla mnie i nie znalazłem jeszcze czasu na sprawdzenie, czy kod jest możliwy do odzyskania
podmrok
import wierzchołków wielokąta = [(0,0), (0,5), (5,5), (5,0)] krawędzie = [(0,1), (1,2), (2,3), (3,0)] p = polygon.Polygon (wierzchołki, krawędzie) skeleton_graph = p.straight_skeleton () __________________________________________________________ Podczas wykonywania powyżej otrzymałem następujący błąd: _________ Traceback (ostatnie połączenie ostatnio): Plik "C: \ pySkeleton \ pySkeleton \ test.py ", linia 6, w <module> p = polygon.Polygon (wierzchołki, krawędzie) Plik" C: \ pySkeleton \ pySkeleton \ polygon.py ", linia 44, w init self.vertices = map (Point, wierzchołki) TypeError: __init __ () przyjmuje dokładnie 3 argumenty (2 podane)
ramesh

Odpowiedzi:

6

Być może możesz zmodyfikować pySkeleton Oliviera Teboula, aby dostosować go do swoich potrzeb.

Nie miałem okazji przyjrzeć się rzeczywistemu kodowi, ale z tego, co mówi, powinien to być czysty Python .

Kersten
źródło
3

Możesz użyć pySkeleton w następujący sposób:

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

Otrzymujesz obiekt wykresu z węzłami i łukami, do którego możesz uzyskać dostęp po prostu poprzez:

nodes = skeleton_graph.nodes
arcs = skeleton_graph.arcs

Jak napisano w pliku readme.txt pySkeleton, wierzchołki wielokątów muszą być w kolejności zgodnej z ruchem wskazówek zegara. W przypadku otworów w wielokącie wierzchołki muszą być w kolejności przeciwnej do ruchu wskazówek zegara.

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

Uwaga: w przypadku bardziej złożonych wielokątów z ponad 100 wierzchołkami i krawędziami pySkeleton jest niewykonalnie wolny. Poza tym otrzymuję dziwne wyniki dla niektórych wielokątów. Zakładam, że nie działa poprawnie we wszystkich przypadkach.

Niemniej wielkie podziękowania dla Oliviera Teboula za tę bibliotekę.

poechtma
źródło