两个矩形相交当且仅当在x轴和y轴上均重叠;若任一轴不重叠则必不相交。给定左上角(x,y)、宽w、高h的矩形,相交条件为:a.x < b.x + b.w && b.x < a.x + a.w && a.y < b.y + b.h && b.y < a.y + a.h。

判断两个矩形是否相交的最简逻辑
只要两个矩形在 x 轴和 y 轴上都重叠,它们就相交。反过来想更简单:如果任一轴上不重叠,就一定不相交——这是早期退出的关键。
假设矩形用左上角 (x, y)、宽度 w、高度 h 表示(常见于 SDL、Qt 或自定义结构),那么:
bool intersect(const Rect& a, const Rect& b) {
if (a.x + a.w <= b.x || b.x + b.w <= a.x) return false; // x 轴无重叠
if (a.y + a.h <= b.y || b.y + b.h <= a.y) return false; // y 轴无重叠
return true;
}注意:a.x + a.w 是右边界(不含),a.y + a.h 是下边界(不含),这种“左闭右开”约定能避免浮点或整数边界争议。
使用 std::pair 或结构体时的字段命名陷阱
很多人用 std::pair<int, int> 存坐标,但容易混淆 first/second 含义;也有人把 width 命成 right 却没同步更新逻辑——结果变成比较 left 和 right 两个左边界。
立即学习“C++免费学习笔记(深入)”;
- 推荐明确定义结构体:
struct Rect { int x, y, w, h; };,避免歧义 - 若用
top/bottom/left/right字段,判断逻辑要改为:!(a.right - 特别注意:
bottom通常指y + h,不是y - h;Y 轴向下增长是图形 API 的常见约定(如 SDL、Allegro),和数学坐标系相反
浮点矩形相交时的精度问题
当用 float 或 double 表示坐标时,直接用 <= 可能因计算误差导致误判,尤其在缩放、旋转后恢复 AABB 的场景。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
稳妥做法是引入极小容差(epsilon),但仅对“等于”分支做处理:
const float EPS = 1e-6f; if (a.x + a.w + EPS <= b.x || b.x + b.w + EPS <= a.x) return false;
不要对所有比较加 epsilon,否则会扩大相交判定范围;也不要对整数坐标加 epsilon——纯整数运算不存在舍入误差。
OpenGL 或 Vulkan 中纹理矩形的特殊情形
如果你在 GPU 端做碰撞粗筛(比如用 compute shader 批量检测 UI 元素),注意 NDC 坐标系中 Y 轴向上,且范围是 [-1, 1]。此时矩形的 y 和 h 需先映射回屏幕空间再判断,或者统一转成裁剪空间下的 min/max 边界进行分离轴测试(SAT)。
更实际的做法是:在 CPU 端完成相交判断,只把结果传给 GPU;除非你真有上万矩形需每帧计算,否则没必要在 shader 里重复这套逻辑。
真正容易被忽略的是坐标系混用——比如把窗口坐标(Y 向下)和 OpenGL NDC(Y 向上)的矩形直接丢进同一套函数里判断,结果永远错一半。

















