两个AABB矩形在x轴和y轴方向同时存在重叠区间时判定为碰撞;标准法分别检查x、y方向是否分离,一行式法用std::max与std::min计算重叠区间并验证有效性。

如果您需要在C++中判断两个轴对齐包围盒(AABB)矩形是否发生空间重叠,即检测其在二维平面上的坐标范围是否存在交集,则核心依据是:两个AABB在x轴和y轴方向上**同时存在重叠区间**时,才判定为碰撞。以下是多种具体实现方法:
一、分离轴法(标准双轴区间检查)
该方法基于分离轴定理的二维简化形式:若两矩形在x轴或y轴方向上完全分离,则无碰撞;仅当两个方向均未分离时,才发生重叠。需分别比较x方向最小/最大边界与y方向最小/最大边界。
1、定义AABB结构体,包含左(left)、右(right)、下(bottom)、上(top)四个浮点成员,或使用中心+半宽高表示;
2、获取矩形A的x区间:[A.left, A.right],矩形B的x区间:[B.left, B.right];
3、计算x方向是否重叠:若A.right ,则x方向分离,直接返回false;
4、获取矩形A的y区间:[A.bottom, A.top],矩形B的y区间:[B.bottom, B.top];
5、计算y方向是否重叠:若A.top ,则y方向分离,返回false;
6、若x与y方向均未分离,则返回true。
二、中心-半尺寸偏移法(适用于中心+宽高表示)
当AABB以中心点(cx, cy)与半宽(hw)、半高(hh)方式存储时,可将碰撞判定转化为曼哈顿距离比较:两中心在x和y方向的距离均不超过各自半尺寸之和,即为重叠。
1、设矩形A中心为(A.cx, A.cy),半宽A.hw,半高A.hh;矩形B同理;
2、计算x方向中心距绝对值:abs(A.cx - B.cx);
3、计算x方向允许最大间距:A.hw + B.hw;
4、若x方向中心距大于允许最大间距,则x方向分离;
5、同理计算y方向中心距绝对值与A.hh + B.hh比较;
6、若abs(A.cx - B.cx) ,则返回true。
三、标准化边界归一化后逐维比较法
为规避左右上下字段命名歧义(如y轴正向朝上或朝下),可统一将每个AABB转换为标准[min_x, max_x, min_y, max_y]四元组,再执行区间重叠逻辑,增强代码鲁棒性与可读性。
1、对任意矩形R,计算其min_x = min(R.left, R.right),max_x = max(R.left, R.right);
2、同理计算min_y = min(R.bottom, R.top),max_y = max(R.bottom, R.top);
3、对矩形A与B归一化后的四元组,分别判断:A.max_x >= B.min_x && B.max_x >= A.min_x;
4、再判断:A.max_y >= B.min_y && B.max_y >= A.min_y;
5、两条件同时成立时返回true。
四、使用std::max与std::min的一行表达式法
利用标准库函数直接构造重叠区间的边界,通过判断重叠区间是否有效(即min ≤ max)来判定碰撞,逻辑紧凑且无分支预测开销。
1、计算x方向重叠区间的左边界:std::max(A.left, B.left);
2、计算x方向重叠区间的右边界:std::min(A.right, B.right);
3、若std::max(A.left, B.left) 为假,则x方向无重叠;
4、同理计算y方向重叠区间上下界:std::max(A.bottom, B.bottom) 与 std::min(A.top, B.top);
5、最终判定表达式为:(std::max(A.left, B.left) 。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











