重叠面积为0;当任一矩形左边界≥另一右边界,或上边界≤另一下边界时,两矩形不相交,重叠区域不存在。

重叠区域不存在时直接返回0
两个矩形不相交时,重叠面积为0。判断依据是:任一矩形的左边界 ≥ 另一个的右边界,或上边界 ≤ 另一个的下边界(注意坐标系——通常y轴向下为正时,“上”对应更小的y值;但多数算法题默认y轴向上,即top > bottom)。实际编码前先统一坐标约定:假设每个矩形由(x1, y1)(左下)、(x2, y2)(右上)表示,且满足x1 、<code>y1 。
常见错误是未处理浮点精度或整数溢出导致的边界误判,尤其当输入来自文件解析或网络传输时,建议先用std::min/std::max做一次归一化:
double left = std::max(r1.x1, r2.x1); double right = std::min(r1.x2, r2.x2); double bottom = std::max(r1.y1, r2.y1); double top = std::min(r1.y2, r2.y2);
计算有效重叠宽高并相乘
只有当left 且 <code>bottom 时,重叠区域才存在。此时宽度为<code>right - left,高度为top - bottom,面积就是二者乘积。别忘了用std::max(0.0, ...)兜底,避免负值参与运算:
- 若使用整数坐标且要求整数面积,需确保差值非负后再转
int,否则截断会掩盖逻辑错误 - 若矩形以中心+宽高方式存储(如
cx, cy, w, h),先转成左下/右上再算,别在原格式上硬套公式 - 某些图形库(如OpenCV)的
cv::Rect默认y向下增长,此时“top”实际是较小y值,需交换比较逻辑
处理浮点矩形时注意精度与比较方式
用double或float表示坐标时,直接用或<code>==判断边界相等不可靠。例如两个矩形刚好边对边,理论上重叠面积为0,但因浮点误差可能算出极小正值。稳妥做法是引入容差(epsilon):
const double eps = 1e-9;
double width = std::max(0.0, right - left);
if (width <p>不过多数业务场景(如UI布局、游戏碰撞检测)直接用<code>std::max(0.0, ...)</code>已足够——因为只要数值小于0,就说明无重叠,无需纠结是-1e-15还是-0.1。</p><h3>用STL算法简化重复逻辑</h3><p>如果频繁计算多个矩形两两重叠,可把核心逻辑封装成函数,并利用<code>std::clamp</code>(C++17起)替代手写<code>std::max</code>/<code>std::min</code>:</p><pre class="brush:php;toolbar:false;">auto overlap_area = [](const Rect& a, const Rect& b) -> double {
double w = std::max(0.0, std::min(a.x2, b.x2) - std::max(a.x1, b.x1));
double h = std::max(0.0, std::min(a.y2, b.y2) - std::max(a.y1, b.y1));
return w * h;
};注意std::clamp在这里不适用,因为它限制单个值在区间内,而我们需要的是两个区间的交集长度。别混淆概念。
真正容易被忽略的是坐标系一致性——同一个项目里混用“左下为原点”和“左上为原点”的矩形定义,会导致y方向逻辑全错,而且这种bug很难通过单元测试一眼发现。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











