Intersection

Time Limit: 4000/4000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others)
Total Submission(s): 602 Accepted Submission(s): 247

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.

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

题意

给你两个完全一样的圆环,圆环,圆环
因为很重要,所以要说三遍
然后求他们相交的面积

题解

那就直接套模板吧!!!
套板大作战,相交面积=大圆交-2*大小交+小交

代码

#define inf 0x7fffffff
#define exp 1e-10
#define PI 3.141592654
using namespace std;
typedef long long ll;
struct Point
{
    double x,y;
    Point (double x=0,double y=0):x(x),y(y){}
};
double dist(Point a,Point b)
{
    double x=(a.x-b.x)*(a.x-b.x);
    double y=(a.y-b.y)*(a.y-b.y);
    return sqrt(x+y);
}
double Area_of_overlap(Point c1,double r1,Point c2,double r2)
{
    double d=dist(c1,c2);
    if (r1+r2<d+exp) return 0;
    if (d<fabs(r1-r2)+exp)
    {
        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,ncase=1;
    double r,R;
    Point a,b;
    scanf("%d",&t);
    while (t--)
    {
        scanf("%lf%lf",&r,&R);
        scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
        double bb_area=Area_of_overlap(a,R,b,R);
        double bs_area=Area_of_overlap(a,R,b,r);
        double ss_area=Area_of_overlap(a,r,b,r);
        printf("Case #%d: %.6lf\n",ncase++,bb_area-2.0*bs_area+ss_area);
    }
    return 0;
}