Znalezienie linii środkowej tunelu?


19

Mam kilka plików map składających się z „polilinii” (każda linia jest tylko listą wierzchołków) reprezentujących tunele i chcę spróbować znaleźć „środkową linię” tunelu (z grubsza zaznaczoną na czerwono poniżej).

alternatywny tekst

W przeszłości miałem pewien sukces przy użyciu triangulacji Delaunaya, ale chciałbym uniknąć tej metody, ponieważ (ogólnie) nie pozwala ona na łatwą / częstą modyfikację moich danych mapy.

Jakieś pomysły na to, jak mogę to zrobić?

Pracuję w dość surowym C ++.


gis.stackexchange.com/q/177/162 zajmuje się także tym, czego szukasz: algorytmami szkieletowania .
Julien

3
Myślę, że połączenie krzyżowe z SO jest istotne, ponieważ są tam również odpowiedzi stackoverflow.com/questions/3983613/find-tunnel-center-line
Dr. belisarius

@julien: Podałeś już to w swojej odpowiedzi. Przeczytałem to, ale nie odpowiada na moje konkretne pytanie (które, inaczej mówiąc, brzmi: „Wiem już, jak znaleźć MAT - ale zastanawiam się, czy ktoś zna algorytm inny niż Delaunay [tj. Nie lib - problemem nie jest moje kodowanie;)], które jest wydajne dla zlokalizowanych zmian '). Na SO było odpowiedź, która nie do końca odpowiadała, ale wymagała wiele wysiłku i dała mi wiele do przemyślenia, więc wystawiłem czek temu facetowi, dopóki nie pojawi się coś lepszego. Żadna z poniższych odpowiedzi nie jest tak dobra (co może być moją winą).
sje397,

Odpowiedzi:


6

Zrobiłeś dobre przybliżenie do transformacji osi środkowej. Triangulacja Delaunaya rzeczywiście oferuje do niej dobre podejście. (Głównym wyzwaniem jest to, że części MAT to fragmenty paraboli, a nie tylko odcinki linii).

W literaturze akademickiej natknąłem się na odniesienia do działającego kodu (zwykle w C / C ++, które pamiętam). Wyszukaj w Google Scholar i poszukaj starszych artykułów (wydaje się, że nowsze koncentrują się na obliczeniach 3D).


Mam trochę działającego kodu, używając Delaunay. Naprawdę pytam, czy istnieją inne sposoby.
sje397

1
@ sje397 Po pierwsze, Delaunay rozwiązuje problem tylko w przybliżeniu, dlatego tylko z tego powodu warto poszukać lepszego kodu. Po drugie, istnieją rzeczywiście inne sposoby. Mogę krótko zarysować dwa: (1) poszukiwanie MAT za pomocą wewnętrznych buforów i (2) przeprowadzić analizę terenu na siatce odległości euklidesowej polilinii. Nie wspomniałem też o tym, ponieważ oba są znacznie bardziej nieefektywne i dają gorsze wyniki. Można sobie wyobrazić, że drugi sposób można zastosować do dość szybkiego rozwiązania dynamicznego.
whuber

4

Warto spojrzeć na „szkielety wielokątów”.

Próbka źródła C ++ znajduje się na stronie http://www.cgal.org/Manual/3.2/doc_html/cgal_manual/Straight_skeleton_2/Chapter_main.html


Dzięki podmrok. Przyjrzę się bliżej CGAL. Ale trudność polega na tym, że ponowne obliczanie nie jest drogie, gdy zmieniają się moje dane mapy.
sje397

CGAL jest dość szybki - obliczenia w locie powinny być możliwe. W przeciwnym razie, można spojrzeć na tak zwanych struktur danych kinetycznych ': cgal.org/Manual/3.3/doc_html/cgal_manual/...
julien

„Szkielet” to kolejny termin na MAT. Wyszukiwanie „transformacji osi środkowej” przyniosło więcej i więcej trafień niż wyszukiwanie „szkieletu” z mojego doświadczenia.
whuber

„szkielet” wydaje się bardziej ogólny - MAT jest tylko jednym specyficznym algorytmem dla szkieletu, prawda? Cokolwiek, to nie jest temat ...!
Julien

Licencja na CGAL wygląda na restrykcyjną (tj. Drogie - jest to oprogramowanie komercyjne).
sje397
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.