题意:
求两个球的体积并
分析:
判断两球的位置关系:
(1)相离:两球体积和
(2)内含:大球的体积
(3)相交:两球的体积和 - 相交部分的体积
球缺体积:
球冠(球缺的曲面外壳)表面积:
h为球缺的高,r为球的半径(投影到平面上就是两圆相交,很容易求得h)
代码:
#include <bits/stdc++.h>
#define pi acos(-1.0)
using namespace std;
typedef struct Point{
double x,y,z;
}point;
typedef struct Sphere{
point c;
double r;
}sphere;
double dis(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) + (a.z-b.z)*(a.z-b.z));
}
//V=πh^2(r−h/3)
double cal(sphere a,sphere b,double d) //两球相交部分的体积
{
double Ha = a.r - (a.r*a.r-b.r*b.r+d*d)/(2*d);
double Hb = b.r - (b.r*b.r-a.r*a.r+d*d)/(2*d);
double Va = pi*Ha*Ha*(a.r-Ha/3);
double Vb = pi*Hb*Hb*(b.r-Hb/3);
return Va+Vb;
}
int main()
{
sphere a,b;
cin>>a.c.x>>a.c.y>>a.c.z>>a.r;
cin>>b.c.x>>b.c.y>>b.c.z>>b.r;
double d = dis(a.c,b.c);
double Va = 4.0*pi*a.r*a.r*a.r/3;
double Vb = 4.0*pi*b.r*b.r*b.r/3;
if(d >= a.r+b.r) printf("%.7f\n", Va+Vb);
else if(d <= fabs(a.r-b.r)) printf("%.7f\n", max(Va,Vb));
else printf("%.7f\n", Va+Vb-cal(a,b,d));
return 0;
}