HDU5120(几何)

来源:互联网 发布:死亡天使蘑菇 淘宝 编辑:程序博客网 时间:2024/05/17 01:10

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5120

题意:求两圆环相交面积,模板题。

#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const double eps = 1e-8;const double pi = acos(-1.0);int sgn(double x){    if(fabs(x) <= eps)        return 0;    return x > 0 ? 1 : -1;}struct node{    double x,y;};double dis(node a,node b){    return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));}double Area(node p1,double r1,node p2,double r2){    double d = dis(p1,p2);    if(sgn(r1 + r2 - d < 0))        return 0;    if(sgn(d - fabs(r1 - r2)) <= 0)    {        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(){    int T,cas=1;    scanf("%d",&T);    while(T--)    {        double r,R;        scanf("%lf %lf",&r,&R);        node p1,p2;        scanf("%lf %lf",&p1.x,&p1.y);        scanf("%lf %lf",&p2.x,&p2.y);        double s1 = Area(p1,R,p2,R);        double s2 = Area(p1,r,p2,r);        double s3 = Area(p1,R,p2,r);        printf("Case #%d: %.6lf\n",cas++,s1+s2-2*s3);    }    return 0;}


0 0
原创粉丝点击