令曲线 y=f(x) 绕 x 轴旋转,形成的旋转体,则其体积和表面积可以计算积分而得(假设体积和表面积一定存在,积分一定存在,这里不讨论数学问题)。
体积公式为:
ZOJ3866,一个圆柱体半径为 r mm,高度为 h mm,外围包裹着 d mm厚的涂层,求其表面积和体积。这个题目要精确到 10−8 ,推不出积分公式就不用做了。
整个部分最关键的就是四个边角的形状,四个边角合在一起恰好是一个圆环的外半侧。所以关键就是求圆环的外半侧的体积以及表面积。
曲线方程为:
然后把其他部分的圆柱体算上即可。
#include
#include
double const PI = acos(-1.0);
double const DELTA = 1E-6;
double R,H,D;
double integral(){
return (2.0*D*R*R+4.0*D*D*D/3.0+D*D*R*PI) * PI;
}
double integral2(){
return 4.0*PI*D*D + 2.0*PI*PI*R*D;
}
int main(){
int nofkase;
scanf("%d",&nofkase);
while( nofkase-- ){
scanf("%lf%lf%lf",&R,&H,&D);
double v = integral() + PI * ( R + D ) * ( R + D ) * H;
double s = integral2() + 2.0 * PI * ( R + D ) * H + 2.0 * PI * R * R;
printf("%.12lf %.12lf\n",v,s);
}
return 0;
}
ZOJ3898同样是旋转体的表面积和体积。曲线为:
其中第一项不知道积不积得出来,反正我没有积出来。数学不行,就用计算机的方法算。第二项令 t=sinx ,则
#include
#include
double const PI = acos(-1.);
double const EPS = 1E-4;
//计算一个周期
double init1p(){
double ret = 0.0;
for(double x=0.0;x<=0.5*PI;x+=EPS){
double t = sin(x);
ret += sqrt(1.0+t*t);
}
return 8.0*PI*ret*EPS;
}
double const ONEP = init1p();
double v(double z1,double z2){
return 4.0 * PI * ( z2 - z1 )
+ 4.0 * PI * ( sin(z2) - sin(z1) )
+ 0.5 * PI * ( z2 - z1 )
+ 0.25 * PI * ( sin(z2+z2) - sin(z1+z1) );
}
double s(double z1,double z2){
//计算底面积
double y1 = 2.0 + cos(z1);
double ret = PI * y1 * y1;
//计算解析式的积分
double t2 = sin(z2), t1 = sin(z1);
double tt2 = sqrt(1.0+t2*t2), tt1 = sqrt(1.0+t1*t1);
ret += PI * ( t2 * tt2 - t1 * tt1 )
+ PI * ( log(fabs(t2+tt2)) - log(fabs(t1+tt1)) );
//计算周期
int n = (int)(( z2 - z1 ) / PI);
ret += ONEP * (double)n;
//计算积分
double tmp = 0.0;
for(double x=z1+PI*(double)n;x<=z2;x+=EPS){
double t = sin(x);
tmp += sqrt(1.0+t*t);
}
return ret += tmp * 4.0 * PI * EPS;
}
int main(){
int kase;
scanf("%d",&kase);
while(kase--){
double z1,z2;
scanf("%lf%lf",&z1,&z2);
printf("%.5lf %.5lf\n",v(z1,z2),s(z1,z2));
}
return 0;
}