TOJ 1754 Circular Area 两圆相交的面积

题意

题目链接:TOJ 1754 Circular Area
就是给出两个圆的圆心坐标和半径,求出俩圆的相交的面积。

SampleInput
20.0 30.0 15.0 40.0 30.0 30.0

SampleOutput
608.366

思路

几何问题
两个圆相含和相离不用多说了–相交就用俩扇形减去那个四边形就行。
注:求角的时候可以使用反三角函数,可以使用直角三角形计算

d2+t2=r21
(ld)2+t2=r22    其中  l  是俩圆心的距离,d是其中一个圆心到两圆交点连线的中点的距离、

这样计算可以避免二次方程。

代码

/*Accepted  1754    C++ 0.7K    0'00.00" 1364K*
#include <iostream>
#include <cmath>
#include <stdio.h>
using namespace std;

int main()
{
    double x1,y1,r1,x2,y2,r2,d,l;
    while(cin>>x1>>y1>>r1>>x2>>y2>>r2)
    {
        l=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
        if(l>=(r1+r2)) printf("0.000\n");// 两圆相离
        else if(l<=r2-r1)printf("%.3lf\n",3.141592653*r1*r1);//r2包含r1
        else if(l<=r1-r2)printf("%.3lf\n",3.141592653*r2*r2);//r1包含r2
        else{//相交

        double angle1=acos((l*l-r2*r2+r1*r1)/(2*l*r1));//夹角的一半
        double angle2=acos((l*l-r1*r1+r2*r2)/(2*l*r2));
        double s1=angle1*r1*r1;
        double s2=angle2*r2*r2;
        double s3=l*r1*sin(angle1);
        printf("%.3lf\n",s1+s2-s3);
        }

    }
}

你可能感兴趣的:(ACM)