在结构中搜索具有类似属性的数据

时间:2012-11-27 22:25:52

标签: c++ search loops struct

我已经创建了一个结构并使用变量填充了一个数组,这些变量可以被认为是x y z平面中的坐标,或者是距离点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的一小部分,以制作一个不那么“刚性”的立方体。我想在循环的迭代中识别在所选“点”的给定半径内的“点”,该循环运行的次数与点数一样多。但是,我想这样做而不运行循环来检查点[num]数组中的每一个点以查看它是否接近。如果不进行基于点[num]数组中点的顺序的检查,我能做些什么来避免这种情况?

1 个答案:

答案 0 :(得分:2)

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

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

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

  3. enter image description here

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

    这是一个链接:

    http://pointclouds.org/

    关于kd树的教程:pcl:

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

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

    祝你好运!