/* -*- coding: utf-8 -*- * * 3672.cc: No.3672 Volume 3D - yukicoder */ #include #include #include using namespace std; /* constant */ const long double PI = acosl(-1.0); /* typedef */ using ll = long long; using ld = long double; /* global variables */ /* subroutines */ ld integral(ld x0, ld r) { // int_{x=x0..r} PI*(r^2-x^2)*dx // = PI * int_{x=x0..r} (r^2-x^2)dx // = PI * (r^2*(r-x0)-(r^3-x0^3)/3) //ld rr = r * r, rrr = rr * r; //ld v = PI * (rr * (r - x0) - (rrr - x0 * x0 * x0) / 3); //printf(" integral(%Lf,%Lf)=%Lf\n", x0, r, v); // PI*h^2/3(3r-h) ld h = r - x0; ld v = PI * h * h / 3 * (r * 3 - h); return v; } /* main */ int main() { int tn; scanf("%d", &tn); while (tn--) { int xa, ya, za, ra; scanf("%d%d%d%d", &xa, &ya, &za, &ra); int xb, yb, zb, rb; scanf("%d%d%d%d", &xb, &yb, &zb, &rb); ll dx = xb - xa, dy = yb - ya, dz = zb - za; ll dd = dx * dx + dy * dy + dz * dz; ld d = sqrtl(dd); if (d >= ra + rb) { puts("0"); continue; } int dr = abs(rb - ra), minr = min(ra, rb); if (dd <= (ll)dr * dr) { printf("%.15Lf\n", PI * 4 / 3 * minr * minr * minr); continue; } // ra^2-la^2=rb^2-lb^2=d^2, la+lb=d -> lb=d-la // -> (ra^2-la^2)-(rb^2-(d-la)^2)=0 // -> ra^2-rb^2-la^2+d^2-2d*la+la^2=0 // -> (ra^2-rb^2)+d^2-2d*la=0 // -> la=(d^2+ra^2-rb^2)/2d ld la = (dd + (ll)ra * ra - (ll)rb * rb) / (d * 2); ld lb = d - la; ld va = integral(la, ra); ld vb = integral(lb, rb); printf("%.15Lf\n", va + vb); } return 0; }