Знаходження центральної лінії тунелю?


19

У мене є декілька файлів карт, що складаються з "поліліній" (кожен рядок - це лише список вершин), що представляють тунелі, і я хочу спробувати знайти "центральну лінію" тунелю (показано, приблизно, червоним кольором внизу).

alt текст

У минулому я мав певний успіх у використанні триангуляції Делоне, але я хотів би уникати цього методу, оскільки він (в цілому) не дозволяє легко / часто змінювати мої дані карт.

Будь-які ідеї, як я міг би це зробити?

Я працюю в досить сирій C ++.


gis.stackexchange.com/q/177/162 також розглядає те, що ви шукаєте: алгоритми скелетизації .
липень

3
Я думаю , що крос зв'язок з SO актуальна , так як там є відповіді там теж stackoverflow.com/questions/3983613/find-tunnel-center-line
Dr. Велизарий

@julien: Ви вже пов’язали це у своїй відповіді. Я прочитав це, але він не відповідає моєму конкретному запитанню (яке, перефразовуючи, таке: "Я вже знаю, як знайти MAT - але мені цікаво, чи хтось знає алгоритм, який не має Делоне [тобто не lib - проблема не в моєму кодуванні;)], що ефективно для локалізованих змін '). Була відповідь на ТАК, яка не зовсім відповіла, але вклала багато зусиль і дала мені багато задуматися, тому я нагородив чеком того хлопця, поки не відбудеться щось краще. Жодна з наведених нижче відповідей не є такою хорошою (що, можливо, я і винен).
sje397

Відповіді:


6

Ви зробили гарне наближення до трансформації медіальної осі. Триангуляція Делоне дійсно пропонує хороший підхід до цього. (Основна проблема полягає в тому, що частини MAT - це фрагменти парабол, а не просто лінійні сегменти.)

Я стикався з посиланнями на робочий код (як правило, на C / C ++, як я пам'ятаю) в академічній літературі. Проведіть пошук у Google Академія та шукайте старіші документи (новіші, здається, зосереджуються на 3D обчисленнях).


У мене є деякий робочий код, використовуючи Delaunay. Я справді запитую, чи є інші способи.
sje397

1
@ sje397 Перш за все, Делоне лише приблизно вирішує проблему, тож саме з цієї причини можна буде вивчити кращий код. По-друге, дійсно є й інші шляхи. Я можу окреслити два стислих: (1) пошук MAT за допомогою внутрішніх буферів і (2) проведення аналізу місцевості на евклідовій сітці відстаней поліліній. Я не згадував ні про те, тому що обидва значно ефективніші та дають гірші результати. Імовірно, другий метод піддається досить швидкому динамічному рішенню.
whuber

4

Можливо, варто заглянути в "багатокутники скелетів".

На сайті http://www.cgal.org/Manual/3.2/doc_html/cgal_manual/Straight_skeleton_2/Chapter_main.html є деякий зразок C ++.


Дякую, підпілля Я загляну далі в CGAL. Але вимога, щоб перерахунок не був дорогим при зміні моїх даних карт, є складністю.
sje397

CGAL досить швидкий - обчислення на ходу повинно бути можливим. В іншому випадку, ви могли б подивитися на так званих кінетичних структур даних ': cgal.org/Manual/3.3/doc_html/cgal_manual / ...
Julien

"Скелет" - ще один термін для MAT. Пошук "перетворення медіальної осі" в моєму досвіді дав більше і кращих результатів, ніж пошук на "скелеті".
whuber

"скелет" здається більш загальним - MAT - це лише один конкретний алгоритм для скелета, правда? Що б там не було, це тема ...!
липень

Ліцензія на CGAL виглядає обмежуючою (тобто дорога - це комерційне програмне забезпечення).
sje397
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.