兩圓相交求面積c++

Rain_mk發表於2020-11-21

題目

給定2圓的圓心座標和半徑,計算並輸出兩圓相交的面積,如果是外切或不相交,則輸出0,圓周率取函式值acos(-1)。

輸入格式:

輸入6個整數x1 y1 r1 x2 y2 r2,分別表示兩圓的圓心(x1,y1),(x2,y2)和半徑r1,r2。

輸出格式:

根據圓的位置關係,輸出其相交部分的面積(保留2位小數)。

輸入樣例:

在這裡給出2組輸入。例如:
0 0 1 2 2 1
2 0 2 5 2 3

輸出樣例:

在這裡給出相應的輸出。例如:
0.00
3.22

//此處PI值為acos(-1)
//扇形面積 α * r * r / 2
//求角度cos(A) = (b * b + c * c - a * a) / (2 * b * c)
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define lowbit(x) ((x) & (-x))
#define PI acos(-1)
const int inf = 0x3f3f3f3f;
const int N = 500010;

struct circle {
    int x, y, r;
};

double dis(circle a, circle b) {
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    circle a, b;
    cin >> a.x >> a.y >> a.r;
    cin >> b.x >> b.y >> b.r;
    double len = dis(a, b);
    if (len + min(a.r, b.r) <= max(a.r, b.r)) {
        if (a.r < b.r)
            printf("%.2f", PI * a.r * a.r);
        else
            printf("%.2f", PI * b.r * b.r);
    } else if (len >= a.r + b.r) {
        cout << "0.00";
    } else {
        double d1 = 2 * acos((a.r * a.r + len * len - b.r * b.r) / (2 * a.r * len));
        double d2 = 2 * acos((b.r * b.r + len * len - a.r * a.r) / (2 * b.r * len));
        double area1 = d1 * a.r * a.r / 2 - a.r * a.r * sin(d1) / 2;
        double area2 = d2 * b.r * b.r / 2 - b.r * b.r * sin(d2) / 2;
        printf("%.2f", area1 + area2);
    }

    return 0;
}

相關文章