0
点赞
收藏
分享

微信扫一扫

多校训练2 F Girlfriend 数论(球冠)

dsysama 2022-03-11 阅读 16
c++学习
  • 精度不够,加上取的变量名相似,出错不易检查,wa了两发…

accode:

#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
int T;
double x[4], y[4], z[4];
double k1, k2;

int main()
{
    scanf("%d", &T);
    while(T--)
    {
        for(int i = 0; i < 4; i++)
        {
            cin>>x[i]>>y[i]>>z[i];
        }
        cin>>k1>>k2;
        
        //求两球体球心位置及半径
        double xs1 = k1 * k1 - 1, s1 = k1 * k1;
        double cx1, cy1, cz1, cr1, cd1;
        cx1 = (s1 * x[1] - x[0]) / xs1;
        cy1 = (s1 * y[1] - y[0]) / xs1;
        cz1 = (s1 * z[1] - z[0]) / xs1;
        cd1 = s1 * ((x[1] * x[1]) + (y[1] * y[1]) + (z[1] * z[1])) - x[0] * x[0] - y[0] * y[0] - z[0] * z[0];
        cd1 /= xs1;
        cr1 = sqrt(cx1 * cx1 + cy1 * cy1 + cz1 * cz1 - cd1);
        
        double xs2 = k2 * k2 - 1, s2 = k2 * k2;
        double cx2, cy2, cz2, cr2, cd2;
        cx2 = (s2 * x[3] - x[2]) / xs2;
        cy2 = (s2 * y[3] - y[2]) / xs2;
        cz2 = (s2 * z[3] - z[2]) / xs2;
        cd2 = s2 * ((x[3] * x[3]) + (y[3] * y[3]) + (z[3] * z[3])) - x[2] * x[2] - y[2] * y[2] - z[2] * z[2];
        cd2 /= xs2;
        cr2 = sqrt(cx2 * cx2 + cy2 * cy2 + cz2 * cz2 - cd2);
        //printf("%f %f %f %f %f %f %f %f\n", c1x, c1y, c1z, c1r, c2x, c2y, c2z, c2r);
        
        //判断两球相交关系
        double ans=0;
        double d=sqrt((cx1-cx2)*(cx1-cx2)+(cy1-cy2)*(cy1-cy2)+(cz1-cz2)*(cz1-cz2));
        //相离、相切 
        if(d>=cr1+cr2){
            ans=0;
        } 
        //内含、内切 
        else if (d + cr1 <= cr2)
        {
            ans = (4.00 / 3.00) * pi * cr1 * cr1 * cr1;
        }
        else if(d + cr2 <= cr1)
        {
            ans = (4.00 / 3.00) * pi * cr2 * cr2 * cr2;
        }
        //相交 
        else
        {
            //求俩球冠体积
            double h1, h2;
            h1 = cr1 - (cr1 * cr1 - cr2 * cr2 + d * d) / (2.00 * d); 
            h2 = cr2 - (cr2 * cr2 - cr1 * cr1 + d * d) / (2.00 * d);
            //cout<<h1<<" "<<h2<<endl;
            ans = pi * (1.00 / 3.00) * h1 * h1 * (3.00 * cr1 - h1) + pi * (1.00 / 3.00) * h2 * h2 * (3.00 * cr2 - h2);
        }
        printf("%.3f\n", ans);
    }
    
    return 0;
}
举报

相关推荐

0 条评论