Sto implementando un quadtree. Per coloro che non conoscono questa struttura dati, sto includendo la seguente piccola descrizione:
A Quadtree is a data structure and is in the Euclidean plane what an Octree is in a 3-dimensional space. A common use of quadtrees is spatial indexing.
To summarize how they work, a quadtree is a collection — let's say of rectangles here — with a maximum capacity and an initial bounding box. When trying to insert an element into a quadtree which has reached its maximal capacity, the quadtree is subdivided into 4 quadtrees (a geometric representation of which will have a four times smaller area than the tree before insertion); each element is redistributed in the subtrees according to its position, ie. the top left bound when working with rectangles.
So a quadtree is either a leaf and has less elements than its capacity, or a tree with 4 quadtrees as children (usually north-west, north-east, south-west, south-east).
La mia preoccupazione è che se si tenta di aggiungere duplicati, che si tratti dello stesso elemento più volte o di più elementi diversi con la stessa posizione, i quadranti hanno un problema fondamentale con la gestione dei bordi.
Ad esempio, se lavori con un quadruplo con una capacità di 1 e il rettangolo unitario come riquadro di delimitazione:
[(0,0),(0,1),(1,1),(1,0)]
E prova a inserire due volte un rettangolo il cui limite superiore sinistro è l'origine: (o similmente se provi ad inserirla N + 1 volte in un quadruplo 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 inserimento non sarà un problema:
Mapoiilprimoinserimentoattiveràunasuddivisione(perchélacapacitàè1):
Entrambi i rettangoli sono quindi inseriti nella stessa sottostruttura.
Quindi di nuovo, i due elementi arriveranno nello stesso quadruplo e attiveranno una sottodivisione ...
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 infinito.
È possibile avere un quadriplesso con duplicati? (In caso contrario, si può implementarlo come Set
)
Come possiamo risolvere questo problema senza rompere completamente l'architettura di un quadruplo?