牛客小白月赛20 C 球的表面积
算法分析
这题是个纯数论题,首先我们知道外离和内含的状态是好求的,
难点在相交,相交需要减去两个互相融入的部分,以相交面为切面
那么第一个球融入第二个球的部分就是球冠.球冠是指一个球面被平面所
截后剩下的曲面。截得的圆面是底,垂直于圆面的直径被截得的部分是高。
然后还需要知道球冠的表面积怎么求是2* π * r1 * h1
h1等于r1*(1-cos∠1);角公式2abcos∠1=a* a+ b* b-c* c
c为∠1对的边.所以就是cos∠1=(r1* r1+dis * dis-r2 * r2) / (2.0 * r1 *dis);
#include<iostream>
#include<math.h>
#include<algorithm>
#include<cstring>
using namespace std;
#define PI acos(-1)
typedef long long ll;
typedef double d;
int main()
{
d x1,x2,y1,y2,z1,z2,r1,r2;
cin>>x1>>y1>>z1>>r1>>x2>>y2>>z2>>r2;
d v1=4*PI*r1*r1;
d v2=4*PI*r2*r2;
d dis=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));
if(dis>=r1+r2)
printf("%lf\n",v1+v2);
else if(dis<=r1+r2&&dis<=max(r1,r2)-min(r1,r2))
printf("%lf\n",max(v1,v2));
else
{
d cos1=(r1*r1+dis*dis-r2*r2)/(2.0*r1*dis);
d h1=r1*(1-cos1);
d v11=2*PI*r1*h1;
d cos2=(r2*r2+dis*dis-r1*r1)/(2.0*r2*dis);
d h2=r2*(1-cos2);
d v22=2*PI*r2*h2;
d ans=v1+v2-v11-v22;
printf("%lf\n",ans);
}
}