如何在无组织点云中的一个点周围找到具有特定半径的球形 space 中的一组点

How to find a set of points in a spherical space with specific radius around one point in a unorganized point cloud

我有一个包含近 20000 个点的点云。我们考虑点云中的一个点。我想确定在预定义半径内的每个点周围的球形 space 内的一组点。下图非常清楚地说明了我的意思, [周围有球形 space 的点 [Gross 等人。 (2007)][1]]1

我已经写了使用两个循环找到每组点的最简单方法。这是函数,

void FindPointsInsideSphere(std::vector<Point>& points, double radius)
{
    for (int i = 0; i < points.size(); i++)
    {
        for (int j = 0; j < points.size(); j++)
        {
            if (i != j && Distance(points[i], points[j]) < radius)
            {
                points[i].Sphere.push_back(points[j]);
            }
        }
    }
}

这里的问题是所提出的算法非常耗时。我想知道有没有什么可以加速这个过程的建议。

I wanted to know if there are any suggestions that can accelerate the process.

一种众所周知的方法是使用长列表中的任何 space-partitioning data structures。 最容易实现的(可以说)是 simple 3D grid.

stackexchange 上有一个类似的问题:https://cstheory.stackexchange.com/questions/17971/search-for-all-nearest-neighbors-within-a-certain-radius-of-a-point-in-3d

在与@AMA 讨论和谷歌搜索后,我意识到 KDTree 和统一网格都提高了蛮力的时间复杂度。


网格

半径搜索复杂度:

O(log(n) + k)

其中 k 是球体内邻居的近似数量。

我个人从未尝试过这种方法,但正如@AMA 指出的那样,它的时间复杂度比 kdtree 查询更好。

经过快速 google 搜索,我找到了 this implementation on github


KDTree

半径搜索复杂度:

O(sqrt(n) + k)

其中 k 是球体内邻居的近似数量。

KDTree 搜索的最佳开源实现 FLANN,支持多种语言。

查看 the manual 部分:3.1.4 flann::Index::radiusSearch

如果您想自己实现,可以查看 source code in github 以获取灵感。