Algorithm 当二维平面中的两个移动对象接近时检测

Algorithm 当二维平面中的两个移动对象接近时检测,algorithm,2d,plane,Algorithm,2d,Plane,假设我们有一个二维天空(10000x1000坐标)。在这片天空的任何地方,我们都可以看到一架飞机,通过它的位置(x,y)来识别。任何飞机都可以开始移动到另一个坐标(直线) 只有一个组件管理所有这些定位和移动。当飞机想要移动时,它会以(开始、速度、结束)的形式向其发送信息。在组件中,我如何判断一架飞机何时会在另一架飞机的视线内移动(每架飞机都将其作为视线半径的属性),以便通知它。请注意,许多飞机可以同时移动。此外,该算法非常有效,可以处理约1000个平面 如果存在一些限制,这将限制您的解决方案-

假设我们有一个二维天空(
10000x1000
坐标)。在这片天空的任何地方,我们都可以看到一架飞机,通过它的位置
(x,y)
来识别。任何飞机都可以开始移动到另一个坐标(直线)

只有一个组件管理所有这些定位和移动。当飞机想要移动时,它会以
(开始、速度、结束)
的形式向其发送信息。在组件中,我如何判断一架飞机何时会在另一架飞机的视线内移动(每架飞机都将其作为视线半径的属性),以便通知它。请注意,许多飞机可以同时移动。此外,该算法非常有效,可以处理约1000个平面


如果存在一些限制,这将限制您的解决方案-它可能会被删除。问题尚未解决。

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

如果你想处理时间方面的问题(即处理飞机移动的事实),那么我认为一种潜在的简化方法是通过时间维度提升问题(再增加一个维度-因此,原始问题,即二维问题,成为三维问题)


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

请参阅,以获取一种数据结构,该结构可以轻松找到哪些飞机靠近给定的飞机。它将使您不必进行O(N^2)亲密度测试

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

  • 你说你的飞机在形态上移动(开始位置,速度,结束位置)
  • 如果所有飞机都有这样的飞行计划,我们称之为飞行计划,那么你应该能够直接计算它们何时何地彼此保持一定距离,或者何时彼此距离最近,或者飞机是否会碰撞/太近
因此,如果它们确实按照飞行计划移动并且不偏离飞行计划,那么你的问题是确定的-它归结为求解一组方程,对于约1000个平面来说,这并不是一个大任务

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

  • 使用能够加速计算距离的高效结构(四叉树、八叉树、kd树)
  • 将问题拆分为仅针对某些相关的未来时间片求解方程
  • 优先解决距离变化最快的配对方程

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

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


它在书中,p。223它的名称也更好:将移动的球体与球体相交,其中2D球体是一个圆。在这里解释它并不是那么简单(我可能也侵犯了一些权利),但基本思想是将其中一个圆固定为一个点,将其半径添加到移动圆的半径中。移动方向的新方向是两个原始向量的和。

当你说平面时,或者认为你指的是几何方向。你可能应该把它改成飞机或飞机。另外,每架飞机都有一个方向,还是这个方向是固定的?我们现在在处理飞机,谢谢。是的,它有方向?!?从这个起点移动到那个终点。我不确定我是否理解你的问题。你能澄清一下如何使用四叉树吗。我应该在里面放什么?地图扇区、飞机、距离?飞机。这是为了在特定时刻找到靠近所选飞机的任何飞机。如果你想要更精确的细节,你需要澄清你的问题-例如,你的“视线”视角是多少?这只是一个很好的易于更新的结构,可以减少飞机的测试。