zoj月赛题。求两个相交球的合体积。两球分离和相交、相容的判断和圆的判断一样。关键是相交后如何计算体积。这里有个积分公式:
根据这个公式即可得到答案。由于数学太烂,比赛时一直没推出,这里引用了watashi神的blog的内容。
以下是代码:
- #include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
const double Pi=acos(-1.0); - double vol(double r,double h)
{
return Pi*(r*r-h*h/3)*h;
} - int main()
{
int T;
scanf("%d",&T);
double x1,x2,y1,y2,z1,z2,r1,r2,t;
while(T--)
{
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&z1,&r1,&x2,&y2,&z2,&r2);
double d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));
double ans;
if(r1<r2)
{
t=r1;r1=r2;r2=t;
}
if(d>=r1+r2)
{
ans=4.0/3*Pi*(r1*r1*r1+r2*r2*r2);
}
else if(d<=r1-r2)
{
ans=4.0/3*Pi*r1*r1*r1;
}
else
{
t=(r1 * r1 - r2 * r2) / d;
z1=(d + t) / 2;
z2=(d - t) / 2;
ans=vol(r1, z1)-vol(r1, -r1)+vol(r2, z2)-vol(r2, -r2);
}
printf("%.2lf/n",ans);
}
return 0;
}