1. 矩形相交面积计算问题解析
在计算机编程和几何计算中,计算两个矩形的相交面积是一个经典问题。这个问题看似简单,但实际处理时需要考虑到多种边界情况和几何特性。下面我将详细解析这个问题的解决思路和实现方法。
1.1 问题描述与输入输出
给定平面上两个边平行于坐标轴的矩形,每个矩形由一对相对顶点的坐标确定。我们需要编写程序计算这两个矩形的相交面积,并将结果保留两位小数输出。
输入格式:
- 两行数据,每行描述一个矩形
- 每行包含四个浮点数,表示一对相对顶点的x,y坐标
输出格式:
- 一个实数,表示相交面积,保留两位小数
1.2 基本解题思路
计算两个轴对齐矩形的相交面积,核心在于确定相交区域的边界。相交区域本身也是一个矩形(可能退化为线段或点),其面积可以通过计算宽度和高度的乘积得到。
关键步骤:
- 确定每个矩形的左下和右上坐标
- 检查两个矩形是否有相交区域
- 计算相交矩形的左下和右上坐标
- 根据坐标计算相交区域的宽度和高度
- 计算并输出面积
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实现细节与错误修正
2.1 坐标标准化处理
由于输入给出的是任意一对相对顶点,我们需要先将其转换为标准的左下-右上表示形式:
cpp复制void normalizeRect(vector<pair<double,double>> &rect){
double x1 = rect[0].first, y1 = rect[0].second;
double x2 = rect[1].first, y2 = rect[1].second;
rect[0].first = min(x1,x2); // 左下x
rect[0].second = min(y1,y2); // 左下y
rect[1].first = max(x1,x2); // 右上x
rect[1].second = max(y1,y2); // 右上y
}
这个标准化步骤确保了无论输入顶点的顺序如何,我们都能得到一致的矩形表示。
2.2 相交检测逻辑
两个矩形不相交的情况有四种:
- 矩形B完全在矩形A的左侧
- 矩形B完全在矩形A的右侧
- 矩形B完全在矩形A的下方
- 矩形B完全在矩形A的上方
检测代码如下:
cpp复制if (B[1].first < A[0].first || // B在A左边
B[0].first > A[1].first || // B在A右边
B[1].second < A[0].second || // B在A下边
B[0].second > A[1].second) { // B在A上边
cout << "0.00" << endl;
return 0;
}
2.3 相交区域计算
相交区域的左下角是两个矩形左下角的较大值(更靠右上方),右上角是两个矩形右上角的较小值(更靠左下方):
cpp复制// 相交区域左下角
double left_x = max(A[0].first, B[0].first);
double le
