检测2d平面中的2个移动物体是否接近

时间:2010-12-08 10:45:06

标签: algorithm 2d plane

想象一下,我们有一个2D天空(10000x10000坐标)。在这片天空的任何地方,我们都可以拥有一架由其位置(x, y)标识的飞机。任何飞机都可以开始移动到另一个坐标(直线)。

有一个组件可以管理所有这些定位和移动。当飞机想要移动时,它会以(start_pos, speed, end_pos)的形式向其发送消息。我怎样才能告诉组件,当一架飞机在另一架飞机的视线内移动时(每架飞机将其视为视线范围内的属性)以便通知它。请注意,许多飞机可以同时移动。此外,这个算法很有效,它可以处理~1000个平面。


如果存在某些约束,这限制了您的解决方案 - 它可能会被删除。问题并没有解决。

5 个答案:

答案 0 :(得分:3)

  • 使用直线表示航线。
  • 将每一行转换为包含它的矩形。矩形的宽度由“close”的定义决定(安全距离越大,矩形应该越宽)。
  • 对于每个新的飞行计划:
    • 检查新矩形是否与另一个矩形相交。
      • 如果是,请计算每个平面何时到达碰撞点。如果时差太小(根据场景你应该定义太小),拒绝新的飞行计划。

答案 1 :(得分:3)

如果你想处理时间方面(即处理飞机移动的事实),那么我认为可能的简化是通过时间维度解决问题(增加一个维度 - 因此,原始问题,成为2D,成为一个3D问题。)

然后,问题变成找到线与(倾斜)圆柱相交的点。找到所有可能的交叉点将是n ^ 2;不太确定这是否足够有效。

答案 2 :(得分:2)

请参阅Wikipedia:Quadtree了解一个数据结构,以便轻松找到哪架飞机靠近某架飞机。它将使您免于进行O(N ^ 2)测试以获得贴近度。

答案 3 :(得分:1)

你有很好的答案,我只评论一个方面,可能不正确

  • 你说你的飞机以形式(start_pos,speed,end_pos)移动
  • 如果所有的飞机都有这样的,让我们称它们为飞行计划,那么你应该能够直接计算它们在彼此相隔一定距离的时间和地点,或者它们何时会在彼此最近的点或者如果愿意的话碰撞/太靠近

所以,如果他们确实按照飞行计划移动并且不偏离他们你的问题是确定性的 - 它归结为解决一组方程式,对于~1000平面不是这样的重大任务。

如果您确实需要更快地解决这些方程,您可以使用其他答案中描述的技术

  • 使用可以加快计算距离的有效结构(四叉树,八叉树,kd树),
  • 将问题分解为仅针对某些相关的未来时间片求解方程
  • 优先求解距离变化最快的对的方程式

当然,将时间转换为第三维会将飞机从点变为线条,最终您会搜索两条三维线之间的最近点(这里有一些math

答案 4 :(得分:-1)

我实际上找到了这个问题的答案。

这是在书Real-Time Collision Detection,p。 223.它的名字也更好:将球体与球体相交,其中2D球体是一个圆圈。这里解释它并不是那么简单(我也可能违反某些权利),但基本思路是将其中一个圆作为一个点,将其半径加到移动半径的半径上。移动的新方向是两个原始向量的总和。