Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何找到光线与移动圆的第一个交点_Algorithm_Data Structures_Computational Geometry - Fatal编程技术网

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

Algorithm 如何找到光线与移动圆的第一个交点,algorithm,data-structures,computational-geometry,Algorithm,Data Structures,Computational Geometry,我已经为一个问题挣扎了一段时间,到目前为止还没有找到比天真的解决方案更好的解决方案: 给出了N个按线性规律运动的圆。对于每个圆,我们有它的初始(力矩0.0)半径,初始坐标,以及它的半径和力矩1.0(结束力矩)的坐标。我们也有k条射线,它们的原点坐标和沿着射线的向量。每条光线只在给定时刻存在。我需要能够找到光线与任意圆的第一个交点。k的预期数量相当大(数百万或数十亿),以及圆圈的预期数量(数千)。我需要更快的解决方案,然后检查所有的光线和所有的圆 我在互联网上搜索了一段时间,但没有找到好的解决方法

我已经为一个问题挣扎了一段时间,到目前为止还没有找到比天真的解决方案更好的解决方案:

给出了N个按线性规律运动的圆。对于每个圆,我们有它的初始(力矩0.0)半径,初始坐标,以及它的半径和力矩1.0(结束力矩)的坐标。我们也有k条射线,它们的原点坐标和沿着射线的向量。每条光线只在给定时刻存在。我需要能够找到光线与任意圆的第一个交点。k的预期数量相当大(数百万或数十亿),以及圆圈的预期数量(数千)。我需要更快的解决方案,然后检查所有的光线和所有的圆

我在互联网上搜索了一段时间,但没有找到好的解决方法。即使是一个关于圆圈不移动这一更容易的问题的想法也会受到赞赏


我觉得kd树应该适合静态的情况,也许动力学kd树可以解决更难的问题。尽管如此,我仍然不知道如何使用kd树,即使是对于简单的kd树。

您可以将其视为3D中的静态情况,并将时间视为附加坐标。带有路径的圆变成了平截头体,光线在平面内时间=tk。如果平截头体的位置不是太密集,那么二进制空间分区(k-d树,…)会有所帮助

若要查找所有与光线相交的分区,请首先查找原点所在的分区,然后沿光线方向(在树中)按分区邻居进行遍历。这取决于所使用的分区方法。射线穿过的分区数是线性的

更新:在它接触的每个分区中放置平截体是个好主意。一个平截头体将位于多个分区中

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

1  |    E   /
   |   .   /
   |   .  / 
   |  .  /
   |  . /
0  | S /
t/X
X方向的分区:

   |    E : /
   |   .  :/
   |   .  : 
   |  .  /:
   |  . / :
   | S /  :
          X
   |    E : /
   |   .  :/
   |   .  : 
t-------------------
   |  . / :
   | S /  :
          X
这个梯形将进入两个分区

时间方向上的分区:

   |    E : /
   |   .  :/
   |   .  : 
   |  .  /:
   |  . / :
   | S /  :
          X
   |    E : /
   |   .  :/
   |   .  : 
t-------------------
   |  . / :
   | S /  :
          X
从X左分区开始的梯形将在两个时间分区中移动,而在X右分区中,它将只在上分区中移动


为了实现它,需要计算某个平面零件上的直线和轴平面之间是否存在交点,如果平面的哪一侧没有交点,则需要计算直线。在二维情况下,甚至在更高的维度上,计算都是一样的。

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

Bresenham在这方面有何帮助?Bresenham允许您确定每条光线通过网格的哪些项目(在这种情况下,网格项=像素)嗯,我不认为这个想法会有帮助,因为光线的长度可能真的很大,而且球体的半径没有上限或下限,所以很难选择网格的大小。如果你之前没有关于你的问题的数据,你是否能够比蛮力做得更好是值得怀疑的……我考虑过这种方法,但没有它的缺点是它不能提高最坏情况的复杂性。你是说最坏情况是因为密集的截锥体(重叠)吗或者检查分区的数量?分区的数量检查。我想你只把圆心放在kd树中,然后选择它们的半径,这样就不会实现实际的优化。把整个平截头体放在k-d树中,并在时间坐标上拆分。你能更详细地解释一下如何放置平截头体吗在kd树中?我也有一个随时间分裂的问题-即使这个坐标中的微小差异也会使距离无限大,所以你不能使用常规的欧几里德距离,对吗?