Problem Description
Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The following figures are some famous examples you may know.
A ring is a 2-D figure bounded by two circles sharing the common center. The radius for these circles are denoted by r and R (r < R). For more details, refer to the gray part in the illustration below.
Matt just designed a new logo consisting of two rings with the same size in the 2-D plane. For his interests, Matt would like to know the area of the intersection of these two rings.
Input
The first line contains only one integer T (T ≤ 105), which indicates the number of test cases. For each test case, the first line contains two integers r, R (0 ≤ r < R ≤ 10).
Each of the following two lines contains two integers xi, yi (0 ≤ xi, yi ≤ 20) indicating the coordinates of the center of each ring.
Each of the following two lines contains two integers xi, yi (0 ≤ xi, yi ≤ 20) indicating the coordinates of the center of each ring.
Output
For each test case, output a single line “Case #x: y”, where x is the case number (starting from 1) and y is the area of intersection rounded to 6 decimal places.
Sample Input
2
2 3
0 0
0 0
2 3
0 0
5 0
Sample Output
Case #1: 15.707963
Case #2: 2.250778
两个圆环相交,然而我只有圆相交的板子
首先拿其中一个大圆A与另一个大圆B和小圆b算交面积,两者相减,求的是A与圆环Bb相交的面积 area1
然后拿小圆a另一个大圆B和小圆b算交面积,两者相减,求的是a与圆环Bb相交的面积,area2
我们输出area1-area2就行了
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 const double PI = acos(-1.0); 5 const double eps = 1e-8; 6 int dblcmp (double k) 7 { 8 if (fabs(k)<eps) return 0; 9 return k>0?1:-1; 10 } 11 struct Point 12 { 13 double x,y; 14 }; 15 double dis (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 double area_of_overlap (Point c1,double r1,Point c2,double r2)//圆相交模板 20 { 21 double d = dis(c1,c2); 22 if (r1+r2<d+eps) return 0; 23 if (d<fabs(r1-r2)+eps){ 24 double r = min(r1,r2); 25 return PI*r*r; 26 } 27 double x = (d*d+r1*r1-r2*r2)/(2*d); 28 double t1 = acos(x/r1); 29 double t2 = acos((d-x)/r2); 30 return r1*r1*t1+r2*r2*t2-d*r1*sin(t1); 31 } 32 int t; 33 int casee = 0; 34 int main() 35 { 36 //freopen("de.txt","r",stdin); 37 scanf("%d",&t); 38 while (t--){ 39 Point p1,p2; 40 double r1,r2; 41 scanf("%lf%lf",&r1,&r2); 42 scanf("%lf%lf",&p1.x,&p1.y); 43 scanf("%lf%lf",&p2.x,&p2.y); 44 if (dblcmp(r1-r2)>0) swap(r1,r2); 45 double ans = area_of_overlap (p1,r2,p2,r2) -area_of_overlap (p1,r2,p2,r1) 46 -(area_of_overlap (p1,r1,p2,r2) - area_of_overlap(p1,r1,p2,r1) ); 47 /*double ans = area (p1,r2,p2,r2) -area (p1,r2,p2,r1) 48 -(area(p1,r1,p2,r2) - area(p1,r1,p2,r1) );*/ 49 printf("Case #%d: %.6f ",++casee,ans); 50 } 51 return 0; 52 }