hdu 5120

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5120

题意:求两圆环的相交面积,注意是圆环,运用求两圆相交的模板,推出公式 圆环面积交=大圆大圆面积交-2×大圆小圆面积交+小圆小圆面积交。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define exp 1e-10
#define PI acos(-1.0)
using namespace std;
typedef long long ll;
struct Point//圆心的X和Y值
{
    double x,y;
    Point (double x=0,double y=0):x(x),y(y){}
};
double dist(Point a,Point b)//圆心距
{
    double x=(a.x-b.x)*(a.x-b.x);
    double y=(a.y-b.y)*(a.y-b.y);
    return sqrt(x+y);
}
double area(Point c1,double r1,Point c2,double r2)
{
    double d=dist(c1,c2);
    if (r1+r2<d+exp) return 0;//相离
    if (d<fabs(r1-r2)+exp)//内含
    {
        double r=min(r1,r2);
        return PI*r*r;
    }
    double x=(d*d+r1*r1-r2*r2)/(2*d);
    double t1=acos(x/r1);
    double t2=acos((d-x)/r2);
    return r1*r1*t1+r2*r2*t2-d*r1*sin(t1);//相交
}
int main()//hdu5120 求圆环的相交部分
{
    int T,ca=1;
    double r,R;//小圆半径,大圆半径
    Point a,b;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lf%lf",&r,&R);
        scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
        double bb=area(a,R,b,R);
        double bs=area(a,R,b,r);
        double ss=area(a,r,b,r);
        printf("Case #%d: %.6lf\n",ca++,bb-2.0*bs+ss);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值