#include<bits/stdc++.h>
using namespace std;
#define double long double
#define eps 1e-16
#define M_PI 3.141592653589793
using namespace std;
double X1,Y1,X2,Y2,Vx1,Vx2,Vy1,Vy2,r1,r2,Wx1,Wy1,Wx2,Wy2;
struct PT {
double x, y;
PT() {}
PT(double x, double y) : x(x), y(y) {}
PT(const PT &p) : x(p.x), y(p.y) {}
PT operator + (const PT &p) const { return PT(x+p.x, y+p.y); }
PT operator - (const PT &p) const { return PT(x-p.x, y-p.y); }
PT operator * (double c) const { return PT(x*c, y*c ); }
PT operator / (double c) const { return PT(x/c, y/c ); }
};
double dot(PT p, PT q){ return p.x*q.x+p.y*q.y; }
PT ProjectPointLine(PT a, PT b, PT c) {
return a + (b-a)*dot(c-a, b-a)/dot(b-a, b-a);
}
double gd( double x1, double y1, double x2, double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double solve_cos( double a, double b, double c)
{
return acos((a*a+b*b-c*c)/(2*a*b));
}
double cut( double ang, double r)
{
double s1,s2;
s1=ang*r*r/2;
s2=sin(ang)*r*r/2;
return s1-s2;
}
double solve( double x1 , double y1 , double r1 , double x2 , double y2 , double r2)
{
if (r1<r2)
{
swap(x1,x2);
swap(y1,y2);
swap(r1,r2);
}
double cd=gd(x1,y1,x2,y2);
if (cd+r2<=r1+eps)
return r2*r2*M_PI;
if (cd>=r1+r2-eps)
return 0;
double ang1=solve_cos(cd,r1,r2);
double ang2=solve_cos(cd,r2,r1);
return cut(ang1*2,r1)+cut(ang2*2,r2);
}
double cross(double Ax,double Ay,double Bx, double By){
return Ax * By - Ay * Bx;
}
double dot(double Ax,double Ay,double Bx, double By){
return Ax * Bx + Ay * By;
}
double area(double r1,double r2,double d){
return solve(0,0,r1,0,d,r2);
}
double solveWall()
{
double seg = hypot(Wx1-Wx2,Wy1-Wy2);
double disFromWall = fabs(cross(Wx1-Wx2,Wy1-Wy2,X1-Wx1,Y1-Wy1))/seg;
return 0;
}
PT getNazeer(PT lineA,PT lineB,PT c,double r){
PT zbr = ProjectPointLine(lineA,lineB,c);
PT u = (zbr - c)/sqrt(dot(zbr-c,zbr-c));
u = u * r;
return (zbr-u - c)+(zbr - u- c) + c;
}
double getTime(PT lineA,PT lineB,PT c,double r,double Vx,double Vy){
PT zbr = ProjectPointLine(lineA,lineB,c);
double Dist = sqrt(dot(zbr-c,zbr-c));
PT u = (zbr - c)/Dist; /// unit vector
PT nig = PT(Vx,Vy);
PT R = u * r;
double projV = dot(nig, u);
if(projV <= 0)
return 1e9;
double Time = sqrt(dot((zbr-R - c),(zbr - R- c)))/projV;
return Time;
}
double solve() {
double rVx = -Vx1 + Vx2,rVy = -Vy1+Vy2;
double deltaX = X1 - X2, deltaY = Y1 - Y2;
double zbr = dot(rVx,rVy,deltaX,deltaY);
double initialRes = area(r1,r2,hypot(deltaX,deltaY));
if(zbr < 0)
return max(initialRes,solveWall());
double zinj = cross(rVx,rVy,deltaX,deltaY);
if(rVx == rVy && rVy == 0){
zinj = hypot(deltaX,deltaY);
}
else
zinj /= hypot(rVx,rVy);
zinj = fabs(zinj);
if(zinj > r1 + r2)
return max(initialRes,solveWall());
return max(solveWall(),max(area(r1,r2,zinj),initialRes));
}
int main() {
#ifdef __Jafar
freopen("input.txt", "r", stdin);
#else
#endif
// freopen("out.out","w",stdout);
int t;cin>>t;
int j = 0;
while(t--) {
cout << fixed;
cout.precision(12);
cin >> X1 >> Y1 >> Vx1 >> Vy1 >> r1 >> X2 >> Y2 >> Vx2 >> Vy2 >> r2;
cin >> Wx1 >> Wy1 >> Wx2 >> Wy2;
j++;/*
if(j==90){
cout<<X1<<' ' << Y1<<endl<<Vx1<<' '<<Vy1<<endl<<r1<<endl<<X2<<' '<<Y2<<endl<<Vx2<<' '<<Vy2<<endl<<r2<<endl<<Wx1<<' '<<Wy1<<endl<<Wx2<<' '<<Wy2<<endl;
return 0;
}*/
if (r1 > r2) {
swap(r1, r2);
swap(X1, X2);
swap(Y1, Y2);
swap(Vx1, Vx2);
swap(Vy1, Vy2);
}
double res = solve();
PT zbr = getNazeer(PT(Wx1, Wy1), PT(Wx2, Wy2), PT(X1, Y1), r1);
double t1 = getTime(PT(Wx1, Wy1), PT(Wx2, Wy2), PT(X1, Y1), r1, Vx1, Vy1),
t2 = getTime(PT(Wx1, Wy1), PT(Wx2, Wy2), PT(X2, Y2), r2, Vx2, Vy2);
/// zbr نظير
if (t1 > t2) {
swap(t1,t2);
swap(r1, r2);
swap(X1, X2);
swap(Y1, Y2);
swap(Vx1, Vx2);
swap(Vy1, Vy2);
}
// cout<<t1<<' '<<t2<<endl;
PT newVelocity;
if (t1 != 1e9) {
//cout<<Vx1<<' '<<Vy1<<endl;
newVelocity = getNazeer(PT(Wx1, Wy1), PT(Wx2, Wy2), PT(2e6 + 7 + Vx1, 2e6 + 7 + Vy1), r1);
newVelocity = newVelocity - getNazeer(PT(Wx1, Wy1), PT(Wx2, Wy2), PT(2e6 + 7, 2e6 + 7), r1);
X1 = Vx1 * t1 + X1;
Y1 = Vy1 * t1 + Y1;
X2 = Vx2 * t1 + X2;
Y2 = Vy2 * t1 + Y2;
//cout<<X1<<' '<<Y1<<' ' <<X2<<' '<<Y2<<endl;
double Tx = X1, Ty = Y1, tVx = Vx1, tVy = Vy1;
Vx1 = newVelocity.x;
Vy1 = newVelocity.y;
//cout<<Vx1<<' '<<Vy1<<endl;
res = max(res, solve());
}
swap(r1, r2);
swap(X1, X2);
swap(Y1, Y2);
swap(Vx1, Vx2);
swap(Vy1, Vy2);
if (t2 != 1e9&&fabs(t2-t1)>1e-9) {
newVelocity = getNazeer(PT(Wx1, Wy1), PT(Wx2, Wy2), PT(2e6+7+ Vx1,2e6+7+ Vy1), r1);
newVelocity = newVelocity - getNazeer(PT(Wx1, Wy1), PT(Wx2, Wy2),PT(2e6+7, 2e6+7), r1);
X1 = X1 + (t2 - t1) * Vx1;
Y1 = Y1 + (t2 - t1) * Vy1;
X2 = X2 + (t2 - t1) * Vx2;
Y2 = Y2 + (t2 - t1) * Vy2;
Vx1 = newVelocity.x;
Vy1 = newVelocity.y;
res = max(res, solve());
}
cout << res << endl;
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgIGRvdWJsZSAgIGxvbmcgZG91YmxlCiNkZWZpbmUgZXBzIDFlLTE2CiNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzU4OTc5Mwp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKZG91YmxlIFgxLFkxLFgyLFkyLFZ4MSxWeDIsVnkxLFZ5MixyMSxyMixXeDEsV3kxLFd4MixXeTI7CgpzdHJ1Y3QgUFQgewogIGRvdWJsZSB4LCB5OwogIFBUKCkge30KICBQVChkb3VibGUgeCwgZG91YmxlIHkpIDogeCh4KSwgeSh5KSB7fQogIFBUKGNvbnN0IFBUICZwKSA6IHgocC54KSwgeShwLnkpICAgIHt9CiAgUFQgb3BlcmF0b3IgKyAoY29uc3QgUFQgJnApICBjb25zdCB7IHJldHVybiBQVCh4K3AueCwgeStwLnkpOyB9CiAgUFQgb3BlcmF0b3IgLSAoY29uc3QgUFQgJnApICBjb25zdCB7IHJldHVybiBQVCh4LXAueCwgeS1wLnkpOyB9CiAgUFQgb3BlcmF0b3IgKiAoZG91YmxlIGMpICAgICBjb25zdCB7IHJldHVybiBQVCh4KmMsICAgeSpjICApOyB9CiAgUFQgb3BlcmF0b3IgLyAoZG91YmxlIGMpICAgICBjb25zdCB7IHJldHVybiBQVCh4L2MsICAgeS9jICApOyB9Cn07Cgpkb3VibGUgZG90KFBUIHAsIFBUIHEpeyByZXR1cm4gcC54KnEueCtwLnkqcS55OyB9CgoKUFQgUHJvamVjdFBvaW50TGluZShQVCBhLCBQVCBiLCBQVCBjKSB7CiAgcmV0dXJuIGEgKyAoYi1hKSpkb3QoYy1hLCBiLWEpL2RvdChiLWEsIGItYSk7Cn0KCgogIGRvdWJsZSBnZCggIGRvdWJsZSB4MSwgIGRvdWJsZSB5MSwgIGRvdWJsZSB4MiwgIGRvdWJsZSB5MikKewoJcmV0dXJuIHNxcnQoKHgxLXgyKSooeDEteDIpKyh5MS15MikqKHkxLXkyKSk7Cn0KCiAgZG91YmxlIHNvbHZlX2NvcyggIGRvdWJsZSBhLCAgZG91YmxlIGIsICBkb3VibGUgYykKewoJcmV0dXJuIGFjb3MoKGEqYStiKmItYypjKS8oMiphKmIpKTsKfQoKICBkb3VibGUgY3V0KCAgZG91YmxlIGFuZywgIGRvdWJsZSByKQp7CgkgIGRvdWJsZSBzMSxzMjsKCXMxPWFuZypyKnIvMjsKCXMyPXNpbihhbmcpKnIqci8yOwoJcmV0dXJuIHMxLXMyOwp9CgogIGRvdWJsZSBzb2x2ZSggIGRvdWJsZSB4MSAsICAgZG91YmxlIHkxICwgICBkb3VibGUgcjEgLCAgIGRvdWJsZSB4MiAsICAgZG91YmxlIHkyICwgICBkb3VibGUgcjIpCnsKCWlmIChyMTxyMikKCXsKCQlzd2FwKHgxLHgyKTsKCQlzd2FwKHkxLHkyKTsKCQlzd2FwKHIxLHIyKTsKCX0KCSAgZG91YmxlIGNkPWdkKHgxLHkxLHgyLHkyKTsKCWlmIChjZCtyMjw9cjErZXBzKQoJCXJldHVybiByMipyMipNX1BJOwoJaWYgKGNkPj1yMStyMi1lcHMpCgkJcmV0dXJuIDA7CgkgIGRvdWJsZSBhbmcxPXNvbHZlX2NvcyhjZCxyMSxyMik7CgkgIGRvdWJsZSBhbmcyPXNvbHZlX2NvcyhjZCxyMixyMSk7CglyZXR1cm4gY3V0KGFuZzEqMixyMSkrY3V0KGFuZzIqMixyMik7Cn0KCmRvdWJsZSBjcm9zcyhkb3VibGUgQXgsZG91YmxlIEF5LGRvdWJsZSBCeCwgZG91YmxlIEJ5KXsKICAgIHJldHVybiBBeCAqIEJ5IC0gQXkgKiBCeDsKfQpkb3VibGUgZG90KGRvdWJsZSBBeCxkb3VibGUgQXksZG91YmxlIEJ4LCBkb3VibGUgQnkpewogICAgcmV0dXJuIEF4ICogQnggKyBBeSAqIEJ5Owp9CmRvdWJsZSBhcmVhKGRvdWJsZSByMSxkb3VibGUgcjIsZG91YmxlIGQpewoKICAgIHJldHVybiBzb2x2ZSgwLDAscjEsMCxkLHIyKTsKfQpkb3VibGUgc29sdmVXYWxsKCkKewogICAgZG91YmxlIHNlZyA9IGh5cG90KFd4MS1XeDIsV3kxLVd5Mik7CiAgICBkb3VibGUgZGlzRnJvbVdhbGwgPSBmYWJzKGNyb3NzKFd4MS1XeDIsV3kxLVd5MixYMS1XeDEsWTEtV3kxKSkvc2VnOwogICAgcmV0dXJuIDA7Cn0KClBUIGdldE5hemVlcihQVCBsaW5lQSxQVCBsaW5lQixQVCBjLGRvdWJsZSByKXsKICAgICBQVCB6YnIgPSBQcm9qZWN0UG9pbnRMaW5lKGxpbmVBLGxpbmVCLGMpOwogICAgIFBUIHUgPSAoemJyIC0gYykvc3FydChkb3QoemJyLWMsemJyLWMpKTsKCiAgICAgdSA9IHUgKiByOwogICAgIHJldHVybiAgKHpici11IC0gYykrKHpiciAtIHUtIGMpICsgYzsKfQpkb3VibGUgZ2V0VGltZShQVCBsaW5lQSxQVCBsaW5lQixQVCBjLGRvdWJsZSByLGRvdWJsZSBWeCxkb3VibGUgVnkpewogICAgIFBUIHpiciA9IFByb2plY3RQb2ludExpbmUobGluZUEsbGluZUIsYyk7CiAgICAgZG91YmxlIERpc3QgPSBzcXJ0KGRvdCh6YnItYyx6YnItYykpOwogICAgIFBUIHUgPSAoemJyIC0gYykvRGlzdDsgLy8vIHVuaXQgdmVjdG9yCiAgICAgUFQgbmlnID0gUFQoVngsVnkpOwogICAgIFBUIFIgPSB1ICogcjsKICAgICBkb3VibGUgcHJvalYgID0gZG90KG5pZywgdSk7CiAgICAgaWYocHJvalYgPD0gMCkKICAgICAgICAgcmV0dXJuIDFlOTsKICAgICBkb3VibGUgVGltZSA9IHNxcnQoZG90KCh6YnItUiAtIGMpLCh6YnIgLSBSLSBjKSkpL3Byb2pWOwogICAgIHJldHVybiAgVGltZTsKfQpkb3VibGUgc29sdmUoKSB7CgoKICAgIGRvdWJsZSByVnggPSAtVngxICsgVngyLHJWeSA9IC1WeTErVnkyOwogICAgZG91YmxlIGRlbHRhWCA9IFgxIC0gWDIsIGRlbHRhWSA9IFkxIC0gWTI7CiAgICBkb3VibGUgemJyID0gZG90KHJWeCxyVnksZGVsdGFYLGRlbHRhWSk7CiAgICBkb3VibGUgaW5pdGlhbFJlcyA9IGFyZWEocjEscjIsaHlwb3QoZGVsdGFYLGRlbHRhWSkpOwoKICAgIGlmKHpiciA8IDApCiAgICAgICAgcmV0dXJuIG1heChpbml0aWFsUmVzLHNvbHZlV2FsbCgpKTsKICAgIGRvdWJsZSB6aW5qID0gY3Jvc3MoclZ4LHJWeSxkZWx0YVgsZGVsdGFZKTsKICAgIGlmKHJWeCA9PSByVnkgJiYgclZ5ID09IDApewogICAgICAgIHppbmogPSBoeXBvdChkZWx0YVgsZGVsdGFZKTsKICAgIH0KICAgIGVsc2UKICAgICAgICB6aW5qIC89IGh5cG90KHJWeCxyVnkpOwogICAgemluaiA9IGZhYnMoemluaik7CiAgICBpZih6aW5qID4gcjEgKyByMikKICAgICAgICByZXR1cm4gbWF4KGluaXRpYWxSZXMsc29sdmVXYWxsKCkpOwogICAgcmV0dXJuIG1heChzb2x2ZVdhbGwoKSxtYXgoYXJlYShyMSxyMix6aW5qKSxpbml0aWFsUmVzKSk7Cgp9CmludCBtYWluKCkgewojaWZkZWYgX19KYWZhcgogICAgZnJlb3BlbigiaW5wdXQudHh0IiwgInIiLCBzdGRpbik7CgojZWxzZQojZW5kaWYKICAgLy8gZnJlb3Blbigib3V0Lm91dCIsInciLHN0ZG91dCk7CiAgICBpbnQgdDtjaW4+PnQ7CiAgICBpbnQgaiA9IDA7CiAgICB3aGlsZSh0LS0pIHsKICAgICAgICBjb3V0IDw8IGZpeGVkOwogICAgICAgIGNvdXQucHJlY2lzaW9uKDEyKTsKICAgICAgICBjaW4gPj4gWDEgPj4gWTEgPj4gVngxID4+IFZ5MSA+PiByMSA+PiBYMiA+PiBZMiA+PiBWeDIgPj4gVnkyID4+IHIyOwoKICAgICAgICBjaW4gPj4gV3gxID4+IFd5MSA+PiBXeDIgPj4gV3kyOwogICAgICAgIGorKzsvKgogICAgICAgIGlmKGo9PTkwKXsKICAgICAgICAgICAgY291dDw8WDE8PCcgJyA8PCBZMTw8ZW5kbDw8VngxPDwnICc8PFZ5MTw8ZW5kbDw8cjE8PGVuZGw8PFgyPDwnICc8PFkyPDxlbmRsPDxWeDI8PCcgJzw8VnkyPDxlbmRsPDxyMjw8ZW5kbDw8V3gxPDwnICc8PFd5MTw8ZW5kbDw8V3gyPDwnICc8PFd5Mjw8ZW5kbDsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSovCiAgICAgICAgaWYgKHIxID4gcjIpIHsKICAgICAgICAgICAgc3dhcChyMSwgcjIpOwogICAgICAgICAgICBzd2FwKFgxLCBYMik7CiAgICAgICAgICAgIHN3YXAoWTEsIFkyKTsKICAgICAgICAgICAgc3dhcChWeDEsIFZ4Mik7CiAgICAgICAgICAgIHN3YXAoVnkxLCBWeTIpOwogICAgICAgIH0KICAgICAgICBkb3VibGUgcmVzID0gc29sdmUoKTsKICAgICAgICBQVCB6YnIgPSBnZXROYXplZXIoUFQoV3gxLCBXeTEpLCBQVChXeDIsIFd5MiksIFBUKFgxLCBZMSksIHIxKTsKICAgICAgICBkb3VibGUgdDEgPSBnZXRUaW1lKFBUKFd4MSwgV3kxKSwgUFQoV3gyLCBXeTIpLCBQVChYMSwgWTEpLCByMSwgVngxLCBWeTEpLAogICAgICAgIHQyID0gZ2V0VGltZShQVChXeDEsIFd5MSksIFBUKFd4MiwgV3kyKSwgUFQoWDIsIFkyKSwgcjIsIFZ4MiwgVnkyKTsKICAgICAgICAvLy8gemJyINmG2LjZitixCiAgICAgICAgaWYgKHQxID4gdDIpIHsKICAgICAgICAgICAgc3dhcCh0MSx0Mik7CiAgICAgICAgICAgIHN3YXAocjEsIHIyKTsKICAgICAgICAgICAgc3dhcChYMSwgWDIpOwogICAgICAgICAgICBzd2FwKFkxLCBZMik7CiAgICAgICAgICAgIHN3YXAoVngxLCBWeDIpOwogICAgICAgICAgICBzd2FwKFZ5MSwgVnkyKTsKICAgICAgICB9CiAgICAgICAvLyBjb3V0PDx0MTw8JyAnPDx0Mjw8ZW5kbDsKICAgICAgICBQVCBuZXdWZWxvY2l0eTsKICAgICAgICBpZiAodDEgIT0gMWU5KSB7CiAgICAgICAgICAgIC8vY291dDw8VngxPDwnICc8PFZ5MTw8ZW5kbDsKICAgICAgICAgICAgbmV3VmVsb2NpdHkgPSBnZXROYXplZXIoUFQoV3gxLCBXeTEpLCBQVChXeDIsIFd5MiksIFBUKDJlNiArIDcgKyBWeDEsIDJlNiArIDcgKyBWeTEpLCByMSk7CiAgICAgICAgICAgIG5ld1ZlbG9jaXR5ID0gbmV3VmVsb2NpdHkgLSBnZXROYXplZXIoUFQoV3gxLCBXeTEpLCBQVChXeDIsIFd5MiksIFBUKDJlNiArIDcsIDJlNiArIDcpLCByMSk7CiAgICAgICAgICAgIFgxID0gVngxICogdDEgKyBYMTsKICAgICAgICAgICAgWTEgPSBWeTEgKiB0MSArIFkxOwogICAgICAgICAgICBYMiA9IFZ4MiAqIHQxICsgWDI7CiAgICAgICAgICAgIFkyID0gVnkyICogdDEgKyBZMjsKICAgICAgICAgICAgLy9jb3V0PDxYMTw8JyAnPDxZMTw8JyAnIDw8WDI8PCcgJzw8WTI8PGVuZGw7CgogICAgICAgICAgICBkb3VibGUgVHggPSBYMSwgVHkgPSBZMSwgdFZ4ID0gVngxLCB0VnkgPSBWeTE7CiAgICAgICAgICAgIFZ4MSA9IG5ld1ZlbG9jaXR5Lng7CiAgICAgICAgICAgIFZ5MSA9IG5ld1ZlbG9jaXR5Lnk7CiAgICAgICAgICAgIC8vY291dDw8VngxPDwnICc8PFZ5MTw8ZW5kbDsKICAgICAgICAgICAgcmVzID0gbWF4KHJlcywgc29sdmUoKSk7CiAgICAgICAgfQoKCgogICAgICAgICAKICAgICAgICAgICAgc3dhcChyMSwgcjIpOwogICAgICAgICAgICBzd2FwKFgxLCBYMik7CiAgICAgICAgICAgIHN3YXAoWTEsIFkyKTsKICAgICAgICAgICAgc3dhcChWeDEsIFZ4Mik7CiAgICAgICAgICAgIHN3YXAoVnkxLCBWeTIpOwogICAgICAgIGlmICh0MiAhPSAxZTkmJmZhYnModDItdDEpPjFlLTkpIHsKICAgICAgICAgICBuZXdWZWxvY2l0eSA9IGdldE5hemVlcihQVChXeDEsIFd5MSksIFBUKFd4MiwgV3kyKSwgUFQoMmU2KzcrIFZ4MSwyZTYrNysgVnkxKSwgcjEpOwogICAgICAgICAgICBuZXdWZWxvY2l0eSA9IG5ld1ZlbG9jaXR5IC0gZ2V0TmF6ZWVyKFBUKFd4MSwgV3kxKSwgUFQoV3gyLCBXeTIpLFBUKDJlNis3LCAyZTYrNyksIHIxKTsKICAgICAgICAgICAgWDEgPSBYMSArICh0MiAtIHQxKSAqIFZ4MTsKICAgICAgICAgICAgWTEgPSBZMSArICh0MiAtIHQxKSAqIFZ5MTsKICAgICAgICAgICAgWDIgPSBYMiArICh0MiAtIHQxKSAqIFZ4MjsKICAgICAgICAgICAgWTIgPSBZMiArICh0MiAtIHQxKSAqIFZ5MjsKICAgICAgICAgICAgVngxID0gbmV3VmVsb2NpdHkueDsKICAgICAgICAgICAgVnkxID0gbmV3VmVsb2NpdHkueTsKICAgICAgICAgICAgcmVzID0gbWF4KHJlcywgc29sdmUoKSk7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgcmVzIDw8IGVuZGw7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==