Возможно, вы захотите сохранить свои точки в некоторой пространственной структуре данных.На ум приходят:
- окт-деревья
- деревья BSP
- кд-деревья
Они имеют немного разные свойства.Октавное дерево делит весь мир на 8 одинаковых по размеру кубов, организованных в один большой куб.Каждый из этих кубов, в свою очередь, разделяется на 8 кубов одинакового размера.Вы продолжаете делить кубы до тех пор, пока у вас не будет меньше количества точек в кубе.С помощью этой древовидной структуры вы можете довольно легко пройти по дереву, извлекая все точки, которые могут пересекать данный куб.Как только у вас есть этот список точек, вы можете проверить их по одному.Поскольку ваша тестовая геометрия представляет собой сферу (расстояние от точки), вы должны описать куб вокруг сферы и получить точки, которые могут пересекать ее.В качестве оптимизации вы также можете вписать куб в свой круг, и все, что наверняка пересекает это, вы можете просто сразу включить в набор попаданий.
Дерево BSP Двоичное пространство, разделяющее дерево .Это дерево плоскостей в трехмерном пространстве, образующее двоичное дерево.Основная проблема использования этого для вашей проблемы состоит в том, что вам, возможно, придется сделать много квадратных корней при прохождении, чтобы найти расстояние до плоскостей.Принцип тот же, хотя, когда у вас есть меньше, чем некоторое количество точек, вы формируете лист с этими точками в нем.Все листья в дереве BSP являются выпуклыми многоугольниками (за исключением листьев, расположенных по периметру, которые будут бесконечно большими многоугольниками).При построении BSP вы хотите разделить точки пополам для каждого шага, чтобы действительно получить O (log n) поисков.
KD-дерево - это особый случай BSP, где все плоскости выровнены по оси,Как правило, это значительно ускоряет тесты на них, но не позволяет оптимизировать плоскости на основе вашего набора точек.
Я не знаю ни одной библиотеки c ++, которая реализует их, ноЯ уверен, что их много.Это довольно распространенные приемы, используемые в видеоиграх, поэтому вы можете посмотреть на игровые движки.