izo*_*ica 5 algorithm computational-geometry data-structures
我一直在努力解决问题,到目前为止还没有找到比天真的更好的解决方案:
给出了根据线性定律移动的N个圆.对于每个圆,我们的初始(在0.0时刻)半径,初始坐标及其半径和坐标在1.0时刻(结束时刻).我们还有k射线,它们的原点坐标和沿光线的矢量.每条射线仅存在于给定时刻t k.我需要能够找到光线与任何圆圈的第一个交点.预期的k数量非常大(数百万或数十亿)以及预期的圆数(数千).我需要更快的解决方案,然后检查所有光线的所有光线
我一直在网上搜索一段时间,但我找不到好的解决办法.即使是对于不移动的圆圈更容易问题的想法也将受到赞赏.
我觉得kd树应该适合静态情况,也许动能kd树将解决更难的问题.我仍然无法弄清楚如何使用kd-tree甚至更容易.
您可以将其视为 3D 静态情况,并以时间作为附加坐标。具有路径的圆变成截锥体并且射线在平面上 time=t k。如果平截头体的位置不太密集,那么二元空间分区(kd 树,...)会有所帮助。
要找到射线穿过的所有分区,首先找到原点所在的分区,然后按射线方向上的分区邻居遍历(在树中)。这取决于所使用的分区方法。它与光线穿过的分区数量呈线性关系。
更新:最好将平截头体放在它所接触的每个分区中。一个平截头体将分为多个分区。
这是一维加时间的示例。一切都一样,圆有起点和终点以及起点和终点半径。
1 | E /
| . /
| . /
| . /
| . /
0 | S /
t/X
Run Code Online (Sandbox Code Playgroud)
X方向分区:
| E : /
| . :/
| . :
| . /:
| . / :
| S / :
X
Run Code Online (Sandbox Code Playgroud)
这个梯形将进入两个分区。
按时间方向划分:
| E : /
| . :/
| . :
t-------------------
| . / :
| S / :
X
Run Code Online (Sandbox Code Playgroud)
X 左分区中的梯形将进入两个时间分区,而 X 右分区中的梯形将仅进入上分区。
为了实现它,需要计算在某个平面部分上直线和轴平面之间是否有交点,以及如果没有交点则平面的哪一侧是直线。计算在二维情况下是相同的,甚至在更高维度下也是如此。