1. 程式人生 > >兩個圓柱相交的體積 UVALive 5096 Volume

兩個圓柱相交的體積 UVALive 5096 Volume

本部落格主要討論從積分和非積分方式計算兩個圓柱體交集的體積。由於博主的高數很爛,有什麼不得當的地方還望大家指出來。
兩個圓柱相交:
這裡寫圖片描述
不難發現相交有兩種情況,如圖所示是2R<H的情況。
我們先暫且不考慮第二種2R>H的情況,先看第一種。把多餘的地方切去,會得到這個立體圖形:
這裡寫圖片描述
這個叫做牟合方蓋。通過百度不難發現它的體積公式為163R3,那麼問題來了:如何證明。
先考慮它的18體積,如下圖:
這裡寫圖片描述
單獨把A圖拿出來,想象有一個平面在離地為h的地方去切割這個交集。
這裡寫圖片描述不難證明切割出來的圖形是一個正方形,邊長為R2h2,也就是說正方形的面積是R2h2,如果是用積分的話,就根據高度來積這個面積好了,求出來1/8的體積。

18V=R0(R2h2)dh=(R2h13h3)|R0=23R3
積分太複雜,我們用類似於小學數學的方法,假設這個1/8體積被關在一個邊長為R的正方體內,延展截面與正方體相交,可以得到正方體與圓柱交集之間的面積是h2。在另外考慮一個底面為邊長為R的正方形,高為R的四稜錐,那麼同樣用一個平行與地面的平面區截這個稜錐,平面與頂點的距離為h;顯然截面是一個正方形,面積為h2。那麼不管是之前的圖形還是現在的四稜柱,正方形的面積都和h一一對應而且相等,那麼可以推匯出來四稜柱的體積就是圓柱交集和正方體之間部分的體積。得到牟合方蓋體積公式:
18V=VV=R313R3=23R3
如果是第二種情況,兩個圓柱體的交集不再是一個“牟合方蓋”,而是牟合方蓋的一部分,你可以想象成兩個圓盤相交部分的體積,中間一段是一個長方體,而端點是牟合方蓋的兩端。
這裡寫圖片描述

我們同樣先計算1/8的體積。那麼長方體長 12L=R2H2(H是圓柱體的高)。上端部分的體積就是牟合方蓋的體積下面部分的體積,也就是
R0(R2h2)dh12L0(R2h2)dh=23R3R212L+13(12L)3
加上長方體體積12L(12H)2就是整個立體圖形1/8的體積。這個表示式同樣可以用上面正方體錐體體積相減的方式得到,只是計算過程更麻煩。
程式碼如下:
#include<cstdio>
#include<cmath>
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))); } } }