hdu 5120 Intersection(求相交圓的面積)
阿新 • • 發佈:2019-01-05
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; double S1,S2,S3,a1,a2,d,p,ans,mi; int x1,yy,x2,y2; struct circle { double x,y,r; }; double area(int rrr,int RRR)//兩圓相交的面積 { circle a,b; a.x=x1; a.y=yy; b.x=x2; b.y=y2; a.r=rrr; b.r=RRR; d=(double)sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); mi=min(a.r,b.r); if(d>a.r+b.r||d==a.r+b.r) ans=0.0; else if(d<abs(a.r-b.r)||d==abs(a.r-b.r)) ans=acos(-1.0)*mi*mi; else { p=(a.r+b.r+d)/2.0; a1=acos((a.r*a.r+d*d-b.r*b.r)/(2.0*a.r*d)); a2=acos((b.r*b.r+d*d-a.r*a.r)/(2.0*b.r*d)); S1=a1*a.r*a.r; S2=a2*b.r*b.r; S3=2*sqrt(p*(p-a.r)*(p-b.r)*(p-d)); ans=S1+S2-S3; } return ans; } int main() { int casen; cin>>casen; for(int tt=1;tt<=casen;tt++) { int rr,RR; cin>>rr>>RR; cin>>x1>>yy>>x2>>y2; double BB=area(RR,RR); double Bb=area(RR,rr); double bB=area(rr,RR); double bb=area(rr,rr); double Ans=BB-Bb-bB+bb; printf("Case #%d: %.6lf\n",tt,Ans); } return 0; }