Ho implementato un QuadTree funzionante. Suddivide lo spazio bidimensionale per accogliere gli oggetti, identificati dal riquadro di delimitazione (x, y, larghezza, altezza) sul quadratino più piccolo possibile (fino a un'area minima).QuadTrees - come aggiornare quando gli elementi interni si stanno muovendo
Il mio codice si basa su questa implementazione (il mio è in Lua invece di C#): http://www.codeproject.com/KB/recipes/QuadTree.aspx
sono stato in grado di implementare con successo inserimenti ed eliminazioni. Ho ora spostato la mia attenzione sulla funzione update(), poiché la posizione e le dimensioni dei miei articoli cambiano nel tempo.
La mia prima implementazione funziona, ma è abbastanza ingenuo:
function QuadTree:update(item)
self:remove(item)
return self.root:insert(item)
end
Yup, ho praticamente rimuovere e reinserire ogni elemento ogni volta che si muovono.
Questo funziona, ma mi piacerebbe ottimizzarlo un po 'di più; dopo tutto, il più delle volte, gli elementi in movimento rimangono sullo stesso nodo QuadTree.
Esiste un modo standard per gestire questo tipo di aggiornamento?
In caso aiuta, il mio codice è qui: https://github.com/kikito/middleclass-ai/blob/master/QuadTree.lua
io non sto cercando qualcuno per la sua attuazione per me; i riferimenti a un'implementazione funzionante esistente (anche in altre lingue) sarebbero sufficienti.
Grazie per la risposta. La geometria viene aggiornata al di fuori del quadruplo: gli oggetti stessi sono incaricati di farlo. Il problema con il tuo esempio è oldNode: contains() - anche se contiene l'elemento, potrebbe essere che il nuovo nodo sia uno dei figli di oldNode; ad esempio, se l'articolo è più piccolo. Sto avendo difficoltà a provare a modellarlo. – kikito
Questo è un buon punto che non ho chiarito: contiene, rimuove e inserisce possono essere implementazioni non ricorsive perché il nodo su cui stanno lavorando è quello corretto cioè lavorano su un nodo, non su un albero anche se lì non è una classe Node distinta.findNode deve lavorare in modo ricorsivo su un albero, è simile a inserire, ma senza fare l'inserto vero e proprio. – richj
Ripensandoci, sarebbe meglio se findNode non dividesse un nodo che è pieno, perché non tutte le chiamate findNode sono seguite da un insert. Ho aggiornato lo pseudo-codice per consentire newNode.insert (item) restituendo un nodo figlio di newNode. – richj