我有一堆不同半径的球体散落在3D系统中。
确定一个点在哪个球体内部的最快方法是什么,以及它是否在一个以上 - 也是基于球体中心的最近球体。
强力方法是简单地遍历所有球体,计算到该点的距离,检查该距离是否小于球体的半径,然后找到具有最短阻力的球体。
然而,我得到了几百万分(大约有10万个球),所以这将非常慢。
我的另一个想法是建立某种BVH加速结构,并为每个细胞保存最接近的球体。然而,也存在一个单元可能被两个或更多个球等重叠的情况。因此需要考虑许多边缘情况。
毕竟,BVH树的计算速度不应低于暴力。
有什么想法吗?
答案 0 :(得分:0)
我最终通过OpenCL上的暴力方法在GPU上进行 - 这非常快:)
答案 1 :(得分:0)
也许像 Sweep andPrune¹这样的方法可以在这里工作?
Handwavy算法(二维情况):
从此处开始,如果点 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无聊的簿记细节。