Что такое хорошая структура данных для хранения и поиска 2d пространственных координат в Java

в настоящее время я пишу плагин для игры, где одна функция включает в себя возможность устанавливать области, определенные 2 двумерными координатами ( верхняя левая и нижняя правая области прямоугольника). Затем эти области будут сохранены и будут иметь различные другие данные, связанные с каждым регионом. Поскольку игрок движется по миру, мне нужно определить, когда он входит в одну из этих областей только из координат игрока, и метод этого должен быть эффективным, так как это в конечном итоге будет вызываться сотни раз в секунду.

существуют ли какие-либо структуры данных, которые могут эффективно поддерживать такой поиск, и если да, то где я могу найти документацию по нему, чтобы найти реализацию java для использования или, если необходимо, реализовать ее самостоятельно?

Я также хочу отметить, что я нашел несколько древовидных структур, которые только поддерживали массовую загрузку, но я должен иметь возможность добавлять и удалять значения из этой структуры в режиме реального времени.

3 ответов


хорошей структурой данных для определения столкновения в части пространства является quad-tree datastructure. Четырехъядерное дерево рекурсивно делит пространство в соответствии с количеством элементов в данной области. Таким образом, он может выполнять поиск, если координаты находятся внутри области в логарифмическом времени.

EDIT: я нашел реализацию здесь но информация о лицензии не приводится.


в одномерном случае подходящей структурой данных является интервал дерево.

чтобы решить двумерный бросок, вы можете либо использовать дерево интервалов, чтобы быстро найти те прямоугольники, которые содержат точку по крайней мере в одном измерении ,и проверить второе измерение для каждого из них (что уже может быть достаточно быстро), или использовать обобщения для многих измерений в статье Википедии эскизы кратко (хотя я должен признать, что я не понял, что обобщение на первое чтение).

предполагая, что игрок движется медленно (т. е. количество событий ввода или вывода области мало по сравнению с количеством областей), следующий подход может быть более эффективным: сохранить дерево поиска X-координат, где прямоугольники начинаются или заканчиваются, и аналогичное дерево для y-координат. Если игрок входит или выходит из области, он должен пересечь координату X или y граничной точки. То есть, вы бы сделали запрос диапазона в поиске x дерево для диапазона [old_x, new_x], и проверить каждый из этих прямоугольников. Сделайте то же самое для y-направления (не сообщая дубликаты).


для реализации координат вы можете использовать Point2D в классе, который реализует функциональность, которую вы ищете:

http://download.oracle.com/javase/6/docs/api/java/awt/geom/Point2D.html