[CodeForces] Area of Two Circles’ Intersection

精度锅(
http://codeforces.com/contest/600/submission/14533609

#include 

using namespace std;

struct Circle{
    long double x,y;
    long double r;
};

///static long double pi = 3.1415926535897932384626433832795028841971693993751058;

long double calArea(Circle c1, Circle c2) {
    long double d;
    long double s, s1, s2, s3, angle1, angle2;

    d = sqrt((c1.x - c2.x) * (c1.x - c2.x) + (c1.y - c2.y) * (c1.y - c2.y));
    if(d >= (c1.r + c2.r))//两圆相离
        return 0;
    if((c1.r - c2.r) >= d)//两圆内含,c1大
        return acos(-1.0) * c2.r * c2.r;
    if((c2.r - c1.r) >= d)//两圆内含,c2大
        return acos(-1.0) * c1.r * c1.r;

    angle1 = acos((c1.r * c1.r + d*d - c2.r * c2.r) / (2 * c1.r * d));
    angle2 = acos((c2.r * c2.r + d*d - c1.r * c1.r) / (2 * c2.r * d));

    s1 = angle1 * c1.r * c1.r;
    s2 = angle2 * c2.r * c2.r;
    if (c1.r > c2.r)
        s3 = c1.r * d * sin(angle1);
    else
        s3 = c2.r * d * sin(angle2);
    s = s1 + s2 - s3;

    return s;
}
int main() {
    ios::sync_with_stdio(false);
    Circle c1, c2;
    cin >> c1.x >> c1.y >> c1.r;
    cin >> c2.x >> c2.y >> c2.r;
    printf("%.20lf", calArea(c1, c2));
	return 0;
}