【发布时间】:2017-03-01 20:52:14
【问题描述】:
我有一个由近 20000 个点组成的点云。我们考虑点云中的一个点。我想确定在预定义半径内的每个点周围的球形空间内的点集。在下图中有一个非常清楚的说明我的意思, [一个周围有球形空间的点 [Gross et al. (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]);
}
}
}
}
这里的问题是所提出的算法非常耗时。我想知道是否有任何建议可以加快这个过程。
【问题讨论】:
-
您可以使用
Distance(points[i], points[j]) < radiusiffDistance(points[j], points[i]) < radius将使用的时间减半。然后你的第二个循环变量将从i+1开始。 -
@Albjenow 我必须精确更改代码的哪一部分?
-
@Albjenow 我改变了这样的代码, for (int i = 0; i
-
也许你误会了我。不需要再检查另一个方向的距离。如果点 X 在 Y 的范围内,那么(并且只有这样)Y 在 X 的范围内,对吧?所以你可以在最里面的
if子句中做2个push_backs -
将空间划分为 size=radius/2 的立方体并将粒子放入立方体,然后将每个立方体的粒子仅与相邻的立方体检查,因为其他立方体不在范围内。
标签: c++ multithreading optimization point-clouds