aabb重叠判定核心是x、y轴投影均重叠:分离轴法检查四条件是否全不成立;中心法比较中心距与半尺寸和;取反逻辑法用短路或表达式优化;整数法用位与合并轴判定。

如果您需要在C++中快速判断两个轴对齐边界矩形(AABB)是否发生重叠,即是否存在空间上的坐标交集,则核心在于检查它们在X轴和Y轴两个方向上是否同时存在重叠区间。以下是实现该判定的多种等效算法方案:
一、分离轴基础判定法
该方法基于分离轴定理的简化形式:若两个AABB在任一坐标轴上投影不重叠,则二者无碰撞;仅当X轴与Y轴投影均重叠时,才判定为碰撞。此方式逻辑清晰、分支少、利于CPU流水线执行。
1、定义两个AABB结构体,各含最小点min(x_min, y_min)与最大点max(x_max, y_max)成员;
2、计算第一个矩形右边界与第二个矩形左边界:若a.max.x ,则X轴分离;
3、计算第一个矩形左边界与第二个矩形右边界:若a.min.x > b.max.x,则X轴分离;
4、同理检查Y轴:若a.max.y 或 <code>a.min.y > b.max.y,则Y轴分离;
5、若上述四个条件均不成立,返回true表示发生AABB重叠。
二、中心-半宽比较法
将每个AABB转换为中心点与半宽高表示,通过比较中心距离与半尺寸之和来判定是否相交。该形式便于扩展至浮点误差容错或加入膨胀偏移量。
1、分别计算矩形a与b的中心坐标:center_a = (a.min + a.max) * 0.5f,同理得center_b;
2、计算各自半宽高:half_ext_a = (a.max - a.min) * 0.5f,同理得half_ext_b;
3、计算中心点在X轴绝对距离:dx = abs(center_a.x - center_b.x);
4、计算X方向允许的最大中心距:allowed_x = half_ext_a.x + half_ext_b.x;
5、同理计算dy与allowed_y;
6、若dx ,<strong><font color="green">判定为碰撞重叠</font></strong>。
三、取反逻辑短路优化法
利用C++布尔表达式短路特性,将分离条件组合为单条return语句,避免显式if分支,适合内联函数场景且编译器易优化为条件跳转指令序列。
1、声明内联函数inline bool intersect(const AABB& a, const AABB& b);
2、直接返回表达式:return !(a.max.x ;
3、四个分离子条件按内存访问局部性顺序排列,优先检测最可能为真的项;
4、逻辑非操作作用于整个或表达式,结果为true即代表两矩形坐标区域存在重叠。
四、整数坐标特化位运算法
当AABB坐标限定为非负整数且范围在32位以内时,可将X/Y轴重叠判定压缩为单次整数比较,再通过位与合并结果,消除分支预测失败开销。
1、预计算X轴重叠掩码:int x_ok = static_cast<int>((a.max.x >= b.min.x) & (b.max.x >= a.min.x))</int>;
2、预计算Y轴重叠掩码:int y_ok = static_cast<int>((a.max.y >= b.min.y) & (b.max.y >= a.min.y))</int>;
3、合并判定:return (x_ok & y_ok) != 0;
4、所有比较使用>=避免严格不等号带来的潜在符号扩展问题;
5、仅当x_ok与y_ok均为1时,位与结果非零,表示发生AABB重叠。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











