天天看點

求兩圓相交部分面積 c++

【問題描述】

  給定平面上兩個圓,求它們的公共部分的面積。

求兩圓相交部分面積 c++

【輸入格式】

一行有6個實數:x1,y1,r1,x2,y2,r2。其中r1,r2>0。

【輸出格式】

輸出公共部分面積。

【輸入樣例】

20.0 30.0 15.0 40.0 30.0 30.0

【輸出樣例】

608.366

#include<cstdio>
#include<cmath>
double q,w,m,n,a,b,c,x,y,z,PI;
int main()
{
    //freopen("in.txt","r",stdin);
    PI=*asin();
    scanf("%lf%lf%lf",&a,&b,&c);
    scanf("%lf%lf%lf",&x,&y,&z);

        double l=sqrt((a-x)*(a-x)+(b-y)*(b-y));//計算圓心距

        if(l>=c+z||!c||!z) x=; //如果兩圓相離、外切或至少一圓半徑為時,那麼所求面積為

        else if(l<=fabs(z-c))   //如果兩内切或内含,那麼所求面積為小圓面積
        {
            if(z>c)z=c;
            x=z*z*PI;
        }
        //如果兩圓相交,面積求解如下
        else
        {
            //由餘弦定理求出公共弦在圓o1中對應的圓心角的一半    a^+b^-c^=*a*b*cos(C)
            b=acos((l*l+c*c-z*z)/(*l*c));
            //由餘弦定理求出公共弦在圓o2中對應的圓心角的一半
            y=acos((l*l+z*z-c*c)/(*l*z));
            //計算圓o1中扇形面積
            m=b*c*c;
            //計算圓o2中扇形面積
            n=y*z*z;
            //計算圓o1中扇形所對應的三角形面積
            q=c*c*sin(b)*cos(b);
            //計算圓o2中扇形所對應的三角形面積
            w=z*z*sin(y)*cos(y);
            //q+w為圖中四邊形面積,兩扇形面積之和與四邊形面積之差即為
            //所求面積。在圖中y為鈍角,計算出的面積w為負值,這時q+w
            //表示兩三角面積之差,剛好還是四邊形面積,是以對于圖和圖
            //不必分情況讨論
            x=m+n-(q+w);
        }
        printf("%.3f",x);
    return ;
}