hdu 5120(2014北京—求圆相交)

题意:求环的相交面积

思路:

通过画图可知,面积= 大圆相交面积 - 大小圆相交面积*2 + 小小圆相交面积  再通过圆相交模板计算即可

 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
#define PI 3.141592654
double dis(double x1,double y1,double x2,double y2)
{
    double x = (x1-x2)*(x1-x2);
    double y = (y1-y2)*(y1-y2);
    return sqrt(x + y);
}

double overload(int x1,int y1,int r1,int x2,int y2,int r2)   //r1^2 - x^2 = r2^2 - (len-x)^2
{
    double len = dis(x1,y1,x2,y2);
    if (r1+r2<len + 1e-10) return 0;
    if (len<fabs(r1-r2+1e-10))
    {
        double r=min(r1,r2);
        return PI*r*r;
    }
    double x=(len*len+r1*r1-r2*r2)/(2*len);
    double t1=acos(x/r1);
    double t2=acos((len-x)/r2);
    return r1*r1*t1+r2*r2*t2-len*r1*sin(t1);

}

int main()
{
    int T;
    int cas = 1;
    scanf("%d",&T);
    while(T--)
    {
        double x1,x2,y1,y2;
        double r,R;
        scanf("%lf%lf",&r,&R);
        scanf("%lf%lf",&x1,&y1);
        scanf("%lf%lf",&x2,&y2);
        double bb_area = overload(x1,y1,R,x2,y2,R);
        double bs_area = overload(x1,y1,R,x2,y2,r);
        double ss_area = overload(x1,y1,r,x2,y2,r);
        double ans = bb_area - bs_area*2 + ss_area;
        printf("Case #%d: %.6lf\n",cas++,ans);
    }
    return 0;
}

  

posted @ 2015-10-06 17:34  Przz  阅读(153)  评论(0编辑  收藏  举报