#include <iostream> #include <cstdio> #include <cmath> //hdu 1798 两圆相交的面积 using namespace std; const static double PI = acos(-1.0); inline double area(double r)//返回圆的面积 { return PI*r*r; } inline double maxx(double x,double y)//求最小值 { return x>y?y:x; } inline double distance(double x,double y ,double xx,double yy)//求两点距离 { return sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy)); } inline int isunion(double x,double y,double r, double xx,double yy,double rr)//判断两圆位置关系 { double dist = distance(x,y,xx,yy); if(dist>=r+rr) return 1; else if(dist>=r&&dist>=rr) return 2; else if(dist>fabs(r-rr)) return 3; else return 4; } inline double areatemp(double r,double x)//对半径为r,且圆心到相交弦的距离为x时,扇形面积 { return r*r*acos(x/r); } inline double areas(double x,double y,double r, double xx,double yy,double rr)//相交面积计算,因为多考虑了,所以有相同部分。 { double dist = distance(x,y,xx,yy); double temp,temps; switch(isunion(x,y,r,xx,yy,rr)) { case 1: return 0;break; case 4: return maxx(area(r),area(rr));break; case 2: temp = (r*r+dist*dist-rr*rr)/2.0/dist; temps = sqrt(r*r-temp*temp); return -temps*dist +areatemp(r,temp)+areatemp(rr,dist-temp);break; case 3: temp = (r*r+dist*dist-rr*rr)/2.0/dist; temps = sqrt(r*r-temp*temp); return -temps*dist + areatemp(r,temp)+areatemp(rr,dist-temp);break; } } int main() { double x,y,r,xx,yy,rr; while(scanf("%lf%lf%lf%lf%lf%lf",&x,&y,&r,&xx,&yy,&rr)!=EOF) { //double te = areas(x,y,r,xx,yy,rr); printf("%.3lf\n",areas(x,y,r,xx,yy,rr)); } return 0; }
hdu 1798 两圆相交
最新推荐文章于 2021-03-26 20:37:11 发布