2013-05-05 156 views
1

我使用wireframe函數創建了3D圖(表面)。我想知道是否有任何函數可以用來計算3D圖中表面下的體積? 這裏是我的數據樣本再加上我用來創建我的3D(面)情節wrieframe語法:計算表面下的體積

x1<-c(13,27,41,55,69,83,97,111,125,139) 
x2<-c(27,55,83,111,139,166,194,222,250,278) 
x3<-c(41,83,125,166,208,250,292,333,375,417) 
x4<-c(55,111,166,222,278,333,389,445,500,556) 
x5<-c(69,139,208,278,347,417,487,556,626,695) 
x6<-c(83,166,250,333,417,500,584,667,751,834) 
x7<-c(97,194,292,389,487,584,681,779,876,974) 
x8<-c(111,222,333,445,556,667,779,890,1001,1113) 
x9<-c(125,250,375,500,626,751,876,1001,1127,1252) 
x10<-c(139,278,417,556,695,834,974,1113,1252,1391) 

df<-data.frame(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10) 
df.matrix<-as.matrix(df) 

wireframe(df.matrix, 
     aspect = c(61/87, 0.4),scales=list(arrows=FALSE,cex=.5,tick.number="10",z=list(arrows=T)),ylim=c(1:10),xlab=expression(phi1),ylab="Percentile",zlab=" Loss",main="Random Classifier", 
     light.source = c(10,10,10),drape=T,col.regions = rainbow(100, s = 1, v = 1, start = 0, end = max(1,100 - 1)/100, alpha = 1),screen=list(z=-60,x=-60)) 

注:我的真實數據是100X100矩陣

感謝

回答

3

您要輸入到wireframe的數據是一個網格值。因此,這個近似表面的任何底層體積的估計值是網格值乘以網格單元面積的總和。這就像添加直方圖條的高度來獲取直方圖中的數值一樣。

我跟你看到的問題在你的數據上這樣做是因爲單元格區域將以奇數單位 - 一個軸上的百分位數,另一個軸上的百分位數爲phi而另一個單元格上有未知單位,所以你的數量將有單位損失倍數單位百分比乘以phi單位。

如果您想在完全相同的網格上比較相似的東西的體積,但是如果您在不同的網格上有不同的表面(不同的phi值或不同的百分位數),那麼這不是問題,那麼您需要小心。

現在,請注意,wireframe不會繪製像3d直方圖那樣(看起來像方形塔塊),這給了我們另一種估計體積的方法。您的10x10矩陣繪製爲9x9的方塊。將每個方塊分成三角形,然後計算192個右截角三角棱鏡的體積(我認爲這就是它們 - 它們是具有直角和一個傾斜端的等邊三角形棱鏡)。這個公式應該在某個地方。可能基地面積乘以三角形質心的高度或某物。

我想也許這將在光柵包中,但事實並非如此。有代碼來計算表面積,但不是音量!我相信光柵維護人員會很樂意爲此提供一些代碼!

+0

非常感謝你的回答。我剛剛將我的數據樣本添加到上述問題中。如果你看一看,我會很感激。 – AliCivil 2013-05-05 10:00:16

+0

謝謝太空人的全面回答!對此,我真的非常感激。 – AliCivil 2013-05-06 00:04:40

1

如果點是任意的(即,不遵循平滑函數),似乎你正在尋找圍繞這些點的凸包(最小曲面)的體積。一個包來幫助你計算這個是alphashape3d

您需要一個3列矩陣的座標來形成正確的對象類型來進行計算,但它看起來相當直接。