牛客练习赛41---E:球的体积并

题意:

求两个球的体积并

分析:

判断两球的位置关系:

(1)相离:两球体积和

(2)内含:大球的体积

(3)相交:两球的体积和 - 相交部分的体积

球缺体积:

V=\pi h^2(r-h/3)

球冠(球缺的曲面外壳)表面积:

S = 2{\pi}hr

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;
}

猜你喜欢

转载自blog.csdn.net/qq_41157137/article/details/88076256