两球的体积交
double ans = 0;
for (int i = 1; i <= n; i++) {
double d = dis(s, a[i]);
if (d >= s.r + a[i].r) {
continue;
}
else if (d + a[i].r <= s.r) {
ans += (4.0 / 3)*pi*a[i].r*a[i].r*a[i].r;
}
else {
double co = (s.r*s.r + d * d - a[i].r*a[i].r) / (2.0*d*s.r);
double h = s.r*(1 - co);
ans += (1.0 / 3)*pi*(3.0*s.r - h)*h*h;
co = (a[i].r*a[i].r + d * d - s.r*s.r) / (2.0*d*a[i].r);
h = a[i].r*(1 - co);
ans += (1.0 / 3)*pi*(3.0*a[i].r - h)*h*h;
}
}
printf("%.10lf\n", ans);
以上的模板是已知一个球与多个球的体积交,如果只有两个球那么久设定
如果想要球体积并,那么就如同面积并一样,两个体积相加减去公共部分(体积并)