判断两个AABB矩形是否碰撞,本质是检查x、y轴投影是否同时重叠:需满足(a.right > b.left && b.right > a.left) && (a.top > b.bottom && b.top > a.bottom),任一轴分离即无碰撞。

判断两个AABB(Axis-Aligned Bounding Box)矩形是否发生碰撞,本质是检查它们在x轴和y轴上的投影是否存在重叠——只要任一轴不重叠,就无碰撞;两轴均重叠,才判定为碰撞。
核心逻辑:分离轴定理的简化应用
对两个矩形A和B,设其左、右、下、上边界分别为:
A.left, A.right, A.bottom, A.top
B.left, B.right, B.bottom, B.top
只需同时满足以下两个条件,即发生碰撞:
① A.right > B.left 且 A.left ② A.top > B.bottom 且 A.bottom
这比逐点检测或构造交集区域快得多,且无浮点误差累积风险。注意:边界相接(如A.right == B.left)按常规物理引擎定义视为【不碰撞】,若需包含相接情况,所有比较符改用≥和≤。
立即学习“C++免费学习笔记(深入)”;
代码实现(C++11及以上)
定义矩形结构体:
struct AABB { float left, right, bottom, top; };
编写判定函数:
bool intersects(const AABB& a, const AABB& b) {
return (a.right > b.left) && (a.left (a.top > b.bottom) && (a.bottom }
调用示例:
AABB rect1{0.0f, 2.0f, 0.0f, 3.0f};
AABB rect2{1.5f, 3.5f, 1.0f, 4.0f};
bool hit = intersects(rect1, rect2); // 返回 true
常见错误排查
方法一:坐标系方向误判
若y轴向下为正(如部分GUI框架),则top
方法二:未处理NaN或无穷大输入
若传入NaN值,比较运算恒返回false,导致漏判。可在函数开头加断言:
assert(std::isfinite(a.left) && std::isfinite(a.right) && ...);
方法三:整数坐标截断溢出
当使用int类型且坐标值极大时,(a.right > b.left)可能因符号位扩展异常。应确保坐标类型能容纳运算范围,或改用long long比较。


















