如何在无组织点云中的一个点周围找到具有特定半径的球形 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 以获取灵感。
我有一个包含近 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 以获取灵感。