两个圆柱相交的体积 UVALive 5096 Volume

本博客主要讨论从积分和非积分方式计算两个圆柱体交集的体积。由于博主的高数很烂,有什么不得当的地方还望大家指出来。
两个圆柱相交:
两个圆柱相交的体积 UVALive 5096 Volume_第1张图片
不难发现相交有两种情况,如图所示是 2R<H 的情况。
我们先暂且不考虑第二种 2R>H 的情况,先看第一种。把多余的地方切去,会得到这个立体图形:
两个圆柱相交的体积 UVALive 5096 Volume_第2张图片
这个叫做牟合方盖。通过百度不难发现它的体积公式为 163R3 ,那么问题来了:如何证明。
先考虑它的 18 体积,如下图:
两个圆柱相交的体积 UVALive 5096 Volume_第3张图片
单独把A图拿出来,想象有一个平面在离地为h的地方去切割这个交集。
两个圆柱相交的体积 UVALive 5096 Volume_第4张图片不难证明切割出来的图形是一个正方形,边长为 R2h2 ,也就是说正方形的面积是 R2h2 ,如果是用积分的话,就根据高度来积这个面积好了,求出来1/8的体积。

18V=R0(R2h2)dh=(R2h13h3)|R0=23R3

积分太复杂,我们用类似于小学数学的方法,假设这个1/8体积被关在一个边长为R的正方体内,延展截面与正方体相交,可以得到正方体与圆柱交集之间的面积是 h2 。在另外考虑一个底面为边长为R的正方形,高为R的四棱锥,那么同样用一个平行与地面的平面区截这个棱锥,平面与顶点的距离为h;显然截面是一个正方形,面积为 h2 。那么不管是之前的图形还是现在的四棱柱,正方形的面积都和h一一对应而且相等,那么可以推导出来四棱柱的体积就是圆柱交集和正方体之间部分的体积。得到牟合方盖体积公式:
18V=VV=R313R3=23R3

如果是第二种情况,两个圆柱体的交集不再是一个“牟合方盖”,而是牟合方盖的一部分,你可以想象成两个圆盘相交部分的体积,中间一段是一个长方体,而端点是牟合方盖的两端。
两个圆柱相交的体积 UVALive 5096 Volume_第5张图片
我们同样先计算1/8的体积。那么长方体长 12L=R2H2 (H是圆柱体的高)。上端部分的体积就是牟合方盖的体积下面部分的体积,也就是
R0(R2h2)dh12L0(R2h2)dh=23R3R212L+13(12L)3

加上长方体体积 12L(12H)2 就是整个立体图形1/8的体积。这个表达式同样可以用上面正方体锥体体积相减的方式得到,只是计算过程更麻烦。
代码如下:

#include
#include
using namespace std;
const double pi = 3.14159265358979;
int main()
{
    double r,h;
    while(scanf("%lf%lf",&r,&h) != EOF)
    {
        double v = 2*pi*r*r*h;
        if(2.0*r < h)
            printf("%.4lf\n",v-16*r*r*r/3);
        else
        {
            double l = sqrt(r*r-(h/2.0)*(h/2.0));
            double smouhefanggai = 2*r*r*r/3-(r*r*l-l*l*l/3);
            printf("%.4lf\n",v-8*(smouhefanggai+l*(h/2)*(h/2)));
        }
    }
}

你可能感兴趣的:(计算几何)