链接:点击打开链接
题意:给出两个圆柱体的底面半径,一个垂直放置一个水平放置,求相交部分的体积
代码:
#include <math.h>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const double eps=1e-10;
double r,R;
double f(double x){
return sqrt(r*r-x*x)*sqrt(R*R-x*x);
}
double simpson(double le,double re){
return (re-le)/6*(f(le)+4*f((le+re)/2)+f(re));
}
double cal(double le,double re){ //simpson求定积分
double ans,mid;
mid=(le+re)/2;
ans=simpson(le,re);
if(fabs(ans-simpson(le,mid)-simpson(mid,re))<eps)
return ans;
return cal(le,mid)+cal(mid,re);
}
int main(){ //从侧视图来分析,可以得出两个圆柱的相交
while(scanf("%lf%lf",&r,&R)!=EOF){ //的截面为矩形,那么就是平行截面面积为已知
if(r>R) //的立体的体积,所以可以直接定积分求解
swap(r,R); //求∫2*√(R^2-x^2)*2*√(r^2-x^2)积分区间为-r到r
printf("%.5lf\n",8*cal(0,r)); //化简就是8*∫√(R^2-x^2)*√(r^2-x^2)积分区间为0到r
}
return 0;
}
P.s二重积分直接求出公式V=16/3*min(r,R)^3.....但是为什么过不了......