Attualmente sto scrivendo un KDTree per un motore fisico (progetto Hobby).KDTree Splitting
Il KDTree non contiene punti. Invece contiene le caselle di delimitazione Alge allineate che legano i diversi oggetti nell'ambiente.
Il mio problema è decidere come suddividere i nodi KDTree quando si riempiono. Sto provando 2 metodi:
Metodo 1: dividere sempre il nodo esattamente a metà sull'asse maggiore.
- Questo ha il vantaggio di un albero abbastanza uniformemente distanziato.
- Grande svantaggio: se gli oggetti sono concentrati in una piccola area del nodo, verranno create sottodivisioni ridondanti. Questo perché tutti i volumi sono divisi esattamente a metà.
Metodo 2: trova l'area del nodo che contiene oggetti. Dividi il nodo sul piano che divide quell'area a metà del suo asse maggiore. Esempio: se tutti gli oggetti sono concentrati sul fondo del nodo, questo si divide in lunghezza, dividendo così il fondo in due.
- Questo risolve il problema con il metodo sopra
- Quando indicizzazione qualcosa che esiste sullo stesso piano (terreno per esempio), crea nodi lunghe e strette. Se devo aggiungere successivamente altri oggetti che non si trovano sullo stesso piano, questi nodi allungati forniscono indicizzazione molto scarsa.
Quindi quello che sto cercando qui è un modo migliore per dividere il mio nodo KD-Tree. Considerando che questo sarà un motore fisico, la decisione deve essere abbastanza semplice da essere eseguita in tempo reale.
La carta SAH "cintata" che hai menzionato potrebbe essere "Costruzione kd-tree veloce con un'euristica limitata con errori adattivi" di Hunt, Mark e Stoll. L'idea centrale in questo articolo è di usare approssimazioni a tratti quadratiche alla vera funzione SAH campionandola in modo intelligente. Nella mia esperienza, è un algoritmo veloce ed efficace. – vedantk
Sì, sembra quello. – celion