我已经创建了一个结构并使用变量填充了一个数组,这些变量可以被认为是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]数组中点的顺序的检查,我能做些什么来避免这种情况?
答案 0 :(得分:2)
我可以看到两种很好的方法来做到这一点。
如果您要查找的点位于某个有序轴向对齐的网格中,则可以立即访问某个半径范围内的点。这样做的方法是获取x,y,z点并将其与半径一起转换为其网格位置,以定义x,y和z的最小和最大网格位置。然后,您可以立即访问这些变量。
如果这些点不是一个没有轴向对齐并排列成网格的形式,那么你需要将它放在一个可以快速搜索的表格中。我会建议 kd 树。它需要从O(n)
到O(log(n)
的搜索操作。它的做法是将点集沿平均值分成两半并重复,直到你有一个可快速搜索的树:
PCL(点云库)也将为您做到这一点!
这是一个链接:
关于kd树的教程:pcl:
http://pointclouds.org/documentation/tutorials/kdtree_search.php#kdtree-search
实际上,它甚至会向您显示从输入点到kd树存储点云的半径搜索代码。在我提供的教程页面上查看半径搜索中的邻居。
祝你好运!