找到射线附近所有点的最快方法是什么?

时间:2019-12-04 02:43:32

标签: algorithm computational-geometry

我有一堆3D点(x,y,z)和射线(原点,方向)。我正在寻找最快的方法来查找所有距离射线小于一定距离的点。

到目前为止,最好的方法是遍历每个点的O(n)算法,但我希望可以使用Kd-tree更好。尽管不确定如何使用它来查询射线附近的点,而不是另一点。

编辑:如果我将点放在八叉树中,然后仅在光线相交的八叉树体素中测试点,那应该更快。但是还有更快的方法吗?

2 个答案:

答案 0 :(得分:0)

首先将点“膨胀”到半径等于所讨论距离的球体。这将您的查询简化为简单的对象射线相交查询-将这些球体放入空间细分结构(八叉树,k-d树等)中,并简单地对其进行射线相交查询。射线相交的球体对应于距离球体半径小于球体半径(即给定距离)的点。

对于空间细分结构,我绝对建议您使用Bounding Volume Hierarchy(BVH),例如AABB树或以球为叶的球树;它们比大多数固定的空间细分结构要紧凑得多,并且易于实现。但是,任何空间细分方法都足够。

答案 1 :(得分:0)

如@eviltak所说,包围球的层次结构可能是一个不错的选择。

球体具有各向同性的优点,当您沿射线的方向看时(具有正交投影),树将投影到磁盘的层次结构中,而射线将投影到另一个磁盘中,这就是2D问题。 (当然,您只按需执行投影。)

在这种情况下,对点进行充气没有真正的好处,因为圆点测试和圆重叠测试没有显着差异。