Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在无组织点云中的一个点周围具有特定半径的球形空间中找到一组点_C++_Multithreading_Optimization_Point Clouds - Fatal编程技术网

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

C++ 如何在无组织点云中的一个点周围具有特定半径的球形空间中找到一组点,c++,multithreading,optimization,point-clouds,C++,Multithreading,Optimization,Point Clouds,我有一个由近20000个点组成的点云。我们考虑点云中的一个点。我想确定一组位于球形空间内的点,这些点围绕预定义半径内的每个点。下图非常清楚地说明了我的意思, [周围有球形空间的点[Gross等人(2007)][1]] 我已经编写了通过使用两个循环找到每个点集的最简单方法。这是函数 void FindPointsInsideSphere(std::vector<Point>& points, double radius) { for (int i = 0; i <

我有一个由近20000个点组成的点云。我们考虑点云中的一个点。我想确定一组位于球形空间内的点,这些点围绕预定义半径内的每个点。下图非常清楚地说明了我的意思, [周围有球形空间的点[Gross等人(2007)][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]);
            }
        }
    }
}
void FindPointsInsideSphere(标准::向量和点,双半径)
{
对于(int i=0;i
这里的问题是,所提出的算法非常耗时。我想知道是否有任何建议可以加速这一进程

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

一个众所周知的方法是利用长列表中的任何一个。
最容易实现(可以说)的是。

在stackexchange上有一个类似的问题:

在与@AMA和google讨论后,我意识到KDTree和统一网格都提高了暴力的时间复杂性


网格 半径搜索复杂性:

O(log(n) + k)
O(sqrt(n) + k)
其中k是球体内邻居的近似数目

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

在谷歌快速搜索后,我找到了


KDTree 半径搜索复杂性:

O(log(n) + k)
O(sqrt(n) + k)
其中k是球体内邻居的近似数目

KDTree搜索是最好的开源实现,它支持多种语言

请参阅第节:
3.1.4 flann::Index::RADIUSEARCH


如果你想自己实现这一点,你可以看看b以获得灵感。

你可以通过使用
距离(点[i],点[j])iff
距离(点[j],点[i])将所用时间减半。然后您的第二个循环变量将从
i+1
@Albjenow开始,我必须精确更改代码的哪一部分?@Albjenow我这样更改代码,例如(int i=0;i推回
s
如果
子句以size=radius/2的大小在立方体中划分空间,并将粒子放入立方体,然后将每个立方体的粒子仅与相邻立方体进行检查,因为其他立方体将不在范围内。我认为让他使用空间分区数据结构是一个很好的观点。然而,即使3D网格是实现的最简单的结构,它也不是围绕每个点执行raius搜索的正确结构,这正是他要问的。@DaviddelaIglesia为什么不呢?首先找到与球体相交的单元格,然后对这些单元格中的所有点进行测试。在我看来,这比使用数据结构(如KDTree或BallTree)的效率要低得多,KDTree或BallTree是专门用来执行这种搜索操作的。我不是说使用3D网格无法实现同样的效果,我只是说有更好的数据结构用于半径搜索。@DavidLaiglesia对于任何树,都需要找到与球体相交的叶子。“原理是完全相同的。”DaviddelaIglesia在不了解点云结构的情况下,我们不能对这种效率说太多。例如,k-d-树可能被引入歧途。然而,AMA声称3D网格易于实现显然是正确的说法。与在某些情况下可以节省纳秒的解决方案相比,拥有一个有效且易于实施的解决方案可能更可取。在任何情况下,使用3D网格显然比问题中的原始解决方案要好得多,因此答案是正确的。