Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/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
Java 如何检测重叠的两个移动形状?(算法)_Java_Algorithm - Fatal编程技术网

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

Java 如何检测重叠的两个移动形状?(算法),java,algorithm,Java,Algorithm,给定一个圆圈列表,其坐标(x和y)每秒向不同的方向(东南、西南、东北和西北)移动,如果圆圈撞到墙上会改变方向,有点像弹跳,那么我们如何检测它们是否相互碰撞或重叠?我不确定我们是否可以使用一些数据结构,比如二叉搜索树,因为所有坐标每秒钟都会变化,所以树必须相应地重新构建。或者我们每次都能用吗?关于如何有效地做到这一点,有什么想法吗 根据提供的假设: 你移动的形状只是圆 墙仅是构成长方体的垂直或水平墙 圆不会相互碰撞(尽管这并不难实现) 您可以实现以下简单算法: 对于每个圆,跟踪4个坐标作为其

给定一个圆圈列表,其坐标(x和y)每秒向不同的方向(东南、西南、东北和西北)移动,如果圆圈撞到墙上会改变方向,有点像弹跳,那么我们如何检测它们是否相互碰撞或重叠?我不确定我们是否可以使用一些数据结构,比如
二叉搜索树
,因为所有坐标每秒钟都会变化,所以树必须相应地重新构建。或者我们每次都能用吗?关于如何有效地做到这一点,有什么想法吗

根据提供的假设:

  • 你移动的形状只是圆
  • 墙仅是构成长方体的垂直或水平墙
  • 圆不会相互碰撞(尽管这并不难实现)
您可以实现以下简单算法:

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

您的形状只是圆,因此:

  • 如果圆与边框的距离小于其半径,则圆将与矩形的边框接触
  • 如果两个圆的圆心之间的距离小于其半径之和,则两个圆将相互接触
假设矩形的边界在水平轴上为
X1
X2
,在垂直轴上为
Y1
Y2
(使用
X1
Y1
)。在第一种情况下,如果圆心为
(x,y)
,半径为
r
,则必须检查:

  • x-r
  • x+r>X2
  • y-r
  • y+r>Y2
如果其中任何一个为真,则圆与矩形的边界接触


在第二种情况下,假设您的圆分别由
(x1,y1,r1)
(x2,y2,r2)
定义。您必须检查
(x1-x2)^2+(y1-y2)^2<(r1+r2)^2
。如果这是真的,你的圆圈会互相接触。

你说的塌陷是指碰撞,对吗?墙壁是什么样子的?它们是不是只有4面墙组成一个盒子?它们仅仅是垂直/水平的墙吗?@sampson chen是的,基本上所有的圆都在矩形框内移动,因此每秒你基本上都在做n^2次检查,对吗?是的。您可以考虑更智能的检查方法,例如检查一次并节省下一次碰撞时间。然后,每次检查形状时,如果未达到碰撞时间,请跳过它。如果有,反弹并计算下一次碰撞时间。这样,您将平均执行
O(mn)
检查,其中
m
是每秒的碰撞次数