1. 程式人生 > >兩圓面積交

兩圓面積交

題目:poj2546求兩圓面積交
演算法
  兩圓的位置關係有5種,而這裡要求它們的面積交,分三種情況就可以了。
  第一,外離和外切,面積為0
  第二,內切和內含,面積為較小的圓的面積。
  第三,相交。我們可以把它們相交的面積分成兩個弓形,進而求這兩個弓形的面積。弓形的面積就是扇形的面積減去一個三角形的面積,三角形的面積可以用海倫公式,而對於扇形,我們要用餘弦定理先求出它的圓心角再acos一下就ok了。
Sample Input Sample Output
20.0 30.0 15.0 40.0 30.0 30.0 608.366

#include <bits/stdc++.h>
using namespace std;
#define Pi acos(-1.0)
using namespace std;
int main(){
    double x1,x2,r1,r2,y1,y2;//定義兩圓心及半徑
    while (scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&r1,&x2,&y2,&r2)!=EOF){//輸入
        double x=abs(x1-x2);    //求出X差
        double y=abs(y1-y2);    //求出Y差
        double l=sqrt(x*x+y*y); //求和距離
        if (r1<r2) swap(r1,r2); //保證R1<R2
        if (r1+r2<=l) printf("0.000\n");//兩圓分離
        else if (abs(r1-r2)>=l) printf("%.3f\n",Pi*min(r1*r1,r2*r2));//包含關係
        else {//否則就是相交
            double a=r1,b=r2,c=l;//A是半徑一,B是半徑二
            double A=acos((c*c+b*b-a*a)/(2*c*b));//讀出圓一的交弧角度
            double B=acos((c*c+a*a-b*b)/(2*c*a));//讀出圓二的交弧角度
            double s=(a+b+c)/2;         //求出三角形周長一半
            s=sqrt(s*(s-a)*(s-b)*(s-c));//海勒公式求面積,這個三角形是底是圓心距,高是連心線到交點垂線距
            double area=a*a*B+b*b*A-2*s;//求出答案
            printf("%.3f\n",area);      //輸出
        }//基本思路就是兩圓減去兩個三角形
    }
    return 0;
}