zoukankan      html  css  js  c++  java
  • 纪念做出来的第一道计算几何题

    题意:给出两个球的圆心坐标,半径,求出它们的体积并

    分:一.外切,相离  二. 内切,内含  三.相交               三种情况来写。其中相交的时候求出两个球的体积并相加,由于球冠部分被多加了一次,所以要计算出两个球的球冠体,然后减去。直接上代码

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    
    const double pi=acos(-1);
    
    struct ball{
        double x,y,z,r;
        ball(double x=0,double y=0,double z=0,double r=0):x(x),y(y),z(z),r(r){}
        double dist(ball a){
            return sqrt((x-a.x)*(x-a.x)+(y-a.y)*(y-a.y)+(z-a.z)*(z-a.z)); 
        }
        
        double v()
        {
            return pi*r*r*r*4/3;
        }
    }a,b;
    
    double solve()
    {
        double d=a.dist(b);
        if(d-a.r-b.r>=0) return a.v()+b.v();
        double r1=a.r,r2=b.r;
        if(d+r1<=r2||d+r2<=r1) return max(a.v(),b.v());
        double v1=pi/3*(r1-(r1*r1-r2*r2+d*d)/(2*d))*(r1-(r1*r1-r2*r2+d*d)/(2*d));//计算球冠体的公式
        v1 *= 3*r1- (r1-(r1*r1-r2*r2+d*d)/(2*d));
        double v2=pi/3*(r2-(r2*r2-r1*r1+d*d)/(2*d))*(r2-(r2*r2-r1*r1+d*d)/(2*d));
        v2 *= 3*r2- (r2-(r2*r2-r1*r1+d*d)/(2*d));
        return a.v()+b.v()-(v1+v2);
    }
    int main()
    {
        cin>>a.x>>a.y>>a.z>>a.r;
        cin>>b.x>>b.y>>b.z>>b.r;
        printf("%.7f
    ",solve());
        return 0;
    }
  • 相关阅读:
    poj 2362 Square
    poj 1011 Sticks
    hust 1062 Divisibility
    hdu 4115 Eliminate the Conflict
    Android
    android stdio 快捷键
    Android Lint的使用
    Android studio导出配置
    fragment显示 Binary XML file line #12: Error inflating class fragment 错误
    markdown 字体颜色
  • 原文地址:https://www.cnblogs.com/rainyskywx/p/10463026.html
Copyright © 2011-2022 走看看