阅读程序-1解析

这段程序基于球心坐标和半径输入,计算两个球的体积或相交体积。

公式推导出处

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**************************************************************** 
 * Description: 
 * Author: Alex Li
 * Date: 2023-09-09 06:38:33
 * LastEditTime: 2024-09-14 23:36:15
****************************************************************/
#include <iostream>
#include <cmath>
using namespace std;

const double r = acos(0.5);  //反余弦函数 r是pi/3,是60度

int a1, b1, c1, d1;  //(a1, b1, c1) 和 (a2, b2, c2) 分别表示两个球的球心坐标。
int a2, b2, c2, d2;  //d1 和 d2 分别表示两个球的半径。

inline int sq(const int x) { return x * x; }  //返回x的平方
//inline的作用是减少函数的开销
inline int cu(const int x) { return x * x * x; }  //返回x的立方
int main()
{
    cout.flags(ios::fixed);
    cout.precision(4); //精度,4位小数 
    cin >> a1 >> b1 >> c1 >> d1; //球心坐标和半径
    cin >> a2 >> b2 >> c2 >> d2; //球心坐标和半径
   int t = sq(a1 - a2) + sq(b1 - b2) + sq(c1 - c2); //两个球心距离的平方
   //如果两个球的半径之差的平方大于等于球心距离的平方,说明小球完全在大球内部。这时,输出小球的体积。4/3*pi*d1^3
   if (t <= sq(d2 - d1)) cout << cu(min(d1, d2)) * r * 4; 
    else if (t >= sq(d2 + d1)) cout << 0;  //如果如果球心距离大于两球半径相加,两球不相交
         else {
             double x = d1 - (sq(d1) - sq(d2) + t) /sqrt(t)/2;//球1冠高
             double y = d2 - (sq(d2) - sq(d1) + t) / sqrt(t)/2;//球2冠高
             cout << (x * x * (3 * d1 - x) + y * y * (3 * d2 - y)) * r;  //相交体积
        }
    cout << endl;
    return 0;
}
Scroll to Top