#include <bits/stdc++.h>
#define all(x) begin(x), end(x)
#define int int64_t
using namespace std;
typedef double ftype;
typedef complex<ftype> point;
#define x real
#define y imag
const ftype pi = acos(-1);
const ftype inf = 1e16;
const ftype eps = 1e-6;
ftype dot(point a, point b) {
return a.x() * b.x() + a.y() * b.y();
}
ftype cross(point a, point b) {
return a.x() * b.y() - a.y() * b.x();
}
void read(point &r) {
ftype x, y;
cin >> x >> y;
r = {x, y};
}
ftype area(ftype r, ftype a) {
return norm(r) * acos(a / r) - a * sqrt(norm(r) - norm(a));
}
ftype overlap(ftype r1, ftype r2, ftype d) {
if(d >= r1 + r2) {
return 0;
} else if(d <= abs(r1 - r2)) {
return pi * norm(min(r1, r2));
} else {
ftype a = (norm(r1) - norm(r2) + norm(d)) / (2 * d);
return area(r1, a) + area(r2, d - a);
}
}
ftype sign(ftype x) {
return x < 0 ? -1 : 1;
}
tuple<point, point, ftype> reflect(point A, point Av, ftype Ar, point W1, point W2) {
point nrm = point(0, 1) * (W2 - W1);
nrm /= abs(nrm);
ftype d = dot(A - W1, nrm);
ftype Vd = dot(Av, nrm);
point A_ = A - 2 * (d - sign(d) * Ar) * nrm;
point Av_ = Av - 2 * Vd * nrm;
if(abs(Vd) < eps || sign(d - sign(d) * Ar) == sign(Vd)) {
return {A, Av, 0};
} else {
ftype At = -(d - sign(d) * Ar) / Vd;
return {A_, Av_, At};
}
}
ftype dist(point A, point Av, point B, point Bv, ftype tl, ftype tr) {
if(tl > tr) {
return inf;
} else {
Bv -= Av;
ftype t = dot(A - B, Bv) / norm(Bv);
if(tl <= t && t <= tr) {
return abs(cross(A - B, Bv)) / abs(Bv);
} else {
return min(abs(A - (B + tl * Bv)), abs(A - (B + tr * Bv)));
}
}
}
void solve() {
point A, Av; ftype Ar;
point B, Bv; ftype Br;
read(A); read(Av); cin >> Ar;
read(B); read(Bv); cin >> Br;
point W1, W2;
read(W1); read(W2);
point A_, Av_, B_, Bv_;
ftype At, Bt;
tie(A_, Av_, At) = reflect(A, Av, Ar, W1, W2);
tie(B_, Bv_, Bt) = reflect(B, Bv, Br, W1, W2);
ftype d = min({dist(A, Av, B, Bv, 0, min(At, Bt)),
dist(A_, Av_, B, Bv, At, Bt),
dist(A, Av, B_, Bv_, Bt, At),
dist(A_, Av_, B_, Bv_, max(At, Bt), inf)});
cout << overlap(Ar, Br, d) << "\n";
}
signed main() {
//freopen("input.txt", "r", stdin);
ios::sync_with_stdio(0);
cin.tie(0);
cout << fixed << setprecision(12);
int t;
cin >> t;
while(t--) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGFsbCh4KSBiZWdpbih4KSwgZW5kKHgpCiNkZWZpbmUgaW50IGludDY0X3QKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIGRvdWJsZSBmdHlwZTsKdHlwZWRlZiBjb21wbGV4PGZ0eXBlPiBwb2ludDsKI2RlZmluZSB4IHJlYWwKI2RlZmluZSB5IGltYWcKCmNvbnN0IGZ0eXBlIHBpID0gYWNvcygtMSk7CmNvbnN0IGZ0eXBlIGluZiA9IDFlMTY7CmNvbnN0IGZ0eXBlIGVwcyA9IDFlLTY7CgpmdHlwZSBkb3QocG9pbnQgYSwgcG9pbnQgYikgewoJcmV0dXJuIGEueCgpICogYi54KCkgKyBhLnkoKSAqIGIueSgpOwp9CmZ0eXBlIGNyb3NzKHBvaW50IGEsIHBvaW50IGIpIHsKCXJldHVybiBhLngoKSAqIGIueSgpIC0gYS55KCkgKiBiLngoKTsKfQoKdm9pZCByZWFkKHBvaW50ICZyKSB7CglmdHlwZSB4LCB5OwoJY2luID4+IHggPj4geTsKCXIgPSB7eCwgeX07Cn0KCmZ0eXBlIGFyZWEoZnR5cGUgciwgZnR5cGUgYSkgewoJcmV0dXJuIG5vcm0ocikgKiBhY29zKGEgLyByKSAtIGEgKiBzcXJ0KG5vcm0ocikgLSBub3JtKGEpKTsKfQoKZnR5cGUgb3ZlcmxhcChmdHlwZSByMSwgZnR5cGUgcjIsIGZ0eXBlIGQpIHsKCWlmKGQgPj0gcjEgKyByMikgewoJCXJldHVybiAwOwoJfSBlbHNlIGlmKGQgPD0gYWJzKHIxIC0gcjIpKSB7CgkJcmV0dXJuIHBpICogbm9ybShtaW4ocjEsIHIyKSk7Cgl9IGVsc2UgewoJCWZ0eXBlIGEgPSAobm9ybShyMSkgLSBub3JtKHIyKSArIG5vcm0oZCkpIC8gKDIgKiBkKTsgCgkJcmV0dXJuIGFyZWEocjEsIGEpICsgYXJlYShyMiwgZCAtIGEpOwoJfQp9CgpmdHlwZSBzaWduKGZ0eXBlIHgpIHsKCXJldHVybiB4IDwgMCA/IC0xIDogMTsKfQp0dXBsZTxwb2ludCwgcG9pbnQsIGZ0eXBlPiByZWZsZWN0KHBvaW50IEEsIHBvaW50IEF2LCBmdHlwZSBBciwgcG9pbnQgVzEsIHBvaW50IFcyKSB7Cglwb2ludCBucm0gPSBwb2ludCgwLCAxKSAqIChXMiAtIFcxKTsKCW5ybSAvPSBhYnMobnJtKTsKCWZ0eXBlIGQgPSBkb3QoQSAtIFcxLCBucm0pOwoJZnR5cGUgVmQgPSBkb3QoQXYsIG5ybSk7Cglwb2ludCBBXyA9IEEgLSAyICogKGQgLSBzaWduKGQpICogQXIpICogbnJtOwoJcG9pbnQgQXZfID0gQXYgLSAyICogVmQgKiBucm07CglpZihhYnMoVmQpIDwgZXBzIHx8IHNpZ24oZCAtIHNpZ24oZCkgKiBBcikgPT0gc2lnbihWZCkpIHsKCQlyZXR1cm4ge0EsIEF2LCAwfTsKCX0gZWxzZSB7CgkJZnR5cGUgQXQgPSAtKGQgLSBzaWduKGQpICogQXIpIC8gVmQ7CgkJcmV0dXJuIHtBXywgQXZfLCBBdH07Cgl9Cn0KCmZ0eXBlIGRpc3QocG9pbnQgQSwgcG9pbnQgQXYsIHBvaW50IEIsIHBvaW50IEJ2LCBmdHlwZSB0bCwgZnR5cGUgdHIpIHsKCWlmKHRsID4gdHIpIHsKCQlyZXR1cm4gaW5mOwoJfSBlbHNlIHsKCQlCdiAtPSBBdjsKCQlmdHlwZSB0ID0gZG90KEEgLSBCLCBCdikgLyBub3JtKEJ2KTsKCQlpZih0bCA8PSB0ICYmIHQgPD0gdHIpIHsKCQkJcmV0dXJuIGFicyhjcm9zcyhBIC0gQiwgQnYpKSAvIGFicyhCdik7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIG1pbihhYnMoQSAtIChCICsgdGwgKiBCdikpLCBhYnMoQSAtIChCICsgdHIgKiBCdikpKTsKCQl9Cgl9Cn0KCnZvaWQgc29sdmUoKSB7Cglwb2ludCBBLCBBdjsgZnR5cGUgQXI7Cglwb2ludCBCLCBCdjsgZnR5cGUgQnI7CglyZWFkKEEpOyByZWFkKEF2KTsgY2luID4+IEFyOwoJcmVhZChCKTsgcmVhZChCdik7IGNpbiA+PiBCcjsKCXBvaW50IFcxLCBXMjsKCXJlYWQoVzEpOyByZWFkKFcyKTsKCXBvaW50IEFfLCBBdl8sIEJfLCBCdl87CglmdHlwZSBBdCwgQnQ7Cgl0aWUoQV8sIEF2XywgQXQpID0gcmVmbGVjdChBLCBBdiwgQXIsIFcxLCBXMik7Cgl0aWUoQl8sIEJ2XywgQnQpID0gcmVmbGVjdChCLCBCdiwgQnIsIFcxLCBXMik7CglmdHlwZSBkID0gbWluKHtkaXN0KEEsIEF2LCBCLCBCdiwgMCwgbWluKEF0LCBCdCkpLCAKCQkgICAgICAgICAgIGRpc3QoQV8sIEF2XywgQiwgQnYsIEF0LCBCdCksCgkJICAgICAgICAgICBkaXN0KEEsIEF2LCBCXywgQnZfLCBCdCwgQXQpLAoJCSAgICAgICAgICAgZGlzdChBXywgQXZfLCBCXywgQnZfLCBtYXgoQXQsIEJ0KSwgaW5mKX0pOwoJY291dCA8PCBvdmVybGFwKEFyLCBCciwgZCkgPDwgIlxuIjsKfQoKc2lnbmVkIG1haW4oKSB7CgkvL2ZyZW9wZW4oImlucHV0LnR4dCIsICJyIiwgc3RkaW4pOwoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7CgljaW4udGllKDApOwoJY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oMTIpOwoJaW50IHQ7CgljaW4gPj4gdDsKCXdoaWxlKHQtLSkgewoJCXNvbHZlKCk7Cgl9CglyZXR1cm4gMDsKfQo=