- 精度不够,加上取的变量名相似,出错不易检查,wa了两发…
accode:
#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
int T;
double x[4], y[4], z[4];
double k1, k2;
int main()
{
scanf("%d", &T);
while(T--)
{
for(int i = 0; i < 4; i++)
{
cin>>x[i]>>y[i]>>z[i];
}
cin>>k1>>k2;
//求两球体球心位置及半径
double xs1 = k1 * k1 - 1, s1 = k1 * k1;
double cx1, cy1, cz1, cr1, cd1;
cx1 = (s1 * x[1] - x[0]) / xs1;
cy1 = (s1 * y[1] - y[0]) / xs1;
cz1 = (s1 * z[1] - z[0]) / xs1;
cd1 = s1 * ((x[1] * x[1]) + (y[1] * y[1]) + (z[1] * z[1])) - x[0] * x[0] - y[0] * y[0] - z[0] * z[0];
cd1 /= xs1;
cr1 = sqrt(cx1 * cx1 + cy1 * cy1 + cz1 * cz1 - cd1);
double xs2 = k2 * k2 - 1, s2 = k2 * k2;
double cx2, cy2, cz2, cr2, cd2;
cx2 = (s2 * x[3] - x[2]) / xs2;
cy2 = (s2 * y[3] - y[2]) / xs2;
cz2 = (s2 * z[3] - z[2]) / xs2;
cd2 = s2 * ((x[3] * x[3]) + (y[3] * y[3]) + (z[3] * z[3])) - x[2] * x[2] - y[2] * y[2] - z[2] * z[2];
cd2 /= xs2;
cr2 = sqrt(cx2 * cx2 + cy2 * cy2 + cz2 * cz2 - cd2);
//printf("%f %f %f %f %f %f %f %f\n", c1x, c1y, c1z, c1r, c2x, c2y, c2z, c2r);
//判断两球相交关系
double ans=0;
double d=sqrt((cx1-cx2)*(cx1-cx2)+(cy1-cy2)*(cy1-cy2)+(cz1-cz2)*(cz1-cz2));
//相离、相切
if(d>=cr1+cr2){
ans=0;
}
//内含、内切
else if (d + cr1 <= cr2)
{
ans = (4.00 / 3.00) * pi * cr1 * cr1 * cr1;
}
else if(d + cr2 <= cr1)
{
ans = (4.00 / 3.00) * pi * cr2 * cr2 * cr2;
}
//相交
else
{
//求俩球冠体积
double h1, h2;
h1 = cr1 - (cr1 * cr1 - cr2 * cr2 + d * d) / (2.00 * d);
h2 = cr2 - (cr2 * cr2 - cr1 * cr1 + d * d) / (2.00 * d);
//cout<<h1<<" "<<h2<<endl;
ans = pi * (1.00 / 3.00) * h1 * h1 * (3.00 * cr1 - h1) + pi * (1.00 / 3.00) * h2 * h2 * (3.00 * cr2 - h2);
}
printf("%.3f\n", ans);
}
return 0;
}