Cuando se trata de problemas de indexación espacial, en realidad recomiendo comenzar con un hash espacial o mi favorito personal: la cuadrícula antigua simple.
... y entienda sus debilidades primero antes de pasar a estructuras de árbol que permitan representaciones dispersas.
Una de las debilidades obvias es que podría estar desperdiciando memoria en muchas celdas vacías (aunque una cuadrícula implementada decentemente no debería requerir más de 32 bits por celda a menos que tenga miles de millones de nodos para insertar). Otra es que si tiene elementos de tamaño moderado que son más grandes que el tamaño de una celda y a menudo abarcan, por ejemplo, docenas de celdas, puede desperdiciar mucha memoria insertando esos elementos de tamaño mediano en muchas más celdas de lo ideal. Del mismo modo, cuando realiza consultas espaciales, es posible que tenga que verificar más celdas, a veces mucho más, de lo ideal.
Pero lo único que es preciso con una cuadrícula para que sea lo más óptimo posible contra una determinada entrada es cell size
, lo que no te deja con demasiado para pensar y jugar, y es por eso que es mi estructura de datos de acceso para problemas de indexación espacial hasta que encuentre razones para no usarlo. Es muy simple de implementar y no requiere que juegues con nada más que una sola entrada de tiempo de ejecución.
Puede sacar mucho provecho de una cuadrícula antigua simple y, de hecho, he superado muchas implementaciones de árbol cuádruple y árbol kd utilizadas en software comercial al reemplazarlas por una cuadrícula antigua simple (aunque no fueron necesariamente las mejores implementadas , pero los autores pasaron mucho más tiempo que los 20 minutos que pasé para crear una cuadrícula). Aquí hay una pequeña cosa rápida que preparé para responder una pregunta en otro lugar usando una cuadrícula para la detección de colisiones (ni siquiera realmente optimizada, solo unas pocas horas de trabajo, y tuve que pasar la mayor parte del tiempo aprendiendo cómo funciona la búsqueda de caminos para responder la pregunta y también fue la primera vez que implementé la detección de colisión de este tipo):
Otra debilidad de las cuadrículas (pero son debilidades generales para muchas estructuras de indexación espacial) es que si inserta muchos elementos coincidentes o superpuestos, como muchos puntos con la misma posición, se insertarán en las mismas celdas ) y degradar el rendimiento al atravesar esa celda. Del mismo modo, si inserta una gran cantidad de elementos masivos que son mucho, mucho más grandes que el tamaño de la celda, querrán insertarse en una gran cantidad de celdas y usar mucha memoria y degradar el tiempo requerido para consultas espaciales en todos los ámbitos. .
Sin embargo, estos dos problemas inmediatos anteriores con elementos coincidentes y masivos son realmente problemáticos para todas las estructuras de indexación espacial. La cuadrícula antigua simple en realidad maneja estos casos patológicos un poco mejor que muchos otros, ya que al menos no quiere subdividir recursivamente las células una y otra vez.
Cuando comienza con la cuadrícula y avanza hacia algo como un árbol cuádruple o árbol KD, entonces el problema principal que desea resolver es el problema con los elementos que se insertan en demasiadas celdas, que tienen demasiadas celdas, y / o tener que verificar demasiadas celdas con este tipo de representación densa.
Pero si piensas en un árbol cuádruple como una optimización sobre una cuadrículapara casos de uso específicos, entonces ayuda seguir pensando en la idea de un "tamaño mínimo de celda", para limitar la profundidad de la subdivisión recursiva de los nodos de cuatro árboles. Cuando haces eso, el peor de los casos del árbol cuádruple se degradará en la cuadrícula densa en las hojas, solo que será menos eficiente que la cuadrícula, ya que requerirá tiempo logarítmico para avanzar de la raíz a la celda de la cuadrícula en lugar de tiempo constante Sin embargo, pensar en ese tamaño de celda mínimo evitará el escenario de bucle infinito / recursividad. Para los elementos masivos también hay algunas variantes alternativas, como los quad-árboles sueltos, que no necesariamente se dividen de manera uniforme y podrían tener AABB para los nodos secundarios que se superponen. Los BVH también son interesantes como estructuras de indexación espacial que no subdividen uniformemente sus nodos. Para elementos coincidentes contra estructuras de árbol, lo principal es simplemente imponer un límite a la subdivisión (o como lo sugirieron otros, simplemente rechazarlos, o encontrar una manera de tratarlos como si no estuvieran contribuyendo al número único de elementos en una hoja al determinar cuándo la hoja debería subdividirse). Un árbol Kd también podría ser útil si anticipa entradas con muchos elementos coincidentes, ya que solo necesita considerar una dimensión al determinar si un nodo debe dividirse en la mediana.