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












