ZOJ 1597 Circular Area(POJ 2546)(两个圆的位置关系)

圆的位置关系,按照两个圆的圆心间距 d 由远到近的顺序,可分为:

(两圆半径,R >= r)

相离,d > R+r;

相外切,d = R+r;

相交,R-r < d < R+r;

相内切,d = R-r;

内含:d < R-r。

 

本题要求输出两个圆相交的面积,所以需要先判断两个圆的位置关系,然后根据情况计算就可以了,不过相交的情况需要注意,看下面的图就懂了。

 

ZOJ 1597 Circular Area(POJ 2546)(两个圆的位置关系)_第1张图片

 

代码:

 

#include<iostream> #include<stdio.h> #include<math.h> using namespace std; #define esp 0.000000001 #define pi 3.1415926 struct crl { double x,y; double r; }; double dis(crl c1,crl c2) { return sqrt(pow(c1.x-c2.x,2)+pow(c1.y-c2.y,2)); } int main() { crl c1,c2; while(~scanf("%lf%lf%lf%lf%lf%lf",&c1.x,&c1.y,&c1.r,&c2.x,&c2.y,&c2.r)) { if(c1.r<c2.r)swap(c1,c2); //c1是较大的圆 double d=dis(c1,c2); double s=0.0; if(d>c1.r+c2.r || fabs(d-c1.r-c2.r)<esp)s=0.0; else if(d>fabs(c1.r-c2.r) && d<c1.r+c2.r) { double b=(d*d+c1.r*c1.r-c2.r*c2.r)/(2*d); double a=sqrt(c1.r*c1.r-b*b); double s1=pi*c1.r*c1.r*(atan(a/b)/pi)-a*b; double s2=pi*c2.r*c2.r*( atan( a/fabs(d-b) )/pi )-a*fabs(d-b); if(b>d) s=s1+pi*c2.r*c2.r-s2; else s=s1+s2; } else s=pi*c2.r*c2.r; printf("%.3f/n",s); } return 0; } 

 

你可能感兴趣的:(c,struct)