Il problema con un quad / octree nelle ricerche sul vicino più vicino è che l'oggetto più vicino potrebbe trovarsi proprio attraverso la divisione tra i nodi. Per le collisioni, va bene, perché se non è nel nodo, non ci interessa. Ma considera questo esempio 2D con un quadrifoglio:
Qui, anche se l'elemento nero e l'elemento verde si trovano nello stesso nodo, l'elemento nero è il più vicino all'elemento blu. La risposta di ultifinitus può solo garantire al vicino più vicino solo ogni elemento nella tua struttura viene inserito nel nodo più piccolo possibile che potrebbe contenerlo, o in un nodo unico - questo porta a quadricre più inefficienti. (Nota che ci sono molti modi diversi per implementare una struttura che potrebbe essere chiamata quad / octree - implementazioni più rigide potrebbero funzionare meglio in questa applicazione.)
Un'opzione migliore sarebbe un kd-tree . Gli alberi Kd hanno un algoritmo di ricerca del vicino più vicino molto efficiente che puoi implementare e possono contenere qualsiasi numero di dimensioni (quindi dimensioni "k").
Un'animazione fantastica e istruttiva di Wikipedia:
Il problema più grande con l'utilizzo di kd-tree, se ricordo bene, è che sono più difficili da inserire / rimuovere elementi mantenendo l'equilibrio. Pertanto, consiglierei di usare un kd-tree per oggetti statici come case e alberi che è altamente bilanciato, e un altro che contiene giocatori e veicoli, che devono essere bilanciati regolarmente. Trova l'oggetto statico più vicino e l'oggetto mobile più vicino e confronta questi due.
Infine, i kd-tree sono relativamente semplici da implementare e sono sicuro che puoi trovare una moltitudine di librerie C ++ con loro. Da quello che ricordo, gli alberi a R sono molto più complicati e probabilmente eccessivi se tutto ciò che serve è una semplice ricerca del vicino più vicino.