/* ID: espr1t LANG: C++ TASK: Ifrit Bomber 2 KEYWORDS: Geometry, Circle intersection */ #include #include #include #include #include #include #include #include #include #include #include #define MAX 1024 #define EPS 0.000000001 #define PI 3.1415926535897 using namespace std; FILE *in; FILE *out; double fdist(double x1, double y1, double x2, double y2) { return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); } double calcHeight(double r, double d) { return sqrt(r * r - d * d); } double eval(double r1, double r2, double d) { double ans = 0.0; ans += PI * r1 * r1; ans += PI * r2 * r2; if (r1 + r2 < d + EPS) return ans; if (r1 + EPS > d + r2) return PI * r1 * r1; if (r2 + EPS > d + r1) return PI * r2 * r2; if (r1 < r2) swap(r1, r2); double left = max(0.0, d - r2), right = r1; for (int iter = 0; iter < 200; iter++) { double mid = (left + right) / 2.0; double h1 = calcHeight(r1, mid); double h2 = calcHeight(r2, fabs(d - mid)); if (h1 > h2) left = mid; else right = mid; } double height = calcHeight(r1, left); double angle1 = asin(height / r1); double angle2 = asin(height / r2); if (left < d + EPS) { ans -= angle1 * r1 * r1; ans += height * left; ans -= angle2 * r2 * r2; ans += height * fabs(d - left); } else { ans -= PI * r2 * r2; ans -= angle1 * r1 * r1; ans += height * left; ans += angle2 * r2 * r2; ans -= height * fabs(d - left); } return ans; } double inter(double r1, double r2, double d) { return PI * r1 * r1 + PI * r2 * r2 - eval(r1, r2, d); } int main(void) { in = stdin; out = stdout; in = fopen("circles.in", "rt"); out = fopen("circles.out", "wt"); double ans = 0; double d, r1, r2, R1, R2; double x1, y1, x2, y2; fscanf(in, "%lf %lf %lf %lf", &x1, &y1, &r1, &R1); fscanf(in, "%lf %lf %lf %lf", &x2, &y2, &r2, &R2); d = fdist(x1, y1, x2, y2); ans += eval(R1, R2, d); ans -= eval(r1, r2, d); ans += inter(R1, r2, d); ans -= inter(r1, r2, d); ans += inter(r1, R2, d); ans -= inter(r1, r2, d); fprintf(out, "%.6lf\n", ans); return 0; }