给定一个圆圈列表及其坐标(x和y),这些圆圈每秒钟都在不同方向(东南、西南、东北和西北)移动,如果圆圈撞到墙壁就像弹跳一样,那么它将改变方向,那么我们如何检测它们中的任何一个是否相互碰撞或重叠我不确定我们是否可以使用像aBinary Search Tree
这样的数据结构,因为所有坐标每秒钟都在变化,所以树必须相应地重新构建或者我们可以每次使用Vertical Sweep Line Algorithm吗?关于如何有效地做到这一点有什么想法吗?
最佳答案
你的形状只是圆形,所以:
如果圆到边框的距离小于其半径,则它将接触矩形的边框。
如果圆心之间的距离小于半径之和,两个圆就会互相接触。
假设矩形的边界在水平轴上为X1
和X2
,垂直轴为Y1
和Y2
(具有X1 < X2
和Y1 < Y2
)。在第一种情况下,如果圆的中心(x, y)
且半径r
,则必须检查:x-r < X1
?x+r > X2
?y-r < Y1
?y+r > Y2
?
如果其中任何一个是真的,那么您的圆将触及矩形的边界。
在第二种情况下,假设圆分别由(x1, y1, r1)
和(x2, y2, r2)
定义你必须检查是否(x1 - x2)^2 + (y1 - y2)^2 < (r1 + r2)^2
如果这是真的,你的圆圈互相接触。
关于java - 如何检测两个重叠的运动形状? (算法),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13097286/