矩形包含关系的核心逻辑是:内矩形四条边全部落在外矩形内部或边界重合;用left/right/top/bottom直接比较最可靠,条件为a.left≤b.left、a.right≥b.right、a.top≤b.top、a.bottom≥b.bottom。

判断矩形包含关系的核心逻辑
两个矩形存在包含关系,当且仅当「内矩形的四条边全部严格落在外矩形内部(或与边界重合)」。C++ 中没有内置矩形类型,需自行定义结构体(如 Rect),并基于左上角坐标 + 宽高(或左右上下边界)做坐标比较。关键不是调用某个函数,而是明确比较哪几组值。
用 left/right/top/bottom 边界判断最可靠
比起用 x/y+width/height 计算边界,直接维护四个边界值能避免浮点误差、负宽高等陷阱,也更易读。假设 Rect 定义为:
struct Rect {
float left, right, top, bottom;
};
则 A 包含 B 的条件是:
A.leftA.right >= B.rightA.topA.bottom >= B.bottom
注意:这里使用 和 <code>>= 表示“允许边界重合”,即 B 可完全贴在 A 的某条边上。若要求严格内部(不接触边界),全部换成 和 <code>>。
用 x/y+w/h 时必须先校验宽高符号
若你用的是类似 Rect{x, y, w, h} 的定义(常见于 OpenCV 或 Qt),必须先确保 w >= 0 且 h >= 0,否则 right = x + w、bottom = y + h 会出错。常见错误包括:
- 传入负宽高后未归一化,导致
right - 误以为
y总是向上增长,实际多数图形 API 中y向下增长,top = y,bottom = y + h - 混用坐标系(如 OpenGL 的 NDC 是 y 向上,SDL 默认 y 向下)
安全做法是统一转成边界形式再比较:
float l1 = min(r1.x, r1.x + r1.w); float r1 = max(r1.x, r1.x + r1.w); float t1 = min(r1.y, r1.y + r1.h); float b1 = max(r1.y, r1.y + r1.h); // 然后同上用四边界判断
是否相等也要考虑——包含 ≠ 严格包含
如果 A 和 B 完全重合,上面的边界判断会返回 true(即 A 包含 B)。但业务中常需区分「严格包含」和「包含或相等」。可额外加一个相等判断:
- 若需排除相等:
(A.left B.right || A.top B.bottom),再与包含条件组合 - 若只关心「至少有一个方向上 A 更大」,不要直接复用
==比较整个结构体,浮点数应逐字段用abs(a-b)
最容易被忽略的是坐标系差异和宽高符号——没处理这两点,结果可能在某些输入下完全反向。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











