У меня есть 3D-сетка размером AxBxC с равным расстоянием d между точками в сетке. Учитывая количество точек, каков наилучший способ определения расстояния до ближайшей точки для каждой точки сетки (каждая точка сетки должна содержать расстояние до ближайшей точки в облаке точек) с учетом следующих предположений?
Предположим, что A, B и C довольно большие по отношению к d, давая сетку, возможно, 500x500x500 и что будет около 1 миллиона точек.
Также предположим, что если расстояние до ближайшей точки превышает расстояние D, нас не волнует расстояние до ближайшей точки, и его можно смело установить на некоторое большое число (D может быть от 2 до 10 раз d)
Поскольку будет множество точек сетки и точек для поиска, простое исчерпывающее:
for each grid point:
for each point:
if distance between points < minDistance:
minDistance = distance between points
не является хорошей альтернативой.
Я думал о том, чтобы сделать что-то вроде:
create a container of size A*B*C where each element holds a container of points
for each point:
define indexX = round((point position x - grid min position x)/d)
// same for y and z
add the point to the correct index of the container
for each grid point:
search the container of that grid point and find the closest point
if no points in container and D > 0.5d:
search the 26 container indices nearest to the grid point for a closest point
.. continue with next layer until a point is found or the distance to that layer
is greater than D
В основном: поместите точки в ведра и выполните радиальный поиск наружу, пока точки не будут найдены для каждой точки сетки. Это хороший способ решения проблемы, или есть лучшие / более быстрые способы? Решение, которое подходит для распараллеливания, является предпочтительным.