/* -*- coding: utf-8 -*- * * 3672.cc: No.3672 Volume 3D - yukicoder */ #include #include #include using namespace std; /* constant */ const double PI = acos(-1.0); /* typedef */ /* global variables */ /* subroutines */ double integral(double x0, double 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) double rr = r * r, rrr = rr * r; return PI * (rr * (r - x0) - (rrr - x0 * x0 * x0) / 3); } /* 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); int dx = xb - xa, dy = yb - ya, dz = zb - za; double d = sqrt(dx * dx + dy * dy + dz * dz); if (d >= ra + rb) { puts("0"); continue; } int dr = abs(rb - ra), minr = min(ra, rb); if (d <= dr) { printf("%.12lf\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 double la = (d * d + ra * ra - rb * rb) / (d * 2); double lb = d - la; double va = integral(la, ra); double vb = integral(lb, rb); printf("%.12lf\n", va + vb); } return 0; }