判断矩形重叠应先检查不重叠条件再取反:rect1在rect2左(x2≤x1)、右(x1≥x2)、下(y2≤y1)或上(y1≥y2),四者满足其一即不重叠;默认边接触不算重叠,需根据业务需求调整比较符。

判断两个矩形是否重叠的核心逻辑
两个轴对齐矩形(AABB)不重叠,当且仅当其中一个完全在另一个的左侧、右侧、上方或下方。因此,**直接判断“不重叠”再取反,比枚举所有重叠情况更简洁可靠**。
假设每个矩形用左下角 (x1, y1) 和右上角 (x2, y2) 表示(即 x1 且 <code>y1 ),则重叠条件为:
!(rect1.x2 = rect2.x2 || rect1.y2 = rect2.y2)
等价于:
rect1.x1 rect2.x1 && rect1.y1 rect2.y1
用 C++ 实现时要注意的边界处理
AABB 重叠默认采用“边接触不算重叠”的语义(即仅内部相交才算)。若业务需要“边接触即重叠”,需把 和 <code>> 改为 和 <code>>= —— 这是实际项目中最常被忽略的一致性问题。
常见错误包括:
- 传入的矩形坐标未保证
x1 、<code>y1 ,导致逻辑反转(建议构造函数内做归一化) - 使用浮点数比较时未考虑精度误差,尤其在图形或物理引擎中;可改用
std::abs(a - b) 替代直接等值判断(但重叠判断本身通常只需大小关系,一般无需 eps) - 误将左上角当作原点(如 OpenGL 或某些 UI 框架),此时
y轴方向相反,需统一转换为“左下为原点”或调整不等式方向
封装成可复用的函数模板
为适配 int、float、double 等类型,推荐用模板函数。注意:不要用 auto 推导参数类型,否则可能隐式转换出错。
示例:
template<typename t>
bool aabb_overlap(const T& x1, const T& y1, const T& x2, const T& y2,
const T& u1, const T& v1, const T& u2, const T& v2) {
return x1 u1 && y1 v1;
}
</typename>
调用时确保四元组顺序一致(左下 + 右上),例如:
aabb_overlap(r1.left, r1.bottom, r1.right, r1.top, r2.left, r2.bottom, r2.right, r2.top)
性能与现代 C++ 的注意事项
该判断是纯 CPU 计算,无分支预测失败风险,现代编译器(GCC/Clang/MSVC)基本能内联并优化为 4 次比较 + 3 次逻辑与。无需手动 SIMD —— 单次判断太轻量,SIMD 只在批量检测(如碰撞粗筛)时有意义。
如果你用的是 struct Rect,注意成员布局:把 x1, y1, x2, y2 连续排列可提升缓存友好性;避免把 color 或 id 插在中间。
另外,C++20 起可用 std::tuple 或结构化绑定传参,但对这种高频函数,解包开销反而可能抵消可读性收益——简单参数列表仍是首选。
边界条件和坐标系方向,永远比算法本身更容易出错。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











