2021牛客多校第二场 F——Girlfriend

题目大意

给你两个阿波罗尼斯球,让你求两个求的体积交

Code

#include <bits/stdc++.h>
using namespace std;
struct node{
	double x, y, z;
};
const double PI = acos(-1.0);
node a, b, c, d;
double k1, k2;
int main(){
	int t;
	cin >> t;
	while(t--){
		cin >> a.x >> a.y >> a.z;
		cin >> b.x >> b.y >> b.z;
		cin >> c.x >> c.y >> c.z;
		cin >> d.x >> d.y >> d.z;
		cin >> k1 >> k2;
		node p1, p2;
		double r1, r2;
		p1.x = -(a.x - k1*k1*b.x) / (k1*k1 - 1);
		p1.y = -(a.y - k1*k1*b.y) / (k1*k1 - 1);
		p1.z = -(a.z - k1*k1*b.z) / (k1*k1 - 1);
		p2.x = -(c.x - k2*k2*d.x) / (k2*k2 - 1);
		p2.y = -(c.y - k2*k2*d.y) / (k2*k2 - 1);
		p2.z = -(c.z - k2*k2*d.z) / (k2*k2 - 1);
		double d1 = k1*k1*b.x*b.x - a.x*a.x + k1*k1*b.y*b.y - a.y*a.y + k1*k1*b.z*b.z - a.z*a.z;
		double d2 = k2*k2*d.x*d.x - c.x*c.x + k2*k2*d.y*d.y - c.y*c.y + k2*k2*d.z*d.z - c.z*c.z;
		d1 /= (k1*k1 - 1);
		d2 /= (k2*k2 - 1);
		r1 = sqrt((p1.x*p1.x + p1.y*p1.y + p1.z*p1.z - d1));
		r2 = sqrt((p2.x*p2.x + p2.y*p2.y + p2.z*p2.z - d2));
	    double ans=0;
	    double dis=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)+(p1.z-p2.z)*(p1.z-p2.z)); //球心距离
		double sum=4.0/3.0*PI*(r1*r1*r1+r2*r2*r2);
		
		if(dis>=r1+r2)
		{
			double s=4.0/3.0*PI*(r1*r1*r1+r2*r2*r2);
			printf("%.3lf\n",sum-s);
		}
		else if(dis<=fabs(r1-r2))
		{
			double maxn=max(r1,r2);
			double s=4.0/3.0*PI*(maxn*maxn*maxn);
			printf("%.3lf\n",sum-s);
		}
		else
		{
			double s=4.0/3.0*PI*(r1*r1*r1+r2*r2*r2);
			double h1=r1-(r1*r1-r2*r2+dis*dis)/(2*dis);
			s-=(PI*h1*h1*(3*r1-h1)/3.0);
			double h2=r2-(r2*r2-r1*r1+dis*dis)/(2.0*dis);
			s-=(PI*h2*h2*(3*r2-h2)/3.0);
			printf("%.3lf\n",sum-s);
		}

	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值