如何在球形空间中找到一组点,在无组织的点云中,特定半径在一个点附近

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

本文关键字:一个 一组 空间 无组织      更新时间:2023-10-16

我的点云由近20000点组成。我们考虑点云中的一个点。我想确定一个预定义半径内每个点附近的球形空间内的一组点。在下面的图像中,有一个非常清楚的说明我的意思,[周围有球形空间的点[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]);
            }
        }
    }
}

这里的问题是提出的算法非常耗时。我想知道是否有任何建议可以加速该过程。

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

与@AMA和Google讨论后,我意识到Kdtree和统一的网格都可以改善蛮力的时间复杂性。


网格

半径搜索复杂性:

O(log(n) + k)

其中k是球体内的邻居数量大约。

我从来没有亲自尝试过这种方法,但是@Ama指出的是,它比KDTREE查询更好的时间复杂。

快速进行了Google搜索后,我在GitHub上找到了此实现。


kdtree

半径搜索复杂性:

O(sqrt(n) + k)

其中k是球体内的邻居数量大约。

最佳开源实现KDTREE搜索flann,Wich带有多种语言支持。

查看部分中的手册:3.1.4 flann::Index::radiusSearch

如果您想自己实现此功能,可以查看Github中的源代码以获取灵感。

我想知道是否有任何建议可以加速 过程。

一种众所周知的方法是利用长列表中的任何空间分门数据结构。最简单的实现(可以说)是一个简单的3D网格。

相关文章: