O problema com um quad / octree nas pesquisas de vizinhos mais próximos é que o objeto mais próximo pode estar localizado do outro lado da divisão entre os nós. Para colisões, tudo bem, porque se não estiver no nó, não nos importamos com isso. Mas considere este exemplo 2D com um quadtree:
Aqui, mesmo que o item preto e o item verde estejam no mesmo nó, o item preto está mais próximo do item azul. A resposta do ultifinitus pode garantir apenas ao vizinho mais próximo, apenas todos os itens da sua árvore são colocados no menor nó possível que o possa conter ou em um único nó - isso leva a quadrtrees mais ineficientes. (Observe que existem muitas maneiras diferentes de implementar uma estrutura que poderia ser chamada de quad / octree - implementações mais rigorosas podem funcionar melhor neste aplicativo.)
Uma opção melhor seria uma árvore kd . As árvores Kd têm um algoritmo de pesquisa do vizinho mais próximo muito eficiente que você pode implementar e pode conter qualquer número de dimensões (daí as dimensões "k").
Uma ótima e informativa animação da Wikipedia:
O maior problema com o uso de árvores kd, se bem me lembro, é que elas são mais difíceis de inserir / remover itens enquanto mantêm o equilíbrio. Portanto, eu recomendaria o uso de uma árvore kd para objetos estáticos, como casas e árvores que são altamente equilibradas, e outra que contém jogadores e veículos, que precisam ser equilibrados regularmente. Encontre o objeto estático mais próximo e o objeto móvel mais próximo e compare esses dois.
Por fim, o kd-trees é relativamente simples de implementar, e tenho certeza de que você pode encontrar uma infinidade de bibliotecas C ++ com eles. Pelo que me lembro, as árvores R são muito mais complicadas e provavelmente exageram se tudo o que você precisa é de uma simples pesquisa no vizinho mais próximo.