想象一下,我们有一个2D天空(10000x10000
坐标)。在这片天空的任何地方,我们都可以拥有一架由其位置(x, y)
标识的飞机。任何飞机都可以开始移动到另一个坐标(直线)。
有一个组件可以管理所有这些定位和移动。当飞机想要移动时,它会以(start_pos, speed, end_pos)
的形式向其发送消息。我怎样才能告诉组件,当一架飞机在另一架飞机的视线内移动时(每架飞机将其视为视线范围内的属性)以便通知它。请注意,许多飞机可以同时移动。此外,这个算法很有效,它可以处理~1000个平面。
如果存在某些约束,这限制了您的解决方案 - 它可能会被删除。问题并没有解决。
答案 0 :(得分:3)
答案 1 :(得分:3)
如果你想处理时间方面(即处理飞机移动的事实),那么我认为可能的简化是通过时间维度解决问题(增加一个维度 - 因此,原始问题,成为2D,成为一个3D问题。)
然后,问题变成找到线与(倾斜)圆柱相交的点。找到所有可能的交叉点将是n ^ 2;不太确定这是否足够有效。
答案 2 :(得分:2)
请参阅Wikipedia:Quadtree了解一个数据结构,以便轻松找到哪架飞机靠近某架飞机。它将使您免于进行O(N ^ 2)测试以获得贴近度。
答案 3 :(得分:1)
你有很好的答案,我只评论一个方面,可能不正确
所以,如果他们确实按照飞行计划移动并且不偏离他们你的问题是确定性的 - 它归结为解决一组方程式,对于~1000平面不是这样的重大任务。
如果您确实需要更快地解决这些方程,您可以使用其他答案中描述的技术
当然,将时间转换为第三维会将飞机从点变为线条,最终您会搜索两条三维线之间的最近点(这里有一些math)
答案 4 :(得分:-1)
我实际上找到了这个问题的答案。
这是在书Real-Time Collision Detection,p。 223.它的名字也更好:将球体与球体相交,其中2D球体是一个圆圈。这里解释它并不是那么简单(我也可能违反某些权利),但基本思路是将其中一个圆作为一个点,将其半径加到移动半径的半径上。移动的新方向是两个原始向量的总和。