如何找到光线与移动圆的第一个交点

时间:2012-01-22 09:09:29

标签: algorithm data-structures computational-geometry

我一直在努力解决问题,到目前为止还没有找到比天真的更好的解决方案:

根据线性定律给出N个圆圈。对于每个圆,我们的初始(在0.0时刻)半径,初始坐标及其半径和坐标在1.0时刻(结束时刻)。我们还有k射线,它们的原点坐标和沿光线的矢量。每条射线仅存在于给定时刻t k 。我需要能够找到光线与任何圆圈的第一个交点。预期的k数量非常大(数百万或数十亿)以及预期的圆数(数千)。我需要更快的解决方案然后检查所有光线的所有光线。

我一直在网上搜索一段时间,但我找不到好的解决办法。即使是一个关于圆圈不易移动的问题的想法也将受到赞赏。

我觉得kd树应该适合静态情况,也许动能kd树会解决更难的问题。尽管如此,我仍然无法弄清楚如何使用kd-tree。

2 个答案:

答案 0 :(得分:2)

您可以将此视为3D中的静态情况,时间作为附加坐标。带路径的圆圈变成平截头体,射线处于平面时间= t k 。如果平截头体的位置不如二进制空间分区(k-d树,...)可以帮助。

要查找由光线穿过的所有分区,首先查找分区,其中是原点,而不是通过光线方向上的分区邻居遍历(在树中)。这取决于使用的分区方法。它与光线交叉的分区数是线性的。

更新:想法在它触及的每个分区中放置截头。一个视锥体将在更多分区中。

这是一维加时间的例子。一切都是一样的,圆圈有起点和终点以及起点和终点半径。

1  |    E   /
   |   .   /
   |   .  / 
   |  .  /
   |  . /
0  | S /
t/X

在X方向分区:

   |    E : /
   |   .  :/
   |   .  : 
   |  .  /:
   |  . / :
   | S /  :
          X

这个梯形将进入两个分区。

按时间方向划分:

   |    E : /
   |   .  :/
   |   .  : 
t-------------------
   |  . / :
   | S /  :
          X

来自X左侧分区的梯形将进入两个时间分区,而在X右侧分区中,它将仅进入上部分区。

为了实现它,需要计算在某个平面部分上的线和轴平面之间是否存在交叉,并且如果在平面的哪一侧没有交叉点是线。在2D情况下,甚至在更高维度上,计算是相同的。

答案 1 :(得分:0)

(大声思考)您可能想要使用具有Bresenham算法的八叉树或多分辨率网格来快速消除大量检查?