矩形a包含矩形b当且仅当b的左上角x坐标≥a的x1、y坐标≥a的y1,且b的右下角x坐标≤a的x2、y坐标≤a的y2。

判断矩形包含关系的核心逻辑
直接看坐标:一个矩形 A 包含另一个矩形 B,当且仅当 B 的所有四个顶点都在 A 的内部或边界上。对轴对齐矩形(最常见场景),只需比较边界坐标——不需要叉积、点积或几何库。
假设矩形用左上角 (x1, y1) 和右下角 (x2, y2) 表示(x1 , <code>y1 ),那么 <code>A 包含 B 的充要条件是:
A.x1 且 <code>A.x2 >= B.x2A.y1 且 <code>A.y2 >= B.y2
C++实现时要注意的坐标系和方向
很多坑来自坐标系约定不一致。Windows GDI、OpenCV 默认 y 向下为正;OpenGL、数学惯例常 y 向上为正。但只要统一用“左上+右下”或“左下+右上”,逻辑不变——关键在于你定义的 y1 是否小于 y2。
推荐统一使用最小/最大坐标表示(更健壮):left, top, right, bottom,并确保 left 且 <code>top (即 y 向下增长)。这样包含判断就是:
bool contains(const Rect& a, const Rect& b) {
return a.left = b.right &&
a.top = b.bottom;
}
如果用的是 cv::Rect(OpenCV),它内部就是 x, y, width, height,其中 y 是顶边纵坐标,所以 bottom = y + height,必须手动算:
- 别直接比
a.y —— 这只保证顶边在上面,没管底边 - 正确写法:
a.y = b.y + b.height && ...
浮点矩形的边界处理与精度陷阱
用 float 或 double 表示坐标时, 和 <code>>= 依然适用,但要注意浮点误差可能导致本应相等的边界被判为不满足。例如两个矩形共享一条边,因计算路径不同导致 a.right == b.right 返回 false。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
解决方案不是加 epsilon(容易误判),而是明确设计契约:
- 若业务允许“边界重合即视为包含”,就坚持用
/<code>>=,不引入 epsilon - 若必须严格内部包含(不包含边界),改用
和 <code>>,并确保输入矩形已做std::nextafter类安全偏移(极少需要) - 避免混合整数与浮点比较:比如把
int坐标转double再比较,可能触发隐式转换精度丢失
嵌套调用与空矩形的防御性检查
实际代码中常遇到 width 或 <code>height 的无效矩形。它们是否该被任何矩形“包含”?标准答案是否定的——空矩形没有 interior,按定义无法被包含(除非你主动定义空集为子集)。
建议在 contains 函数开头加校验:
if (b.width <p>否则可能出现 <code>a.left=0, a.right=0</code> 导致 <code>a.left 成立,但这个 <code>a</code> 实际不构成有效区域。</code></p> <p>另外注意:C++ 没有内置矩形类型,<code>std::pair<:pair>, std::pair<int>></int></:pair></code> 这种嵌套写法易出错,优先封装成结构体并重载 <code>operator 或提供 <code>contains()</code> 成员函数。</code></p>
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










