Sto implementando un quadtree. Per coloro che non conoscono questa struttura di dati, includo la seguente piccola descrizione:
Un Quadtree è una struttura di dati ed è sul piano euclideo ciò che un Octree è in uno spazio tridimensionale. Un uso comune dei quadrifici è l'indicizzazione spaziale.
Per riassumere come funzionano, un quadtree è una raccolta - diciamo dei rettangoli qui - con una capacità massima e un riquadro di delimitazione iniziale. Quando si tenta di inserire un elemento in un quadrifoglio che ha raggiunto la sua capacità massima, il quadrifoglio viene suddiviso in 4 quadrifogli (una rappresentazione geometrica della quale avrà un'area quattro volte più piccola rispetto all'albero prima dell'inserimento); ogni elemento viene ridistribuito nei sottotitoli in base alla sua posizione, ad es. il limite superiore sinistro quando si lavora con i rettangoli.
Quindi un quadrifoglio è o una foglia e ha meno elementi della sua capacità, o un albero con 4 quadrifogli da bambini (di solito nord-ovest, nord-est, sud-ovest, sud-est).
La mia preoccupazione è che se si tenta di aggiungere duplicati, può essere lo stesso elemento più volte o più elementi diversi con la stessa posizione, i quadricipiti hanno un problema fondamentale con la gestione dei bordi.
Ad esempio, se lavori con un quadrifoglio con una capacità di 1 e il rettangolo dell'unità come rettangolo di selezione:
[(0,0),(0,1),(1,1),(1,0)]
E provi a inserire due volte un rettangolo il cui limite superiore sinistro è l'origine: (o similmente se provi a inserirlo N + 1 volte in un quadrifoglio con una capacità di N> 1)
quadtree->insert(0.0, 0.0, 0.1, 0.1)
quadtree->insert(0.0, 0.0, 0.1, 0.1)
Il primo inserto non sarà un problema:
Ma poi il primo inserimento attiverà una suddivisione (perché la capacità è 1):
Entrambi i rettangoli vengono quindi inseriti nella stessa sottostruttura.
Quindi di nuovo, i due elementi arriveranno nello stesso quadrifoglio e scateneranno una suddivisione ...
E così via, e così via, il metodo di suddivisione verrà eseguito indefinitamente perché (0, 0) sarà sempre nella stessa sottostruttura dei quattro creati, il che significa che si verifica un problema di ricorsione infinita.
È possibile avere un quadrifoglio con duplicati? (In caso contrario, si può implementarlo come a Set
)
Come possiamo risolvere questo problema senza rompere completamente l'architettura di un quadrifoglio?