我在高性能计算集群上从事理论化学研究,通常涉及分子动力学模拟。我的研究之一涉及到一个N维(通常N = 2-5)超球的静态场,测试粒子可能会与其碰撞。我希望优化(即彻底改进)用于表示球场的数据结构,以便进行快速的碰撞检测。目前,我使用一个简单的指向N成员结构体的指针数组(每个坐标的中心都是双精度),以及一个最近邻列表。我听说过八叉树和四叉树,但没有找到清晰的解释它们的工作原理、如何高效地实现它们以及如何使用它们进行快速的碰撞检测。考虑到我的模拟规模,内存几乎不是问题,但运算速度是关键。
我在高性能计算集群上从事理论化学研究,通常涉及分子动力学模拟。我的研究之一涉及到一个N维(通常N = 2-5)超球的静态场,测试粒子可能会与其碰撞。我希望优化(即彻底改进)用于表示球场的数据结构,以便进行快速的碰撞检测。目前,我使用一个简单的指向N成员结构体的指针数组(每个坐标的中心都是双精度),以及一个最近邻列表。我听说过八叉树和四叉树,但没有找到清晰的解释它们的工作原理、如何高效地实现它们以及如何使用它们进行快速的碰撞检测。考虑到我的模拟规模,内存几乎不是问题,但运算速度是关键。
{1} 连通分量标记,Hanan Samet,使用四叉树,ACM期刊第28卷,第3期(1981年7月)
{2} 在八叉树表示的图像中查找邻居,Hanan Samet,计算机视觉、图形和图像处理,第46卷,第3期(1989年6月)
{3} 凸包生成、连通分量标记和集合定义模型的最小距离计算,Dan Pidcock,2000
{4} 在图片表示中使用常规分解的实验,Klinger,A.和Dyer,C.R.E,计算机图形学和图像处理5(1976),68-105。
因为你的领域是静态的(我假设你的意思是超球体不会移动),所以我知道最快的解决方案是使用Kdtree。
你可以自己制作,也可以使用其他人的,比如这个:
http://libkdtree.alioth.debian.org/
c. 平面与立方体的边相交(弦与立方体相交的一个条件)
iv. 计算弦的大小(正常长度与球半径比值的余弦^-1的正弦)
v. 如果线上最近的点小于弦的距离,并且该点位于线的两端之间,则弦与立方体的一条边相交(弦在立方体表面沿着其中一条边相交)。
我有点模糊地记得这是我在使用八叉树数据结构处理球形区域的情况下做的事情(很多年前)。您可能还希望查看KD树,因为其他一些帖子建议的内容听起来与您最初的问题非常相似。
四叉树是一种二维树结构,每个节点都有四个子节点,并且每个子节点覆盖父节点的1/4面积。
八叉树是一种三维树结构,每个节点都有八个子节点,并且每个子节点包含父节点体积的1/8。这里有一张图片帮助你更好地理解:http://en.wikipedia.org/wiki/Octree
如果你正在进行N维交叉测试,可以将其推广为N叉树。
交叉算法通过从树的顶部开始递归遍历任何与被测试对象相交的子节点,最终到达包含实际对象的叶节点来处理交集。