题目大意
给你两个阿波罗尼斯球,让你求两个求的体积交
Code
#include <bits/stdc++.h>
using namespace std;
struct node{
double x, y, z;
};
const double PI = acos(-1.0);
node a, b, c, d;
double k1, k2;
int main(){
int t;
cin >> t;
while(t--){
cin >> a.x >> a.y >> a.z;
cin >> b.x >> b.y >> b.z;
cin >> c.x >> c.y >> c.z;
cin >> d.x >> d.y >> d.z;
cin >> k1 >> k2;
node p1, p2;
double r1, r2;
p1.x = -(a.x - k1*k1*b.x) / (k1*k1 - 1);
p1.y = -(a.y - k1*k1*b.y) / (k1*k1 - 1);
p1.z = -(a.z - k1*k1*b.z) / (k1*k1 - 1);
p2.x = -(c.x - k2*k2*d.x) / (k2*k2 - 1);
p2.y = -(c.y - k2*k2*d.y) / (k2*k2 - 1);
p2.z = -(c.z - k2*k2*d.z) / (k2*k2 - 1);
double d1 = k1*k1*b.x*b.x - a.x*a.x + k1*k1*b.y*b.y - a.y*a.y + k1*k1*b.z*b.z - a.z*a.z;
double d2 = k2*k2*d.x*d.x - c.x*c.x + k2*k2*d.y*d.y - c.y*c.y + k2*k2*d.z*d.z - c.z*c.z;
d1 /= (k1*k1 - 1);
d2 /= (k2*k2 - 1);
r1 = sqrt((p1.x*p1.x + p1.y*p1.y + p1.z*p1.z - d1));
r2 = sqrt((p2.x*p2.x + p2.y*p2.y + p2.z*p2.z - d2));
double ans=0;
double dis=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)+(p1.z-p2.z)*(p1.z-p2.z)); //球心距离
double sum=4.0/3.0*PI*(r1*r1*r1+r2*r2*r2);
if(dis>=r1+r2)
{
double s=4.0/3.0*PI*(r1*r1*r1+r2*r2*r2);
printf("%.3lf\n",sum-s);
}
else if(dis<=fabs(r1-r2))
{
double maxn=max(r1,r2);
double s=4.0/3.0*PI*(maxn*maxn*maxn);
printf("%.3lf\n",sum-s);
}
else
{
double s=4.0/3.0*PI*(r1*r1*r1+r2*r2*r2);
double h1=r1-(r1*r1-r2*r2+dis*dis)/(2*dis);
s-=(PI*h1*h1*(3*r1-h1)/3.0);
double h2=r2-(r2*r2-r1*r1+dis*dis)/(2.0*dis);
s-=(PI*h2*h2*(3*r2-h2)/3.0);
printf("%.3lf\n",sum-s);
}
}
}