我一直在努力解决问题,到目前为止还没有找到比天真的更好的解决方案:
根据线性定律给出N个圆圈。对于每个圆,我们的初始(在0.0时刻)半径,初始坐标及其半径和坐标在1.0时刻(结束时刻)。我们还有k射线,它们的原点坐标和沿光线的矢量。每条射线仅存在于给定时刻t k 。我需要能够找到光线与任何圆圈的第一个交点。预期的k数量非常大(数百万或数十亿)以及预期的圆数(数千)。我需要更快的解决方案然后检查所有光线的所有光线。
我一直在网上搜索一段时间,但我找不到好的解决办法。即使是一个关于圆圈不易移动的问题的想法也将受到赞赏。
我觉得kd树应该适合静态情况,也许动能kd树会解决更难的问题。尽管如此,我仍然无法弄清楚如何使用kd-tree。
答案 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算法的八叉树或多分辨率网格来快速消除大量检查?