Использование QuadTree для получения всех точек в ограниченном круге

У меня есть набор от 100 до 200 точек (x, y). Я должен проверить, какие из них попадают на определенное расстояние других. Определенное расстояние фиксируется для всей программы, скажем, 50. Скажем, точка 1 находится в диапазоне точек 5,7,25,90,96,105... и т.д. Точно так же точка 2 попадает в диапазон 23,45 и т.д. Сохранение объектов для размещения по координатам x, y

Здесь предлагается QuadTree, но его можно использовать для получения всех точек в ограничивающем прямоугольнике. Но как получить все точки в ограниченном круге? существует метод, который возвращает точку, ближайшую к лат/длинной в пределах максимального расстояния, но как получить все точки на расстоянии? http://openmap.bbn.com/doc/api/com/bbn/openmap/util/quadtree/QuadTree.html#QuadTree (float, float, float, float, int)

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

Ответ 1

Предположим, что у вас есть окружность с центром в (x, y) с радиусом r и хотите найти все точки в квадранте, которые находятся в круге. Одна из идей заключается в следующем:

  • Построить ограничивающий прямоугольник, вписывающий круг. Это самый маленький прямоугольник, содержащий круг, который имеет верхний левый угол (x - r, y - r) и нижний правый угол (x + r, y + r). Любая точка в круге также должна быть в квадрате, но не наоборот.

  • Запросить квадрант для множества точек, лежащих в этом прямоугольнике. Пусть эти точки P.

  • Для каждой точки P, которая, как известно, находится в прямоугольнике, см., если она также находится в круге. Вы можете сделать это, проверив, не превышает ли расстояние от этой точки до (x, y) значение r. Другими словами, если задать точку (x 0, y 0), вы должны вычислить (x - x 0) 2 + (y - y 0) 2 и если это значение меньше или равно r 2 то точка содержащихся в круге.

Хотя это может показаться неэффективным, оно на самом деле довольно быстро. Отношение площади квадрата к площади круга равно 4/& pi; & Около; 1,27. Другими словами, предполагая, что ваши очки распределены несколько равномерно, вы найдете только на 27% больше очков, чем вам нужно.