求兩圓相交部分面積(C++)


已知兩圓圓心坐標和半徑,求相交部分面積:

 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM