hdu 5120 Intersection(兩圓相交面積)(模板)
阿新 • • 發佈:2019-01-03
Intersection
題目連結:
解題思路:
在紙上畫畫圖,不難發現,根據容斥定理:所要求的面積為兩外環的交集(ans1)-外環和內環的交集(ans2*2,對稱)+兩內環的
交集(多減去的部分,現在補上)。
AC程式碼:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const double eps = 1e-6; const double pi = acos(-1.0); struct Point{ double x,y; Point(double x = 0,double y = 0):x(x),y(y){} // 建構函式,方便程式碼編寫 }; double dis(Point p1,Point p2){ return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); } double area(Point c1,double r1,Point c2,double r2){ double d = dis(c1,c2); if (r1+r2 < d+eps) return 0;//相離 if (d < fabs(r1-r2)+eps){//內含 double r = min(r1,r2); return pi*r*r; } double x = (d*d+r1*r1-r2*r2)/(2*d); double t1 = acos(x/r1); double t2 = acos((d-x)/r2); return r1*r1*t1+r2*r2*t2-d*r1*sin(t1);//相交 } int main(){ int T,t = 1; scanf("%d",&T); while(T--){ Point p1,p2; double r1,r2; scanf("%lf%lf%lf%lf%lf%lf",&r1,&r2,&p1.x,&p1.y,&p2.x,&p2.y); double ans1 = area(p1,r2,p2,r2); double ans2 = area(p1,r1,p2,r2); double ans3 = area(p1,r1,p2,r1); printf("Case #%d: %.6lf\n",t++,ans1-2*ans2+ans3); } return 0; }