Hai trovato la linea centrale del tunnel?


19

Ho alcuni file cartografici costituiti da "polilinee" (ogni riga è solo un elenco di vertici) che rappresentano i tunnel e voglio provare a trovare la "linea centrale" del tunnel (mostrata approssimativamente in rosso sotto).

testo alternativo

Ho avuto qualche successo in passato usando la triangolazione di Delaunay ma mi piacerebbe evitare quel metodo in quanto non consente (in generale) una modifica facile / frequente dei miei dati cartografici.

Qualche idea su come potrei essere in grado di farlo?

Sto lavorando in C ++ abbastanza grezzo.


gis.stackexchange.com/q/177/162 si occupa anche di ciò che stai cercando: algoritmi di scheletrazione .
luglio

3
Credo che il legame croce con SO è rilevante dal momento che ci sono risposte anche lì stackoverflow.com/questions/3983613/find-tunnel-center-line
Dr. Belisario

@julien: l'hai già collegato nella tua risposta. L'ho letto, ma non risponde alla mia domanda specifica (che, per riformulare, è: 'So già come trovare il MAT - ma mi chiedo se qualcuno conosce un algoritmo non Delaunay [cioè non una lib - il problema non è il mio codice;)] che è efficiente per le modifiche localizzate '). C'è stata anche una risposta su SO che non ha risposto del tutto, ma ha fatto molti sforzi e mi ha dato molte cose su cui riflettere, quindi ho assegnato il controllo a quel ragazzo fino a quando qualcosa di meglio non fosse arrivato. Nessuna delle risposte qui sotto è così buona (che potrebbe essere colpa mia).
sje397,

Risposte:


6

Hai disegnato una buona approssimazione alla Trasformazione dell'asse mediale. La triangolazione Delaunay offre davvero un buon approccio ad esso. (La sfida principale è che parti del MAT sono pezzi di parabole, non solo segmenti di linea.)

Ho trovato riferimenti al codice di lavoro (di solito in C / C ++ ricordo) nella letteratura accademica. Fai una ricerca su Google Scholar e cerca documenti più vecchi (i più recenti sembrano concentrarsi sui calcoli 3D).


Ho un po 'di codice funzionante, usando Delaunay. Sto davvero chiedendo se ci sono altri modi.
sje397,

1
@ sje397 Prima di tutto, Delaunay risolve solo approssimativamente il problema, quindi solo per questo motivo vale la pena ricercare un codice migliore. Secondo, ci sono davvero altri modi. Ne posso delineare due brevemente: (1) ricerca del MAT mediante buffer interni e (2) analisi del terreno sulla griglia della distanza euclidea delle polilinee. Non ho menzionato neanche perché entrambi sono molto più inefficienti e producono risultati più scarsi. Concepibilmente il secondo metodo è suscettibile di una soluzione dinamica ragionevolmente veloce.
whuber

4

Potrebbe valere la pena esaminare "scheletri poligonali".

C'è qualche esempio di sorgente C ++ su http://www.cgal.org/Manual/3.2/doc_html/cgal_manual/Straight_skeleton_2/Chapter_main.html


Grazie underdark. Esaminerò ulteriormente la CGAL. Ma il requisito che il ricalcolo non è costoso quando cambiano i miei dati della mappa è la difficoltà.
sje397,

CGAL è abbastanza veloce - dovrebbe essere possibile un calcolo al volo. Altrimenti, potresti dare un'occhiata alle cosiddette "strutture di dati cinetici": cgal.org/Manual/3.3/doc_html/cgal_manual/…
julien

Lo "scheletro" è un altro termine per il MAT. La ricerca di "trasformazione dell'asse mediale" ha prodotto risultati migliori e migliori rispetto alle ricerche su "scheletro" nella mia esperienza.
whuber

"scheletro" sembra più generico - MAT è solo un algoritmo specifico per scheletro, giusto? Qualunque cosa, non è l'argomento ...!
luglio

La licenza per CGAL sembra restrittiva (molto costosa: si tratta di software commerciale).
sje397,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.