Как вычислить прямые скелеты с помощью Python?


12

Есть ли пакет Python, который обеспечивает реализацию алгоритма прямого скелета?

Я знаю, что проект CGAL с открытым исходным кодом (C ++) содержит реализацию, но кажется, что cgal-bindings не включает этот пакет CGAL .

В любом случае, я бы предпочел чистую реализацию Python, которую я мог бы модифицировать / расширить в соответствии со своими потребностями.

Хотя реализация, которая может обрабатывать полигоны с отверстиями, была бы предпочтительнее, это не является строго обязательным.


1
Вы тестировали pySkeleton или Skeletron ?
Фарид Чераги

Я попробовал pySkeleton. Приложение с графическим интерфейсом не работает для меня, и я еще не
удосужился

импортировать вершины многоугольника = [(0,0), (0,5), (5,5), (5,0)] ребер = [(0,1), (1,2), (2,3), (3,0)] p = polygon.Polygon (вершины, ребра) skeleton_graph = p.straight_skeleton () __________________________________________________ При выполнении выше я получил следующую ошибку: _________ Traceback (последний вызов был последним): Файл "C: \ pySkeleton \ pySkeleton \ test.py ", строка 6, в <module> p = polygon.Polygon (вершины, ребра) Файл" C: \ pySkeleton \ pySkeleton \ polygon.py ", строка 44, в init self.vertices = map (Point, вершины) TypeError: __init __ () принимает ровно 3 аргумента (2 дано)
ramesh

Ответы:


6

Возможно, вы можете изменить pySkeleton от Olivier Teboul в соответствии с вашими потребностями.

У меня не было возможности взглянуть на реальный код, но он говорит, что это должен быть чистый Python .


3

Вы можете использовать pySkeleton следующим образом:

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

Вы получаете Граф-объект с узлами и дугами, к которому вы можете получить доступ просто:

nodes = skeleton_graph.nodes
arcs = skeleton_graph.arcs

Как сказано в pySkeleton readme.txt, вершины многоугольника должны располагаться по часовой стрелке. Для отверстий внутри многоугольника вершины должны быть расположены по часовой стрелке.

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

Примечание: для более сложных полигонов с более чем 100 вершинами и ребрами pySkeleton неоправданно медленен. Кроме того, я получаю странные результаты для некоторых полигонов. Я предполагаю, что это не работает правильно во всех случаях.

Тем не менее, большое спасибо Оливье Тебулу за эту библиотеку.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.