Setupmetodo veloce per trovare la distanza dal punto più vicino bordo del poligono
- funzione dovrà fornire la distanza da un punto verso il bordo più vicino di un poligono
- Point è conosciuto per essere all'interno della poligono
- poligono può essere concave o convesse
- molti punti (milioni) dovranno essere testati
- Molti poligoni separati (decine) dovrà essere eseguito attraverso la funzione per punto
- Le strutture di dati precalcolate e memorizzate in modo permanente sono un'opzione.
- La funzione di ricerca finale sarà in C++
Per l'implementazione della funzione, so che un metodo semplice potrebbe essere quella di verificare la distanza a tutti i segmenti del poligono con distanza standard per allineare le formule di segmento. Questa opzione sarebbe abbastanza lenta e sono sicuro che dovrebbe esserci un'opzione migliore.
Il mio istinto è che dovrebbero esserci alcuni algoritmi molto veloci per questo tipo di funzione che sarebbero stati implementati in un motore di gioco, ma non sono sicuro di dove cercare.
Ho trovato un riferimento per la memorizzazione di segmenti di linea in un quadruplo, che fornirebbe una ricerca molto rapida e penso che potrebbe essere usato per il mio scopo di restringere rapidamente il segmento da considerare come il segmento più vicino e poi avrebbe solo bisogno di calcolare la distanza di un segmento di linea. https://people.cs.vt.edu/~shaffer/Papers/SametCVPR85.pdf
Non sono stato in grado di individuare alcun esempio di codice per come funzionerebbe. Non mi interessa implementare algoritmi da zero, ma non vedo il punto nel farlo se esiste una base di codice funzionante e testata.
Ho osservato un paio di implementazioni in quad e penso che il modo in cui avrebbe funzionato è creare un quadrifoglio per poligono e inserire i segmenti di ogni poligono con un rettangolo di selezione nel quadrifoglio per quel poligono.
La parte "query" della funzione che vorrei creare consisterebbe nel creare un punto come un riquadro di delimitazione molto piccolo, che verrebbe quindi utilizzato per cercare la struttura quadripre, che quindi troverà solo il più vicino porzioni del poligono.
http://www.codeproject.com/Articles/30535/A-Simple-QuadTree-Implementation-in-C
e
La mia vera domanda sarebbe, Ti sembra un valido approccio per una funzione di tempo di ricerca veloce?
C'è qualcosa che potrebbe funzionare più velocemente?
MODIFICA: Mi sono guardato in giro e ho trovato alcuni problemi con l'utilizzo di un quadrifoglio. Il modo in cui i quadrifori funzionano è utile per il rilevamento delle collisioni, ma non è configurato per consentire una ricerca efficiente del vicino più vicino. https://gamedev.stackexchange.com/questions/14373/in-2d-how-do-i-efficiently-find-the-nearest-object-to-a-point
R-Trees sembrano essere un'opzione migliore. https://en.wikipedia.org/wiki/R-tree
e
efficient way to handle 2d line segments
Sulla base di tali posti, R-alberi sembrano il vincitore. Utile anche per vedere che C++ Boost li ha già implementati. Questo sembra abbastanza vicino a quello che stavo progettando di fare che andrò avanti e implementarlo e verificare i risultati.
Un quad albero sembra avere un problema, si consideri la figura di quattro sulla quarta pagina del PDF. Il quadrante in alto a sinistra è un quadrante 4x4. Se il punto in questione si trova nel quadrante in basso a destra (un pixel in alto ea sinistra del centro della forma), la linea che si troverà sarà nel quadrante in alto a sinistra, che è sbagliato. – Carl
Credo che quello che sto cercando si chiama PMR QuadTree. http://stackoverflow.com/questions/25903180/pmr-quadtree-data-structure-and-algorithm – thaspius
R * Tree, QuadTree, AABB tree sono le cose standard. – Ben