Estoy desarrollando un quadtree para realizar un seguimiento de los objetos en movimiento para la detección de colisiones. Cada objeto tiene una forma delimitadora, digamos que son todos círculos. (Es un juego 2D de arriba hacia abajo)
No estoy seguro de si almacenar solo la posición de cada objeto o toda la forma delimitadora.
Si trabaja con puntos, la inserción y subdivisión es fácil, porque los objetos nunca abarcarán múltiples nodos. Por otro lado, una consulta de proximidad para un objeto puede perder colisiones, ya que no tendrá en cuenta las dimensiones de los objetos. ¿Cómo calcular la región de consulta cuando solo tienes puntos?
Si trabaja con regiones, ¿cómo manejar un objeto que abarca varios nodos? ¿Debería insertarse en el nodo primario más cercano que lo contiene por completo, incluso si esto excede la capacidad del nodo?
Gracias.
Debe almacenarlo en el nodo más pequeño que lo contenga por completo, incluso si esto excede la capacidad (use un contenedor redimensionable).
fuente
Agregaría esto como un comentario en respuesta a la respuesta de @Nathan Reed, excepto que es demasiado grande para ser un comentario, y quizás en cualquier caso sea digno de ser una respuesta separada.
Estábamos haciendo exactamente lo que se propuso en su respuesta, y de hecho hemos comentado en la fuente que enlaza con esta página. En su mayor parte, ha funcionado extremadamente bien, excepto que una vez cada dos o tres meses, hemos estado perdiendo un servidor al azar que no responde debido a la duración masiva de las consultas de búsqueda.
La causa raíz del problema me llamó la atención mientras hacía una verificación de rendimiento para tratar de averiguar qué estaba causando esto. Es probable que solo sea una preocupación si permite la superposición de objetos. En nuestro juego lo hacemos, y en el peor de los casos, ocasionalmente conduce a un pico de profundidad que mata el rendimiento.
Tuvimos un caso de borde donde cerca de 100 objetos, todos con discos delimitadores, se agruparon muy cerca. Eso condujo al problema de una espiga muy profunda en el árbol, porque llegamos al punto en que los objetos eran más grandes que el área cubierta por los nodos quadtree, por lo que cada nuevo objeto se mostraba en múltiples nodos, lo que conducía a una subdivisión masiva del árbol, por lo que el problema se descontrola.
La conclusión de esto es que si permite que las regiones de objetos se superpongan, vigile de cerca las cosas si obtiene grupos apretados de objetos, para asegurarse de que su árbol no sea demasiado profundo.
La solución que estoy investigando actualmente es almacenar objetos como puntos, y luego, al hacer una búsqueda, aumentar los límites del rectángulo de búsqueda en el radio máximo almacenado en el árbol. Eso debería funcionar para nosotros, ya que el árbol es una búsqueda de primer paso, luego hacemos una verificación de rango basada en un círculo verdadero, junto con algunas otras verificaciones de criterios, por lo que las alertas falsas adicionales se filtrarán.
Su kilometraje real puede variar.
fuente