寻找球体最快的方法是在内部并且最接近

时间:2018-06-13 18:54:29

标签: algorithm 3d acceleration octree

我有一堆不同半径的球体散落在3D系统中。

确定一个点在哪个球体内部的最快方法是什么,以及它是否在一个以上 - 也是基于球体中心的最近球体。

强力方法是简单地遍历所有球体,计算到该点的距离,检查该距离是否小于球体的半径,然后找到具有最短阻力的球体。

然而,我得到了几百万分(大约有10万个球),所以这将非常慢。

我的另一个想法是建立某种BVH加速结构,并为每个细胞保存最接近的球体。然而,也存在一个单元可能被两个或更多个球等重叠的情况。因此需要考虑许多边缘情况。

毕竟,BVH树的计算速度不应低于暴力。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我最终通过OpenCL上的暴力方法在GPU上进行 - 这非常快:)

答案 1 :(得分:0)

也许像 Sweep andPrune¹这样的方法可以在这里工作?

Handwavy算法(二维情况):

  1. 创建两个数组 Ax Ay
  2. n 个圆中拾取一个圆并投影到x轴上,即,将圆心的x分量加上半径减去 Ax 中的值。将圆也投影到y轴上。
  3. 对其余所有圈子重复步骤2。
  4. 还将每个点的组件存储在 Ax Ay 中。
  5. 排序 Ax Ay

从此处开始,如果点 P 仅包含在 S 的所有三个区间内,则该点只能在球体 S 中。 / p>

现在,可以确定每个点是否包含在一个球体中:遍历 Ax 并在每次“输入”间隔时递增一个计数器 k 并在“退出”间隔时减小 k 。如果在扫至某个点时计数器为 k ,则该点包含在 k 个间隔的一组 I 中。检查该点是否包含在 Ay ²中的 I 的任何对应间隔中。

同样, Ax Ay 的排序对寻找最接近点的球体很有帮助。

我相信这种方法可以得到(很多)改进,并且在实践中并行化的蛮力可能会更快。

Handwavy算法(3D情况):类似于2D情况。

¹。 http://www.cs.jhu.edu/~cohen/Publications/icollide.pdf

²。我显然忽略了很多d̶e̶t̶a̶i̶l̶s̶̶I̶̶h̶a̶v̶e̶̶y̶e̶t̶̶t̶o̶̶f̶i̶g̶u̶r̶e̶̶o̶u̶t无聊的簿记细节。