#include "bits/stdc++.h"
#define int long long
using namespace std;
const int N = 1e5 + 5, mod = 1e9 + 7;
typedef complex<double> point;
#define INF 1e18
#define ld long double
#define eps 1e-4
#define PI acos(-1)
#define X real()
#define Y imag()
#define polar(r, t) ((r)*exp(point(0,(t))))
#define angle(a) (atan2l((a).Y,(a).X))
#define vec(a, b) ((b)-(a))
#define length(a) (hypot((a).Y,(a).X))
#define normalize(a) ((a)/length(a))
#define dp(a, b) ((conj(a)*(b)).X)
#define cp(a, b) ((conj(a)*(b)).Y)
#define length2(a) (dot(a,a))
#define rotate0(a, ang) (polar(a,ang))
#define rotateA(a, ang, A) (rotate0(vec(A,a),ang)+(A))
#define reflect(v, m) (conj((v)/(m))*(m))
int dcmp(ld a, ld b) {
if (fabs(a - b) <= eps)return 0;
return a < b ? -1 : 1;
}
double fixAngle(double A) {
return A > 1 ? 1 : (A < -1 ? -1 : A);
}
double getAngle_A_abc(double a, double b, double c) {
return acos(fixAngle((b * b + c * c - a * a) / (2 * b * c)));
}
// norm(a) // return x^2 + y^2 //a is point //can use dp(a,a)
bool same(point p1, point p2) {// check to points same or not
return dp(vec(p1, p2), vec(p1, p2)) < eps;
}
vector<point> intersectCircleCircle(point c1, double r1, point c2, double r2) {
// Handle infinity case first: same center/radius and r > 0
if (same(c1, c2) && dcmp(r1, r2) == 0 && dcmp(r1, 0) > 0)
return vector<point>(3, c1); // infinity 2 same circles (not points)
// Compute 2 intersection case and handle 0, 1, 2 cases
double ang1 = angle(vec(c1, c2)), ang2 = getAngle_A_abc(r2, r1, length(vec(c1, c2)));
if (::isnan(ang2)) ang2 = 0; // if r1 or d = 0 => nan in getAngle_A_abc (/0)
vector<point> v(1, polar(r1, ang1 + ang2) + c1);
// if point NOT on the 2 circles = no intersection
if (dcmp(dp(vec(c1, v[0]), vec(c1, v[0])), r1 * r1) != 0 ||
dcmp(dp(vec(c2, v[0]), vec(c2, v[0])), r2 * r2) != 0)
return vector<point>();
v.push_back(polar(r1, ang1 - ang2) + c1);
if (same(v[0], v[1])) // if same, then 1 intersection only
v.pop_back();
return v;
}
ld circleCircleIntersectionArea(point cen1, ld r1, point cen2, ld r2) {
ld dis = hypot(cen1.X - cen2.X, cen1.Y - cen2.Y);
if (dis > r1 + r2)return 0;
if (dis <= fabs(r2 - r1) && r1 >= r2)
return PI * r2 * r2;
if (dis <= fabs(r2 - r1) && r1 < r2)
return PI * r1 * r1;
ld a = r1 * r1, b = r2 * r2;
ld ang1 = acos((a + dis * dis - b) / (2 * r1 * dis)) * 2;
ld ang2 = acos((b + dis * dis - a) / (2 * r2 * dis)) * 2;
ld ret1 = .5 * b * (ang2 - sin(ang2));
ld ret2 = .5 * a * (ang1 - sin(ang1));
return ret1 + ret2;
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
ld x1, y1, x2, y2, r1, r2;
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
point a(x1, y1), b(x2, y2);
auto v = intersectCircleCircle(a, r1, b, r2);
if (v.size() == 3 || v.empty() || dcmp(circleCircleIntersectionArea(a, r1, b, r2),0) == 0) {
cout << -1;
return 0;
}
int x = r1, y = r2;
if (v.size() == 1) {
if (norm(a - b) == (x + y) * (x + y)) {
cout << -1;
return 0;
}
ld R = max(r1, r2);
ld area = R * R * PI - circleCircleIntersectionArea(a, r1, b, r2);
cout << fixed << setprecision(8) << area;
return 0;
}
ld area = circleCircleIntersectionArea(a, r1, b, r2);
ld ans = r1 * r1 * PI;
ans = max(ans, r2 * r2 * PI);
cout << fixed << setprecision(8) << ans - area;
return 0;
}
I2luY2x1ZGUgImJpdHMvc3RkYysrLmgiCgojZGVmaW5lIGludCBsb25nIGxvbmcKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IE4gPSAxZTUgKyA1LCBtb2QgPSAxZTkgKyA3Owp0eXBlZGVmIGNvbXBsZXg8ZG91YmxlPiBwb2ludDsKI2RlZmluZSBJTkYgMWUxOAojZGVmaW5lIGxkIGxvbmcgZG91YmxlCiNkZWZpbmUgZXBzIDFlLTQKI2RlZmluZSBQSSBhY29zKC0xKQojZGVmaW5lIFggcmVhbCgpCiNkZWZpbmUgWSBpbWFnKCkKI2RlZmluZSBwb2xhcihyLCB0KSAgICAgICAgICAoKHIpKmV4cChwb2ludCgwLCh0KSkpKQojZGVmaW5lIGFuZ2xlKGEpICAgICAgICAgICAgKGF0YW4ybCgoYSkuWSwoYSkuWCkpCiNkZWZpbmUgdmVjKGEsIGIpICAgICAgICAgICAoKGIpLShhKSkKI2RlZmluZSBsZW5ndGgoYSkgICAgICAgICAgIChoeXBvdCgoYSkuWSwoYSkuWCkpCiNkZWZpbmUgbm9ybWFsaXplKGEpICAgICAgICAoKGEpL2xlbmd0aChhKSkKI2RlZmluZSBkcChhLCBiKSAgICAgICAgICAoKGNvbmooYSkqKGIpKS5YKQojZGVmaW5lIGNwKGEsIGIpICAgICAgICAgICAgKChjb25qKGEpKihiKSkuWSkKI2RlZmluZSBsZW5ndGgyKGEpICAgICAgICAgIChkb3QoYSxhKSkKI2RlZmluZSByb3RhdGUwKGEsIGFuZykgICAgIChwb2xhcihhLGFuZykpCiNkZWZpbmUgcm90YXRlQShhLCBhbmcsIEEpICAocm90YXRlMCh2ZWMoQSxhKSxhbmcpKyhBKSkKI2RlZmluZSByZWZsZWN0KHYsIG0pICAgICAgIChjb25qKCh2KS8obSkpKihtKSkKCmludCBkY21wKGxkIGEsIGxkIGIpIHsKICAgIGlmIChmYWJzKGEgLSBiKSA8PSBlcHMpcmV0dXJuIDA7CgogICAgcmV0dXJuIGEgPCBiID8gLTEgOiAxOwp9CgoKZG91YmxlIGZpeEFuZ2xlKGRvdWJsZSBBKSB7CiAgICByZXR1cm4gQSA+IDEgPyAxIDogKEEgPCAtMSA/IC0xIDogQSk7Cn0KCmRvdWJsZSBnZXRBbmdsZV9BX2FiYyhkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjKSB7CiAgICByZXR1cm4gYWNvcyhmaXhBbmdsZSgoYiAqIGIgKyBjICogYyAtIGEgKiBhKSAvICgyICogYiAqIGMpKSk7Cn0KCi8vIG5vcm0oYSkgIC8vIHJldHVybiB4XjIgKyB5XjIgLy9hIGlzIHBvaW50IC8vY2FuIHVzZSBkcChhLGEpCmJvb2wgc2FtZShwb2ludCBwMSwgcG9pbnQgcDIpIHsvLyBjaGVjayB0byBwb2ludHMgc2FtZSBvciBub3QKICAgIHJldHVybiBkcCh2ZWMocDEsIHAyKSwgdmVjKHAxLCBwMikpIDwgZXBzOwp9Cgp2ZWN0b3I8cG9pbnQ+IGludGVyc2VjdENpcmNsZUNpcmNsZShwb2ludCBjMSwgZG91YmxlIHIxLCBwb2ludCBjMiwgZG91YmxlIHIyKSB7CiAgICAvLyBIYW5kbGUgaW5maW5pdHkgY2FzZSBmaXJzdDogc2FtZSBjZW50ZXIvcmFkaXVzIGFuZCByID4gMAogICAgaWYgKHNhbWUoYzEsIGMyKSAmJiBkY21wKHIxLCByMikgPT0gMCAmJiBkY21wKHIxLCAwKSA+IDApCiAgICAgICAgcmV0dXJuIHZlY3Rvcjxwb2ludD4oMywgYzEpOyAgICAvLyBpbmZpbml0eSAyIHNhbWUgY2lyY2xlcyAobm90IHBvaW50cykKCiAgICAvLyBDb21wdXRlIDIgaW50ZXJzZWN0aW9uIGNhc2UgYW5kIGhhbmRsZSAwLCAxLCAyIGNhc2VzCiAgICBkb3VibGUgYW5nMSA9IGFuZ2xlKHZlYyhjMSwgYzIpKSwgYW5nMiA9IGdldEFuZ2xlX0FfYWJjKHIyLCByMSwgbGVuZ3RoKHZlYyhjMSwgYzIpKSk7CiAgICBpZiAoOjppc25hbihhbmcyKSkgYW5nMiA9IDA7IC8vIGlmIHIxIG9yIGQgPSAwID0+IG5hbiBpbiBnZXRBbmdsZV9BX2FiYyAoLzApCgogICAgdmVjdG9yPHBvaW50PiB2KDEsIHBvbGFyKHIxLCBhbmcxICsgYW5nMikgKyBjMSk7CiAgICAvLyBpZiBwb2ludCBOT1Qgb24gdGhlIDIgY2lyY2xlcyA9IG5vIGludGVyc2VjdGlvbgogICAgaWYgKGRjbXAoZHAodmVjKGMxLCB2WzBdKSwgdmVjKGMxLCB2WzBdKSksIHIxICogcjEpICE9IDAgfHwKICAgICAgICBkY21wKGRwKHZlYyhjMiwgdlswXSksIHZlYyhjMiwgdlswXSkpLCByMiAqIHIyKSAhPSAwKQogICAgICAgIHJldHVybiB2ZWN0b3I8cG9pbnQ+KCk7CiAgICB2LnB1c2hfYmFjayhwb2xhcihyMSwgYW5nMSAtIGFuZzIpICsgYzEpOwogICAgaWYgKHNhbWUodlswXSwgdlsxXSkpICAvLyBpZiBzYW1lLCB0aGVuIDEgaW50ZXJzZWN0aW9uIG9ubHkKICAgICAgICB2LnBvcF9iYWNrKCk7CiAgICByZXR1cm4gdjsKfQoKbGQgY2lyY2xlQ2lyY2xlSW50ZXJzZWN0aW9uQXJlYShwb2ludCBjZW4xLCBsZCByMSwgcG9pbnQgY2VuMiwgbGQgcjIpIHsKICAgIGxkIGRpcyA9IGh5cG90KGNlbjEuWCAtIGNlbjIuWCwgY2VuMS5ZIC0gY2VuMi5ZKTsKICAgIGlmIChkaXMgPiByMSArIHIyKXJldHVybiAwOwogICAgaWYgKGRpcyA8PSBmYWJzKHIyIC0gcjEpICYmIHIxID49IHIyKQogICAgICAgIHJldHVybiBQSSAqIHIyICogcjI7CiAgICBpZiAoZGlzIDw9IGZhYnMocjIgLSByMSkgJiYgcjEgPCByMikKICAgICAgICByZXR1cm4gUEkgKiByMSAqIHIxOwogICAgbGQgYSA9IHIxICogcjEsIGIgPSByMiAqIHIyOwogICAgbGQgYW5nMSA9IGFjb3MoKGEgKyBkaXMgKiBkaXMgLSBiKSAvICgyICogcjEgKiBkaXMpKSAqIDI7CiAgICBsZCBhbmcyID0gYWNvcygoYiArIGRpcyAqIGRpcyAtIGEpIC8gKDIgKiByMiAqIGRpcykpICogMjsKICAgIGxkIHJldDEgPSAuNSAqIGIgKiAoYW5nMiAtIHNpbihhbmcyKSk7CiAgICBsZCByZXQyID0gLjUgKiBhICogKGFuZzEgLSBzaW4oYW5nMSkpOwogICAgcmV0dXJuIHJldDEgKyByZXQyOwp9CgpzaWduZWQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKICAgIGNvdXQudGllKG51bGxwdHIpOwogICAgbGQgeDEsIHkxLCB4MiwgeTIsIHIxLCByMjsKICAgIGNpbiA+PiB4MSA+PiB5MSA+PiByMSA+PiB4MiA+PiB5MiA+PiByMjsKICAgIHBvaW50IGEoeDEsIHkxKSwgYih4MiwgeTIpOwogICAgYXV0byB2ID0gaW50ZXJzZWN0Q2lyY2xlQ2lyY2xlKGEsIHIxLCBiLCByMik7CiAgICBpZiAodi5zaXplKCkgPT0gMyB8fCB2LmVtcHR5KCkgfHwgZGNtcChjaXJjbGVDaXJjbGVJbnRlcnNlY3Rpb25BcmVhKGEsIHIxLCBiLCByMiksMCkgPT0gMCkgewogICAgICAgIGNvdXQgPDwgLTE7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpbnQgeCA9IHIxLCB5ID0gcjI7CiAgICBpZiAodi5zaXplKCkgPT0gMSkgewogICAgICAgIGlmIChub3JtKGEgLSBiKSA9PSAoeCArIHkpICogKHggKyB5KSkgewogICAgICAgICAgICBjb3V0IDw8IC0xOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgbGQgUiA9IG1heChyMSwgcjIpOwogICAgICAgIGxkIGFyZWEgPSBSICogUiAqIFBJIC0gY2lyY2xlQ2lyY2xlSW50ZXJzZWN0aW9uQXJlYShhLCByMSwgYiwgcjIpOwogICAgICAgIGNvdXQgPDwgZml4ZWQgPDwgc2V0cHJlY2lzaW9uKDgpIDw8IGFyZWE7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBsZCBhcmVhID0gY2lyY2xlQ2lyY2xlSW50ZXJzZWN0aW9uQXJlYShhLCByMSwgYiwgcjIpOwogICAgbGQgYW5zID0gcjEgKiByMSAqIFBJOwogICAgYW5zID0gbWF4KGFucywgcjIgKiByMiAqIFBJKTsKICAgIGNvdXQgPDwgZml4ZWQgPDwgc2V0cHJlY2lzaW9uKDgpIDw8IGFucyAtIGFyZWE7CiAgICByZXR1cm4gMDsKfQ==