如何在球形空间中找到一组点,在无组织的点云中,特定半径在一个点附近
How to find a set of points in a spherical space with specific radius around one point in a unorganized point cloud
我的点云由近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网格。
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- 给定一个枢轴点,按照它们与枢轴点构成的角度递增顺序对一组点进行排序
- 如果A("whole")有一组B("parts"),如何同步"part" B从A "whole"到另一个A的转移?
- 您可以static_assert一个元组只有一种满足特定条件的类型
- C++ 如何设计一个只能采用一组离散值的类,例如红绿蓝
- 如何查找一组类型对是否包含一个元素作为第二个成员
- 如何在对一组中的一对之间找到一个元素
- 如何在球形空间中找到一组点,在无组织的点云中,特定半径在一个点附近
- 将一组数字相加或相减以达到一个值
- 我如何拥有一个在 c++ 中具有一组坐标的数组
- C :如何使一组派生的类能够访问一个类的私人成员
- 如何用c++将一个向量数组放入一个一维数组中
- 在C++中将一个对象添加到另一组对象中
- 如何创建一个一维数组来容纳几个二维数组
- C++是否有任何方法可以将一组派生类存储在基类的一个向量中,并仍然访问它们的成员
- 在高性能计算中更好的做法是:将数据结构传递到一个函数或一组变量中
- 每次需要其中一个类的实例时,是否具有一组类的额外副本或从文件中读取更多内存
- 如何提取可变参数函数的一组选定参数,并使用它们调用另一个函数
- 如何让一组不同的子类对象从另一组共享基类的一个静态变量
- 实例化一个二维向量,其中一组对作为单元值