HDU 5120 Intersection(2014亚洲区北京站现场赛)

来源:互联网 发布:mac能做什么 编辑:程序博客网 时间:2024/05/16 09:00

圆环相交面积,模板题

#include <iostream>#include <cmath>#include<cstdio>using namespace std;const double pi=acos(-1.0);const double eps=1e-10;struct point{    double x,y;};struct circle{    point centre;    double r;};double dist(point a,point b){    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}//??bool contain(circle a,circle b){    double len=dist(a.centre,b.centre);    double mini=min(a.r,b.r),maxi=max(a.r,b.r);    if(len+mini<=maxi)    {        /*printf("%.3lf\n",pi*mini*mini);*/return true;    }    return false;}// ?????? , ????int intersect(point c1,double r1,point c2,double r2){    return dist(c1,c2)<r1+r2+eps && dist(c1,c2)>fabs(r1-r2)-eps;}double circle_area(double x1,double y1,double r1,double x2,double y2,double r2){    circle aa,bb;    aa.centre.x=x1,aa.centre.y=y1,aa.r=r1;    bb.centre.x=x2,bb.centre.y=y2,bb.r=r2;    if(contain(aa,bb))    {        double len1=dist(aa.centre,bb.centre);        double mini1=min(aa.r,bb.r),maxi1=max(aa.r,bb.r);        return pi*mini1*mini1;    }    if(intersect(aa.centre,aa.r,bb.centre,bb.r)==0)    {        return 0;    }    double len=dist(aa.centre,bb.centre);    double d=2*acos((aa.r*aa.r+len*len-bb.r*bb.r)/(2*aa.r*len));    double d2=2*acos((bb.r*bb.r+len*len-aa.r*aa.r)/(2*bb.r*len));    double area1=aa.r*aa.r*d/2-aa.r*aa.r*sin(d)/2;    double area2=bb.r*bb.r*d2/2-bb.r*bb.r*sin(d2)/2;    double area=area1+area2;    return area;}int main(){    int T,num=0;    double rr,RR,xx1,yy1,xx2,yy2;    double Area1,Area2,Area3;    scanf("%d",&T);    while(T--)    {        num++;        scanf("%lf %lf",&rr,&RR);        scanf("%lf %lf",&xx1,&yy1);        scanf("%lf %lf",&xx2,&yy2);        Area1=circle_area(xx1,yy1,RR,xx2,yy2,RR);        Area2=circle_area(xx1,yy1,RR,xx2,yy2,rr);        Area3=circle_area(xx1,yy1,rr,xx2,yy2,rr);        printf("Case #%d: %.6lf\n",num,Area1-2*Area2+Area3);    }    return 0;}
0 0
原创粉丝点击