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

来源:互联网 发布:淘宝贷款关闭后果严重 编辑:程序博客网 时间:2024/06/04 00:58

题意:求环的相交面积

思路:

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

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;typedef long long ll;#define PI 3.141592654double 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;}



0 0
原创粉丝点击