如何检测两个重叠的运动形状? (算法)

时间:2012-10-27 04:35:19

标签: java algorithm

给出一个圆圈列表,其坐标(x和y)每秒在不同的方向上移动(东南,西南,东北和西北),圆圈将改变方向,如果它撞墙有点像弹跳,所以我们如何检测它们是否相互碰撞或重叠?我不确定我们是否可以使用像Binary Search Tree这样的数据结构,因为所有坐标每秒都会变化,所以树必须相应地重新构建。或者我们每次都可以使用Vertical Sweep Line Algorithm吗?关于如何以有效的方式做到这一点的任何想法?

2 个答案:

答案 0 :(得分:3)

你的形状只是圆圈,所以:

  • 如果圆圈的距离半径
  • ,则圆圈将触摸矩形的边框。
  • 如果中心之间的距离低于其半径之和,则两个圆圈将相互接触。

假设您的矩形的边界在水平轴上为X1X2,在垂直轴上为Y1Y2X1 < X2和{{1 }})。在第一种情况下,如果您的圈子的中心为Y1 < Y2且其半径为(x, y),则必须检查是否:

  • r
  • x-r < X1
  • x+r > X2
  • y-r < Y1

如果其中任何一个为真,则您的圆圈会触及矩形的边界。

在第二种情况下,假设您的圈子分别由y+r > Y2(x1, y1, r1)定义。你必须检查(x2, y2, r2)。如果这是真的,那么你的圈子会相互接触。

答案 1 :(得分:0)

鉴于提供的假设:

  • 你的移动形状只是圆圈。
  • 墙壁只是垂直或水平的墙壁,形成一个盒子。
  • 圈子不会相互碰撞(虽然这并不难实现)

您可以实现以下简单算法:

  • 对于每个圆圈,跟踪4个坐标作为与其当前原点(中心)的偏移量:
    • 顶部,底部,左侧,右侧(或北,南,西,东)
    • 请注意,这些是与墙壁的圆圈与这4个确切位置的唯一接触点。
  • 每次在圆圈移动后,从原点检查其4个坐标中的每个坐标,看它是否与墙边界重叠(简单/懒惰的方式可以只是将墙壁设为与FPS一样厚的矩形/球速要求)
  • 如何实现重叠检测:
    • 假设您刚刚将墙体实施为RectangleWall
    • RectangleWall中,添加一个名为public boolean isPointInside(Point pt)的公共成员函数(或签名可以是(int x, int y))并添加逻辑以检查传入的点是否属于矩形:这对你来说应该很简单;)
  • 检测到重叠时实现相应的碰撞逻辑:
    • 如果球的左或右点与某物重叠,则反转其x速度。
    • 如果球的顶部或底部位置与某物重叠,则反转其y速度。