C-求两圆相交的面积

题解

       计算几何,真心没经验/(ㄒoㄒ)/~~。

       网上很多博客说这是一题模板题,也确实是,不过憋了十多分钟还是没憋出来,我是参照另一篇题解,在此就不做过多赘述,以免复制。

       https://blog.csdn.net/hactrox/article/details/38397555

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

const double pi = acos(-1);
int x2, y2, r2, x3, y3, r3;

double area(int x2, int y2, int r2, int x3, int y3, int r3)
{
    r2 = (double) r2;
    r3 = (double) r3;
    // 两个半径之和 
    double p = r2 + r3;
    // 圆心之间的距离 
    double d = sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3));
    // 分离 + 相切 
    if (d >= p) {
        return 0;
    }
    // 内含 
    if (d <= abs(r2 - r3)) {
        int r = min(r2, r3);
        return pi * r * r;
    }
    // 相交
    double angle1 = acos((r2 * r2 + d * d - r3 * r3) / (2 * r2 * d));
    double angle2 = acos((r3 * r3 + d * d - r2 * r2) / (2 * r3 * d));
    double angle3 = sin(angle1);
    return r2 * r2 * angle1 + r3 * r3 * angle2 - r2 * d * angle3;
}

int main()
{
    scanf("%d%d%d%d%d%d", &x2, &y2, &r2, &x3, &y3, &r3);
    double ar = area(x2, y2, r2, x3, y3, r3);
    printf("%.2f\n", ar);
    return 0;
}

 

posted @ 2020-11-01 16:29  Fool_one  阅读(405)  评论(0编辑  收藏  举报