#java #algorithm #geometry #polygon #computational-geometry
#java #алгоритм #геометрия #полигон #вычислительная геометрия
Вопрос:
У меня есть в качестве входных данных 2D-многоугольник с отверстиями, и мне нужно найти его прямой скелет, как на картинке:
(источник: cgal.org)
Может быть, для этого есть хорошая библиотека Java?
И если нет, можете ли вы указать мне на хорошее объяснение алгоритма, чтобы я мог реализовать его сам? (Я не нашел хороших ресурсов в Google)
Ответ №1:
Я написал это некоторое время назад. Не уверен, достаточно ли он надежен. https://github.com/twak/campskeleton
(отредактировано в 2018 году …)
Комментарии:
1. Хороший вариант. Но я заметил ошибку — иногда кажется, что скелет пропускает сегмент.
2. Я поиграл с вашей библиотекой, и она великолепна! Теперь мне нужно только найти способ извлечения линий скелета из граней. 🙂
Ответ №2:
Смотрите http://www.sable.mcgill.ca /~dbelan2/roofs/roofs.html который содержит апплет.
Ответ №3:
Возможно, вы сможете использовать JTS Topology Suite. Это очень эффективная библиотека, которую я использовал в ряде проектов — никогда для прямого скелета, но это может быть возможно.
Ответ №4:
Редактировать: Ah. Я вижу, что «прямой скелет» — это технический термин. В статье Википедии упоминается несколько алгоритмов. Вы смотрели на них?
Насколько я понимаю, у вас есть (выпуклый?) многоугольник. Из него вычитается 1 или более (потенциально невыпуклых) многоугольников. Вы хотите превратить результат в набор полигонов без отверстий. Существуют ли дополнительные правила, которые вы пытаетесь применить?
Мне трудно придумать набор правил из примера, который вы предоставили. Внешние полигоны невыпуклые; поэтому не похоже, что вы пытаетесь найти выпуклый набор для представления результата (что является относительно распространенной задачей).
Если бы вы могли использовать разбивку, показанную ниже, алгоритм был бы довольно простым. Можете ли вы уточнить?
Ответ №5:
Могу я спросить вас, какова ваша цель поиска прямого скелета? Это личное или коммерческое? Мне было бы интересно узнать, как вы используете его для решения задач реального времени? У меня есть библиотека Java, которая это делает. Мой алгоритм приведен здесь http://web.stcloudstate.edu/rsarnath/skeleton/definition.htm
Комментарии:
1. Реклама. В моем случае я на самом деле искал способ «утончения» многоугольника. Прямой скелет выглядел хорошо, но слишком медленно — мне нужно было получить эту «центральную линию» для сложных полигонов (состоящих из многих тысяч точек) в режиме реального времени (< 1 секунды) на слабых машинах. Итак, в конце концов, я остановился на создании ограниченной триангуляции многоугольника Делоне и соединении центров треугольников — это дало мне довольно хорошее приближение «центральной линии».