已知兩圓圓心坐標和半徑,求相交部分面積:
1 #include <iostream>
2 using namespace std; 3 #include<cmath>
4 #include<stdio.h>
5 #define PI 3.141593
6 struct point//點
7 { 8 double x,y; 9 }; 10 struct circle//圓
11 { 12 point center; 13 double r; 14 }; 15 float dist(point a,point b)//求圓心距
16 { 17 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 18 } 19
20 int main() 21 { 22 circle a,b; 23 while(cin>>a.center.x>>a.center.y>>a.r>>b.center.x>>b.center.y>>b.r) 24 { 25 if((dist(a.center,b.center)+min(a.r,b.r))<=max(a.r,b.r))//兩圓內交或包含
26 { 27 if(a.r<b.r) printf("%.3lf\n",PI*a.r*a.r); 28 else printf("%.3lf\n",PI*b.r*b.r); 29 } 30 else if(dist(a.center,b.center)>=(a.r+b.r))//兩圓外交或相離
31 cout<<"0.000"<<endl; 32 else
33 { 34 double length=dist(a.center,b.center); 35 double d1=2*acos((a.r*a.r+length*length-b.r*b.r)/(2*a.r*length)); //求兩扇形圓心角
36 double d2=2*acos((b.r*b.r+length*length-a.r*a.r)/(2*b.r*length)); 37 double area1=a.r*a.r*d1/2-a.r*a.r*sin(d1)/2; 38 //根據圓心角求扇形面積,減去三角形面積,得到相交部分面積 39 //扇形面積:S=PI*r*r*θ/(2*PI) 三角形面積:S=1/2*a*c*sin(B)
40 double area2=b.r*b.r*d2/2-b.r*b.r*sin(d2)/2; 41 double area=area1+area2; 42 printf("%.3lf\n",area); 43 } 44 } 45 return 0; 46 }