【模板】求两个球的并集

牛客数据真是毒瘤Orz

#include <bits/stdc++.h>
 
typedef long double ld;
typedef long long ll;
 
using namespace std;
const ld pi = acos(-1.0);
const ll maxn = 1e6 * 2 + 1e5 + 5;
 
ld sum;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
     
    ld a,b,c,d;
    cin >> a >> b >> c >> d;
    ld aa,bb,cc,dd;
    cin >> aa >> bb >> cc >> dd;
     
    //两个球心之间的距离
    ld ari = sqrt((a - aa) * (a - aa) + (b - bb) * (b - bb) + (c - cc) * (c - cc));
     
    //第一个球的体积
    ld vola = (4.0 / 3.0) * pi * (d * d * d) ;
    //第二个球的体积
    ld volb = (4.0 / 3.0) * pi * (dd * dd * dd) ;
     
    ld sum = vola + volb;
    //判断相离,相切,相交
    if(ari + min(d,dd) <= max(d,dd))
    {
        sum = max(vola,volb);
    }
    else if(ari >= (d + dd))
    {
        sum = vola + volb;
    }
    else
    {
        //求出球缺的高
         
        ld l1 = ( ((d * d) - (dd * dd)) / ari + ari) / 2.0;
        ld l2 = (ari - l1);
         
        ld h1 = d - l1;
        ld h2 = dd - l2;
         
        //求出球缺的体积
        ld volh1 = pi * h1 * h1 * (d - h1 / 3.0);
        ld volh2 = pi * h2 * h2 * (dd - h2 / 3.0);
         
        sum = sum - volh1 - volh2;
    }
     
    cout << fixed << setprecision(7) << sum << endl;
     
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值