题目描述*:
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.
输入描述:
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.
输出描述:
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
具体代码:
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
double p=3.14159265358;
double shan(double x1, double y1,double r1, double x2,double y2, double r2)
{
double d = sqrt((x1-x2)*(x1-x2)*1.0 +1.0* (y1-y2)*(y1-y2));
if (d >= r1+r2)
return 0;
if (r1>r2)
{
double t = r1;
r1 = r2;
r2 = t;
}
if(r2 - r1 >= d)
return p*r1*r1*1.0;
double a;
a=(r1+r2+d)/2;
double an1=acos((r1*r1*1.0+d*d-r2*r2*1.0)/(2*r1*d));
double an2=acos((r2*r2*1.0+d*d-r1*r1*1.0)/(2*r2*d));
return an1*r1*r1*1.0 + an2*r2*r2*1.0 - 2*sqrt(a*(a-r1)*(a-r2)*(a-d));
}
int main()
{
int n;
cin>>n;
int o=1;
while(n--)
{
int r1,r2;
scanf("%d%d",&r1,&r2);
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
double k;
double h;
h=(y2-y1)*(y2-y1)*0.1+(x2-x1)*(x2-x1)*0.1;
k=sqrt(h);
double z,c,v;
double s,l,m,g;
z=shan(x1,y1,r1,x2,y2,r1);
c=shan(x1,y1,r2,x2,y2,r2);
v=shan(x1,y1,r1,x2,y2,r2);
printf("Case #%d: %.6f\n",o,c-2*v+z);
o++;
continue;
}
return 0;
}