F - Girlfriend

纯数学,求两个球的体积并,公式略(不懂怎么插入公式qwq)

 

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const double pi=acos(-1);
int T;

double x[9],y[9],z[9];
double k1,k2;

double dist(double x1,double y1,double z1,double x2,double y2,double z2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));
}

double qzb(double x,double y,double z)
{
    return (z*z*x-y)/(z*z-1);
}

double CV(double r)
{
    return 4*pi*r*r*r/3;
}

int main(){
    cin>>T;
    while(T--)
    {
        for(int i=1;i<=4;i++)
        {
            cin>>x[i]>>y[i]>>z[i];
        }
        cin>>k1>>k2;
        double num1=k1*k1-1;
        double num2=k2*k2-1;
        double qx1,qx2,qy1,qy2,qz1,qz2,r1,r2;
        qx1=qzb(x[2],x[1],k1);
        qy1=qzb(y[2],y[1],k1);
        qz1=qzb(z[2],z[1],k1);
        r1=k1*k1*(x[2]*x[2]+y[2]*y[2]+z[2]*z[2])-(x[1]*x[1]+y[1]*y[1]+z[1]*z[1]);
        r1/=num1;
        r1=sqrt(qx1*qx1+qy1*qy1+qz1*qz1-r1);
        qx2=qzb(x[4],x[3],k2);
        qy2=qzb(y[4],y[3],k2);
        qz2=qzb(z[4],z[3],k2);
        r2=k2*k2*(x[4]*x[4]+y[4]*y[4]+z[4]*z[4])-(x[3]*x[3]+y[3]*y[3]+z[3]*z[3]);
        r2/=num2;
        r2=sqrt(qx2*qx2+qy2*qy2+qz2*qz2-r2);
        
        double dis=dist(qx1,qy1,qz1,qx2,qy2,qz2);
        //cout<<dis<<r1<<r2;
        double V=0;
        if(dis>=r1+r2)V=0;
        else if((dis+r1)<=r2)
        {
            V=(4.00/3.00)*pi*r1*r1*r1;
        }
        else if((dis+r2)<=r1)
        {
            V=(4.00/3.00)*pi*r2*r2*r2;
        }
        else{
            double cal=(r1*r1+dis*dis-r2*r2)/(2.00*dis*r1);
            double h=r1*(1-cal);
            V+=pi*(3.00*r1-h)*h*h/3.00;
            cal=(r2*r2+dis*dis-r1*r1)/(2*dis*r2);
            h=r2*(1-cal);
            V+=pi*(3.00*r2-h)*h*h/3.00;
        }
        printf("%.3lf\n",V);
    }
    return 0;
}

 

posted @ 2021-07-23 18:31  lemonGJacky  阅读(70)  评论(0)    收藏  举报