两圆相交面积

#include <cstdio>
#include <cmath>

using namespace std;

const double PI = acos(-1);

struct Point {
    double x, y;
};

struct Round {
    Point o;
    double r;
};

double Cos(double a, double b, double c) {
    return (a * a + b * b - c * c) / (2.0 * a * b);
}

double Distance(Point a, Point b) {
    double dx = a.x - b.x, dy = a.y - b.y;
    return sqrt(dx * dx + dy * dy);
}

double Intersection(Round a, Round b) {
    double d = Distance(a.o, b.o);
    if (d >= a.r + b.r)return 0;
    if (a.r >= b.r + d)return PI * b.r * b.r;
    if (b.r >= a.r + d)return PI * a.r * a.r;
    double radian_a = acos(Cos(d, a.r, b.r)) * 2;
    double radian_b = acos(Cos(d, b.r, a.r)) * 2;
    double h = a.r * sin(radian_a / 2);
    return (radian_a / 2) * a.r * a.r + (radian_b / 2) * b.r * b.r - d * h;
}

signed main() {
//    freopen("in", "r", stdin), freopen("out", "w", stdout);
    int Ts, Tp = 0;
    scanf("%d", &Ts);
    while (Ts--) {
        double r, R;
        scanf("%lf %lf", &r, &R);
        double x1, y1;
        scanf("%lf %lf", &x1, &y1);
        double x2, y2;
        scanf("%lf %lf", &x2, &y2);
        Round A = {{x1, y1}, R}, B = {{x2, y2}, R}, a = {{x1, y1}, r}, b = {{x2, y2}, r};
        printf("Case #%d: %lf\n", ++Tp,
               Intersection(A, B) - Intersection(A, b) - Intersection(a, B) + Intersection(a, b));
    }
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值