AABB矩形重叠判定需x轴与y轴投影均重叠:先计算各自左右上下边界,再判断rightA > leftB && rightB > leftA && topA > bottomB && topB > bottomA,或用紧凑布尔表达式(A.x_max > B.x_min) & (B.x_max > A.x_min) & (A.y_max > B.y_min) & (B.y_max > A.y_min)。

如果您需要在C++中判断两个轴对齐包围盒(AABB)矩形是否发生空间重叠,则可通过比较它们在x轴和y轴上的投影区间是否同时存在交集来实现。以下是多种判定方法:
一、基于坐标区间的分离轴判定法
该方法依据分离轴定理:若两个AABB在任一坐标轴上投影不重叠,则二者无碰撞;仅当x轴与y轴投影均重叠时,才判定为碰撞。此法逻辑清晰、计算高效,适用于浮点与整数坐标。
1、获取矩形A的左边界leftA = min(x1_A, x2_A),右边界rightA = max(x1_A, x2_A),下边界bottomA = min(y1_A, y2_A),上边界topA = max(y1_A, y2_A)。
2、同理获取矩形B的leftB、rightB、bottomB、topB。
3、判断x轴投影是否重叠:!(rightA 。
4、判断y轴投影是否重叠:!(topA 。
5、若步骤3与步骤4结果均为true,则两矩形发生碰撞。
二、基于中心与半宽高的包含判定法
该方法将每个AABB表示为中心点加半宽高形式,通过绝对值差与半尺寸之和比较,避免显式求min/max,有利于向量化与SIMD优化,且对坐标顺序无依赖。
1、计算矩形A中心cx_A = (x1_A + x2_A) * 0.5f,cy_A = (y1_A + y2_A) * 0.5f;半宽hw_A = fabsf(x2_A - x1_A) * 0.5f;半高hh_A = fabsf(y2_A - y1_A) * 0.5f。
2、同理计算矩形B的cx_B、cy_B、hw_B、hh_B。
3、计算x方向中心距dx = fabsf(cx_A - cx_B);y方向中心距dy = fabsf(cy_A - cy_B)。
4、判定条件为:dx 。
三、基于顶点坐标的逐边排斥判定法
该方法直接利用矩形顶点坐标(假设按左下、右下、右上、左上顺时针排列),通过检查一个矩形的所有顶点是否全部位于另一个矩形的某一侧来快速排除碰撞,适合嵌入式或低功耗场景下早期退出。
1、定义矩形A四个顶点为vA[0]~vA[3],矩形B四个顶点为vB[0]~vB[3]。
2、检查vB所有顶点是否均满足:vB[i].x A.right || vB[i].y A.top。
3、若步骤2对全部i成立,则B完全在A外,无碰撞;否则交换A与B角色重复步骤2。
4、若两次检查均未触发全外判定,则存在重叠:需进一步验证是否真重叠,而非仅顶点穿透。
四、基于STL pair与std::max/std::min的函数式写法
该方法利用标准库函数提升可读性与泛型兼容性,支持模板参数T(如float、double、int),便于集成至通用几何工具类中。
1、声明模板函数:template
2、提取a_x.first为A.x_min,a_x.second为A.x_max,其余类推。
3、计算x重叠:T x_overlap = std::max(T(0), std::min(a_x.second, b_x.second) - std::max(a_x.first, b_x.first))。
4、计算y重叠:T y_overlap = std::max(T(0), std::min(a_y.second, b_y.second) - std::max(a_y.first, b_y.first))。
5、返回:x_overlap > T(0) && y_overlap > T(0)。
五、基于位运算与零判断的紧凑布尔判定法
该方法将重叠判断压缩为单表达式,消除分支预测开销,适用于高频调用的物理引擎内循环,但需确保输入坐标已归一化(即x_min ≤ x_max,y_min ≤ y_max)。
1、预设矩形A数据结构含x_min、x_max、y_min、y_max字段;B同理。
2、构造x方向非分离条件:(A.x_max > B.x_min) & (B.x_max > A.x_min)。
3、构造y方向非分离条件:(A.y_max > B.y_min) & (B.y_max > A.y_min)。
4、合并判定:static_cast
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











