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