給定兩個邊平行於坐標軸的矩形,各自通過對角線上的兩點座標確定。輸入為 8 個數字:x1, y1, x2, y2 (第一個矩形),x3, y3, x4, y4 (第二個矩形)。要求計算兩矩形相交部分的面積,精確到小數點後兩位。若不相交或僅邊界接觸,面積為 0。
矩形相交區域同樣是矩形(或退化為線段/點)。其左下角座標為兩矩形左下角的最大值,右上角座標為兩矩形右上角的最小值:
max(x1, x3)max(y1, y3)min(x2, x4)min(y2, y4)若左邊界 ≥ 右邊界或下邊界 ≥ 上邊界,則無有效相交區域,面積為 0。
輸入的對角線兩點順序不固定,需先標準化:確保 x1 ≤ x2, y1 ≤ y2 (同理第二矩形),即將較小值作為左下角,較大值作為右上角。
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
int main() {
double x1, y1, x2, y2, x3, y3, x4, y4;
while (cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4) {
// 標準化座標:確保 (x1,y1) 為左下,(x2,y2) 為右上
if (x1 > x2) swap(x1, x2);
if (y1 > y2) swap(y1, y2);
if (x3 > x4) swap(x3, x4);
if (y3 > y4) swap(y3, y4);
// 計算相交區域邊界
double left = max(x1, x3);
double bottom = max(y1, y3);
double right = min(x2, x4);
double top = min(y2, y4);
// 判斷是否相交並計算面積
double area = 0.0;
if (left < right && bottom < top) {
area = (right - left) * (top - bottom);
}
cout << fixed << setprecision(2) << area << endl;
}
return 0;
}
輸入: 1.00 1.00 3.00 3.00 2.00 2.00 4.00 4.00 5.00 5.00 13.00 13.00 4.00 4.00 12.50 12.50 輸出: 1.00 56.25
< 而非 ≤。fixed << setprecision(2)。此題考察基本幾何邏輯與邊界處理,代碼簡潔高效,是計算幾何入門的經典練習。