两个矩形重叠当且仅当x方向和y方向均重叠;即max(x1,x2)

判断两个矩形是否重叠的核心逻辑
两个轴对齐矩形(AABB)不重叠,当且仅当其中一个完全在另一个的左侧、右侧、上方或下方。因此,**重叠的充要条件是:x方向重叠 AND y方向重叠**。这是最可靠、最高效的方式,避免了所有边界情况误判。
用 std::min 和 std::max 计算重叠区间
假设每个矩形用左上角 (x, y) 加宽高 w、h 表示(y 向下为正),则右下角为 (x + w, y + h)。重叠判断可转化为两区间交集是否非空:
- x 方向:区间
[x1, x1 + w1)与[x2, x2 + w2)是否有交集 - y 方向:同理判断
[y1, y1 + h1)与[y2, y2 + h2) - 交集非空 ⇔
std::max(left1, left2)
bool rectanglesOverlap(float x1, float y1, float w1, float h1,
float x2, float y2, float w2, float h2) {
float right1 = x1 + w1;
float right2 = x2 + w2;
float bottom1 = y1 + h1;
float bottom2 = y2 + h2;
bool xOverlap = std::max(x1, x2) < std::min(right1, right2);
bool yOverlap = std::max(y1, y2) < std::min(bottom1, bottom2);
return xOverlap && yOverlap;
}
注意坐标系和边界处理(易踩坑点)
很多 bug 来自对“是否包含边界”的模糊处理。C++ 中常用半开区间(如 [left, right))更安全,尤其配合浮点数或像素级坐标时:
- 若矩形定义为
left,top,right,bottom(即已含右/下边界),则直接用left1 - 若使用整数坐标且要求“边接触不算重叠”,需把比较符改为
或调整区间定义 - 浮点数比较时,慎用
==判断边界相等;优先用区间不等式逻辑,而非计算交集面积是否 > 0
性能与可读性兼顾的写法
无需引入额外结构体也能写出清晰代码。关键在于把“分离条件”取反——比枚举四种分离情形更简洁、不易漏:
立即学习“C++免费学习笔记(深入)”;
auto overlap = !(x1 + w1 <= x2 || // A 在 B 左侧
x2 + w2 <= x1 || // B 在 A 左侧
y1 + h1 <= y2 || // A 在 B 上方
y2 + h2 <= y1); // B 在 A 上方
这行逻辑等价于前述 xOverlap && yOverlap,但更贴近人脑直觉(“不分离”即重叠)。只要矩形宽高非负,该写法鲁棒且无分支预测惩罚。
真正复杂的是旋转矩形或带 transform 的场景——那得用分离轴定理(SAT),但那是另一回事了。










