这段程序基于球心坐标和半径输入,计算两个球的体积或相交体积。
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; } |