兩圓面積交
阿新 • • 發佈:2018-12-11
題目: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; }