1. 程式人生 > >兩圓求面積問題

兩圓求面積問題

已知兩個圓的圓心半徑,求兩圓所覆蓋的面積

注意這裡兩圓的位置有三大類別:

I 相離或外切

II 內切或包含

III 相交

但是相交需要兩種算面積的方式

這裡需要用到三角函式和反三角函式以及明確反三角函式的定義域等知識點

廢話不多說(也沒啥好多說的),上程式碼。程式碼已在DEV C++編譯通過(gcc環境)

#include"iostream" #include"math.h"  using namespace std; int main(){     double x1,y1,r1,x2,y2,r2;     cin>>x1>>y1>>r1>>x2>>y2>>r2;//兩圓的圓心和半徑      double d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));     double judge=r1+r2-d;     double area=0;     double PI=3.141592653589;     if(judge<0.0000001)     {         //相離或外切          area = r1*r1*PI+r2*r2*PI;         return area;     }     else if(r1-(r2+d)>-0.0000001||r2-(r1+d)>-0.0000001){         //內切或包含          if(r1>r2){             area=r1*r1*PI;             return area;         }         else{             area=r2*r2*PI;             return area;         }     }     else{         double cos1=(r1*r1+d*d-r2*r2)/(2.0*r1*d);         double cos2=(r2*r2+d*d-r1*r1)/(2.0*r2*d);         if(cos1>0&&cos2>0){             //相交情形1              double alfa1=2*acos(cos1);             double alfa2=2*acos(cos2);             double sin1=sin(alfa1);             double sin2=sin(alfa2);             double publicarea = (0.5*alfa2*r2*r2-0.5*r2*r2*sin2)+(0.5*alfa1*r1*r1-0.5*r1*r1*sin1);             area = r1*r1*PI+r2*r2*PI-publicarea;             cout<<area;         }         else{             //相交情形2              double sin1=sqrt(1-cos1*cos1);             double sin2=sqrt(1-cos2*cos2);             double alfa1=2*asin(sin1);             double alfa2=2*asin(sin2);             if(alfa1<alfa2){                 area=r1*r1*PI+((0.5*alfa2*r2*r2-0.5*r2*r2*sin(alfa2))-(0.5*alfa1*r1*r1-0.5*r1*r1*sin(alfa1)));                 cout<<area;             }             else{                 area=r2*r2*PI+((0.5*alfa1*r1*r1-0.5*r1*r1*sin(alfa1))-(0.5*alfa2*r2*r2-0.5*r2*r2*sin(alfa2)));                 cout<<area;             }         }     }     return 0; }