1

我已经创建了一个结构并用变量填充了一个数组,这些变量可以被认为是 xyz 平面中的坐标,或者是到一个点的 3 维距离。

for (a=1; a<=lst; a++) {
for (b=1; b<=hst; b++) {    
        for (c=1; c<=wst; c++) {

    point[d].x=a*k+px;
    point[d].y=b*k+py;
    point[d].z=c*k+pz;
    d++;

    }
    }
}

变量 px ... 作为通用 k 的一小部分的随机添加,以制作一个不那么“刚性”的立方体。我想在循环的迭代中识别在所选“点”的给定半径内的“点”,该循环的运行次数与点数一样多。但是,我想在不运行循环来检查 point[num] 数组中的每个点以查看它是否接近的情况下执行此操作。如果不进行基于 point[num] 数组中点的顺序的检查,我能做些什么来避免这种情况?

4

1 回答 1

2

我可以看到两种很好的方法来做到这一点。

  1. 如果您要查找的点位于某个有序的轴向对齐网格中,那么您可以立即访问某个半径内的点。这样做的方法是获取 x、y、z 点并将其转换为其网格位置以及半径,以定义 x、y 和 z 的最小和最大网格位置。然后,您可以立即访问这些变量。

  2. 如果这些点的形式不是轴向对齐并排列成网格,那么您需要将其放入一个可以快速搜索的形式中。我会建议kd树。从 beO(n)到需要一个搜索操作O(log(n)。它的方法是将点集沿平均值分成两半并重复,直到你有一个快速可搜索的树:

在此处输入图像描述

PCL(点云库)也将为您做到这一点!

这是一个链接:

http://pointclouds.org/

还有一个关于使用 pcl 的 kd 树的教程:

http://pointclouds.org/documentation/tutorials/kdtree_search.php#kdtree-search

事实上,它甚至向您展示了从输入点到 kd 树存储点云的半径搜索代码。在我提供的教程页面上查看半径搜索中的邻居。

祝你好运!

于 2012-11-27T22:46:05.243 回答