Проблема с quad / octree в поисках ближайших соседей заключается в том, что ближайший объект может находиться прямо через деление между узлами. Для коллизий это нормально, потому что если его нет в узле, нас это не волнует. Но рассмотрим этот 2D-пример с квадродеревом:
Здесь, даже если черный элемент и зеленый элемент находятся в одном узле, черный элемент находится ближе всего к синему элементу. Ответ ultifinitus может гарантировать только то, что ближайший сосед - только каждый элемент в вашем дереве размещен в наименьшем возможном узле, который может его содержать, или в уникальном узле - это приводит к более неэффективным квадродеревам. (Обратите внимание, что существует много разных способов реализации структуры, которую можно назвать quad / octree - более строгие реализации могут работать лучше в этом приложении.)
Лучшим вариантом будет kd-дерево . Kd-деревья имеют очень эффективный алгоритм поиска ближайших соседей , который вы можете реализовать, и могут содержать любое количество измерений (отсюда и «k» измерения).
Отличная и информативная анимация из Википедии:
Самая большая проблема с использованием kd-деревьев, если я правильно помню, заключается в том, что с ними сложнее вставлять / удалять элементы при сохранении баланса. Поэтому я бы рекомендовал использовать одно kd-дерево для статических объектов, таких как дома и деревья, которое хорошо сбалансировано, и другое, которое содержит игроков и транспортные средства, которые требуют регулярной балансировки. Найдите ближайший статический объект и ближайший мобильный объект и сравните эти два.
Наконец, kd-деревья относительно просты в реализации, и я уверен, что вы можете найти множество библиотек C ++ с ними. Из того, что я помню, R-деревья намного сложнее и, вероятно, излишни, если все, что вам нужно, это простой поиск ближайших соседей.