矩形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 向下增长)。这样包含判断就是:
立即学习“C++免费学习笔记(深入)”;
bool contains(const Rect& a, const Rect& b) {
return a.left <= b.left && a.right >= b.right &&
a.top <= b.top && a.bottom >= 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。
解决方案不是加 epsilon(容易误判),而是明确设计契约:
- 若业务允许“边界重合即视为包含”,就坚持用
/<code>>=,不引入 epsilon - 若必须严格内部包含(不包含边界),改用
和 <code>>,并确保输入矩形已做std::nextafter类安全偏移(极少需要) - 避免混合整数与浮点比较:比如把
int坐标转double再比较,可能触发隐式转换精度丢失
嵌套调用与空矩形的防御性检查
实际代码中常遇到 width 或 <code>height 的无效矩形。它们是否该被任何矩形“包含”?标准答案是否定的——空矩形没有 interior,按定义无法被包含(除非你主动定义空集为子集)。
建议在 contains 函数开头加校验:
if (b.width <= 0 || b.height <= 0) return false; if (a.width <= 0 || a.height <= 0) return false;
否则可能出现 a.left=0, a.right=0 导致 a.left 成立,但这个 <code>a 实际不构成有效区域。
另外注意:C++ 没有内置矩形类型,std::pair<std::pair<int,int>, std::pair<int,int>> 这种嵌套写法易出错,优先封装成结构体并重载 operator<= 或提供 contains() 成员函数。


















