El problema con un quad / octree en las búsquedas de vecino más cercano es que el objeto más cercano puede estar sentado en la división entre nodos. Para colisiones, esto está bien, porque si no está en el nodo, no nos importa. Pero considere este ejemplo 2D con un quadtree:
Aquí, aunque el elemento negro y el elemento verde están en el mismo nodo, el elemento negro está más cerca del elemento azul. La respuesta de ultifinitus solo puede garantizar al vecino más cercano, solo cada elemento de su árbol se coloca en el nodo más pequeño posible que pueda contenerlo, o en un nodo único, lo que conduce a un cuadrilátero más ineficiente. (Tenga en cuenta que hay muchas formas diferentes de implementar una estructura que podría denominarse quad / octree; las implementaciones más estrictas pueden funcionar mejor en esta aplicación).
Una mejor opción sería un árbol kd . Los árboles Kd tienen un algoritmo de búsqueda de vecino más cercano muy eficiente que puede implementar, y puede contener cualquier cantidad de dimensiones (de ahí las dimensiones "k").
Una gran e informativa animación de Wikipedia:
El mayor problema con el uso de kd-trees, si no recuerdo mal, es que es más difícil insertar / eliminar elementos mientras se mantiene el equilibrio. Por lo tanto, recomendaría usar un árbol kd para objetos estáticos como casas y árboles que está altamente equilibrado, y otro que contenga jugadores y vehículos, que necesita equilibrarse regularmente. Encuentre el objeto estático más cercano y el objeto móvil más cercano, y compare esos dos.
Por último, los árboles kd son relativamente simples de implementar, y estoy seguro de que puedes encontrar una gran cantidad de bibliotecas C ++ con ellos. Por lo que recuerdo, los árboles R son mucho más complicados, y probablemente exageren si todo lo que necesitas es una simple búsqueda del vecino más cercano.