两AABB重叠当且仅当x、y方向投影均重叠;即maxA.x >= minB.x && maxB.x >= minA.x && maxA.y >= minB.y && maxB.y >= minA.y。

如果您需要在 C++ 中判断两个轴对齐包围盒(AABB)是否发生重叠,核心依据是:**两矩形在所有坐标轴上投影均存在重叠时,才判定为碰撞**。以下是实现该判定的多种坐标判定方法:
一、基于分离轴定理的边界比较法
该方法利用分离轴定理的简化形式:若两个 AABB 在 x 轴或 y 轴方向上投影完全分离,则二者不相交;仅当 x 和 y 两个方向投影均重叠时,才发生碰撞。此法无需计算交点,仅需四次比较。
1、获取第一个 AABB 的最小和最大坐标:minA.x、minA.y、maxA.x、maxA.y。
2、获取第二个 AABB 的最小和最大坐标:minB.x、minB.y、maxB.x、maxB.y。
3、判断 x 方向是否重叠:!(maxA.x 。
4、判断 y 方向是否重叠:!(maxA.y 。
5、同时满足步骤3和步骤4时,返回 true。
二、基于中心点与半宽高偏移的判定法
将每个 AABB 表示为中心点加半宽半高的形式,通过计算中心点距离与半尺寸之和的关系判定是否重叠。该方式更利于扩展至三维或加入浮点容差处理。
1、计算 AABB A 的中心点 cxA = (minA.x + maxA.x) * 0.5f,cyA = (minA.y + maxA.y) * 0.5f。
2、计算 AABB A 的半宽 halfW_A = (maxA.x - minA.x) * 0.5f,半高 halfH_A = (maxA.y - minA.y) * 0.5f。
3、同理计算 AABB B 的中心点 cxB、cyB 及半宽 halfW_B、半高 halfH_B。
4、计算 x 方向中心距绝对值:abs(cxA - cxB)。
5、判断 x 方向是否可能重叠:abs(cxA - cxB) 。
6、判断 y 方向是否可能重叠:abs(cyA - cyB) 。
7、x 与 y 方向条件均成立时,判定为碰撞。
三、基于包含关系的逐顶点检测法
该方法显式检查一个 AABB 的任意顶点是否落入另一个 AABB 内部,适用于需同时获取碰撞点或调试可视化场景。虽效率低于前两种,但逻辑直观、易于验证。
1、枚举 AABB A 的四个顶点坐标:(minA.x, minA.y)、(maxA.x, minA.y)、(minA.x, maxA.y)、(maxA.x, maxA.y)。
2、对每个顶点 (px, py),判断是否满足:minB.x 。
3、若任一顶点满足步骤2,则 A 与 B 存在重叠。
4、交换角色,枚举 AABB B 的四个顶点,检查是否落入 AABB A 内部。
5、若步骤3或步骤4中任一条件成立,即判定为碰撞。
四、基于区间交集计算的判定法
将 AABB 在各轴上的投影视为一维闭区间,通过计算 x 区间与 y 区间的交集长度是否均为正来判定二维重叠。该方式便于后续计算重叠区域面积。
1、计算 x 方向交集左边界:x_overlap_min = std::max(minA.x, minB.x)。
2、计算 x 方向交集右边界:x_overlap_max = std::min(maxA.x, maxB.x)。
3、计算 y 方向交集下边界:y_overlap_min = std::max(minA.y, minB.y)。
4、计算 y 方向交集上边界:y_overlap_max = std::min(maxA.y, maxB.y)。
5、判断交集有效性:x_overlap_min 。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











