蔣先剛,陶龍風(fēng),馬得安
(華東交通大學(xué) 1.信息工程學(xué)院;2.基礎(chǔ)科學(xué)學(xué)院,江西 南昌330013)
三維空間數(shù)據(jù)場的顯示與計(jì)算是計(jì)算機(jī)圖形學(xué)中一個重要的應(yīng)用研究范圍,它是分析和描述三維數(shù)據(jù)內(nèi)部結(jié)構(gòu)信息的有效方法。工廠煤儲量的數(shù)據(jù)是一個變化的曲面體數(shù)據(jù),通過實(shí)時的激光掃描,可將煤堆每一截面的頂部曲線數(shù)據(jù)獲取,依據(jù)截面二維數(shù)據(jù)就可構(gòu)建和顯示出三維數(shù)據(jù)場。我們通過OLE自動化把測量的煤堆的自定義格式數(shù)據(jù)轉(zhuǎn)換為通用格式的二維切片數(shù)據(jù)并轉(zhuǎn)換為三維數(shù)據(jù)場以直觀的效果圖顯示出來,通過三維數(shù)據(jù)的體積計(jì)算以獲得煤場的儲存量。
工廠煤場體積測量系統(tǒng)主要功能模塊包括圖像攝入(即利用Lase激光系統(tǒng)測量二維橫截面數(shù)據(jù),且測量的精確度達(dá)到0.1 mm)、OLE自動化獲取二維截面數(shù)據(jù)、用Marching Cubes和直接體繪制顯示和計(jì)算三維曲面體體積。本文運(yùn)行的環(huán)境是Windows XP操作系統(tǒng),Delphi7開發(fā)平臺,具體的軟件流程如圖1所示。
圖1 煤堆體積估算與顯示的軟件流程圖
通過Lase激光掃描硬件系統(tǒng)獲得的數(shù)據(jù)一般以Excel格式保存,需要采用合理的接口文件得到這個三維掃描數(shù)據(jù),因此需要利用客戶程序(如工廠煤場的顯示和測量估算三維重構(gòu)系統(tǒng))控制和訪問服務(wù)器程序(Excel小型數(shù)據(jù)分析軟件系統(tǒng))這樣的OLE自動化技術(shù)。OLE自動化的技術(shù)可使得客戶程序能控制其他應(yīng)用程序或DLL中的對象的屬性和方法。典型的的OLE自動化服務(wù)器的例子是外部調(diào)用Excel和Word[1]。Excel即為一個服務(wù)器程序,它除了完成數(shù)據(jù)輸入,計(jì)算排序等功能外,還提供供外部程序訪問內(nèi)部數(shù)據(jù)的對象、方法和屬性。
本文中的三維重構(gòu)程序作為客戶程序通過OLE自動化技術(shù)訪問服務(wù)器程序(Excel)的方法和屬性,以讀取不同y位置的Excel中每一截面的離散x,z坐標(biāo)。由于本文涉及的Excel中的數(shù)據(jù)是用空格來分隔各組不同數(shù)據(jù)的,程序設(shè)計(jì)時以空格作為數(shù)據(jù)各字段的分隔標(biāo)志進(jìn)行分析。
三維數(shù)據(jù)體繪制技術(shù)可以分為兩大類[2]:面繪制(Surface Rendering)和直接體繪制(Direct Volume Rendering)。面繪制技術(shù)是從3D數(shù)據(jù)場中抽取有意義和直觀信息的一種重要手段。它實(shí)際上是把體數(shù)據(jù)轉(zhuǎn)換成一種逼近面形式,從而可以進(jìn)一步利用計(jì)算機(jī)圖形的OpenGl的顯示技術(shù)。直接體繪制技術(shù)是以某種方式將整個數(shù)據(jù)場半透明地投影到2D屏幕上,并不借助中間幾何圖形,在本系統(tǒng)設(shè)計(jì)中可快速顯示二維截面的一般分布情況。Lase得到的數(shù)據(jù)只是煤堆截面的表面數(shù)據(jù),它在顯示曲面體時,通過將等值面上不完整立方體(如圖2右上角所示小塊)和曲面內(nèi)完整的立方體(如圖2左下角四方塊)的體積累計(jì)就可獲得曲面立方體的總體積。因此在進(jìn)行體積計(jì)算時主要用到的重構(gòu)方法采用Marching Cubes面繪制技術(shù)。
Marching Cubes[2]提出的有關(guān)算法主要針對三維規(guī)則網(wǎng)絡(luò)數(shù)據(jù)提出,這類數(shù)據(jù)常見于計(jì)算機(jī)X光斷攝影(CT)、磁共振(MR)、單光子發(fā)射計(jì)算機(jī)斷層攝影(SPECT)、地震測定以及工廠煤量的測量。Lorensen和Cline則以立方體單元為研究對象,每個立方體由相鄰兩層切片上的8個數(shù)據(jù)組成。對于一個已知的等值面(其中某一變量取常數(shù)值的面)的值,立方體每個頂點(diǎn)處的值或大于或小于或等于該值。若頂點(diǎn)數(shù)據(jù)值大于或等于等值面的值,則該頂點(diǎn)位于等值面之上,賦值為1;否則該頂點(diǎn)低于等值面,賦值為0。等值面只與那些兩端取不同值的邊相交。通過利用Marching Cubes方法的這些特點(diǎn)將有利于煤場體積計(jì)算的程序設(shè)計(jì),本文應(yīng)用基于Marching cubes的煤堆顯示與計(jì)算的主程序界面如圖2所示,圖的左邊是重構(gòu)的煤場曲面體圖形,曲面體由有限個規(guī)則立方體和被截立方體組成,圖的右邊是截取的二維截面圖。
圖2 基于Marching cubes的煤堆顯示與計(jì)算的主程序界面
對三維曲面體體積的計(jì)算有很多方法[3],如DTM法、單位立方體累計(jì)計(jì)算法—方格網(wǎng)法、基于橫截面的體積計(jì)算方法—等截面法、等高線法等,考慮到三維數(shù)據(jù)場的顯示與體積計(jì)算能夠都兼顧到,本文主要應(yīng)用的是方格網(wǎng)法和等截面法。
2.3.1 單位立方體累計(jì)計(jì)算方法
通過激光技術(shù)可以得到煤場的二維數(shù)據(jù),但是要利用這些數(shù)據(jù)估算它的體積,我們可以應(yīng)用單位立方體累計(jì)的計(jì)算方法—方格網(wǎng)法。利用Marching Cubes重構(gòu)三維圖形時[4],令i,j,k分別表示重構(gòu)出來曲面體的x,y,z方向的不同單位序號的取值,將i,j,k與等值面相交進(jìn)行比較,如果沒有交點(diǎn),則得到的單位立方體都是完整的,此時需將規(guī)則立方體個數(shù)k加1,特別需要注意的是在i=0或j=0或k=0時等,即移動的立方體處在外表面時,它是等值面上的一個規(guī)則立方體,此時規(guī)則立方體個數(shù)k仍需加1;在對立方體內(nèi)的等值面進(jìn)行三角片化時將會出現(xiàn)不完整立方體,此時就按照計(jì)算不規(guī)則立方體的方法計(jì)算體積。
利用立方體單元的兩種對稱性,可以將不規(guī)則立方體三角片分布的種類由256種情況減少到15種[2]。本文列舉了其中比較常見的3種不完整立方體被截面的幾何構(gòu)成圖,如圖3所示。我們就不規(guī)則立方體的體積的計(jì)算參照如圖3中的(b)[5]所示,先根據(jù)Marching cubes等值面的計(jì)算得到交點(diǎn)的坐標(biāo)分別為C(a1,b1,c1),B(a2,b2,c2),D(a3,b3,c3),不規(guī)則立方體的體積等于規(guī)則立方體的體積減去上部被截部分,這樣就可以根據(jù)體積公式算出我們所要求的不規(guī)則立方體的體積為
圖3 被截不完整立方體構(gòu)成的3種常見圖形
通過上面程序設(shè)計(jì)可以算出煤場中煤的保存量,同樣我們也由此得到工廠里煤的消耗量,根據(jù)每天的產(chǎn)電耗煤指標(biāo)就可合理組織煤場煤的調(diào)度,以保證工廠有合理而經(jīng)濟(jì)的煤儲量,實(shí)現(xiàn)對煤的合理管理和調(diào)用。
2.3.2 基于橫截面的曲面體積計(jì)算方法
利用橫截面計(jì)算煤堆的體積是另一種高效的體積計(jì)算方法,這種方法也稱斷面法[3]求體積。此方法首先將煤堆y軸方向的長度平均等份為n等份(n為正整數(shù)),如圖4所示,且設(shè)在yi點(diǎn)的橫截面的面積為si,在yi+L點(diǎn)的橫截面的面積為si+1,這時當(dāng)si與si+1形狀相似,相對誤差不大于20%,采用棱柱體體積計(jì)算公式求體積,否則采用截錐體體積計(jì)算公式,即
式中:v為煤堆的體積,L為相鄰截面的距離,si為第i個截面的面積。
據(jù)煤的煤化程度和工藝性能指標(biāo)煤可以分為褐煤、煙煤、無煙煤和硬煤等,它們的比重分別為1.30×103kg?m-3,1.28×103kg?m-3,1.56×103kg?m-3,1.21×103kg?m-3,又根據(jù)經(jīng)驗(yàn)公式可知質(zhì)量 =體積×比重,即m=v×p,用上述兩種方法獲取三維煤堆曲面體的體積,繼而求得煤堆的質(zhì)量。單位立方體累計(jì)計(jì)算總體積的方法求得消耗掉煤的重量與實(shí)際消耗掉的煤重量(稱量出實(shí)際用掉的煤量)相比,計(jì)算精度達(dá)到98.76%,基于橫截面的曲面體積計(jì)算方法求得的重量與實(shí)際的煤重相比,計(jì)算精度達(dá)到96.47%。
上述2種二維體積計(jì)算方法盡管都可以計(jì)算出煤堆的體積,但是2種方法之間各有優(yōu)缺點(diǎn)。單位立方體累計(jì)計(jì)算三維曲面體體積的方法得到煤堆的體積與實(shí)際量相比誤差較小,尤其是在單位立方體的取值越小,即曲面體劃分成 n×n×n,當(dāng)n較大時,程序處理與計(jì)算的時間會稍長,而基于橫截面計(jì)算體積的方法得到煤堆體積的時間相對而言較短,但誤差會大些,這兩種體積計(jì)算方法的精確度都能滿足工程的要求。
利用Lase測得的截面數(shù)據(jù)并通過Marching Cubes方法重構(gòu)煤場的三維圖像的同時,可以同時計(jì)算得到三維數(shù)據(jù)場的體積,即利用不參加等值面構(gòu)造的單位立方體累計(jì)和參加等值面構(gòu)造的不完整立方體的體積累加而計(jì)算三維曲面體總體積的方法實(shí)現(xiàn)對三維圖像體積的計(jì)算,基本上等值面構(gòu)造和體積計(jì)算是并行的,程序的運(yùn)行效率大大提高。因此在獲取曲面體體積時,盡量采用單位立方體累計(jì)計(jì)算體積的方法。
圖4 二維截面組成的曲面體體積單元計(jì)算示意圖
[1]蔣先剛.三維數(shù)據(jù)場重構(gòu)與顯示工程軟件設(shè)計(jì)[M].北京:中國水利水電出版社,2009:9.
[2]DAVID R.計(jì)算機(jī)圖形學(xué)的算法基礎(chǔ)[M].石教英,彭群生,等譯.北京:機(jī)械工業(yè)出版社,2006:7.
[3]廖克武,金永強(qiáng).南方CASS基礎(chǔ)礦山儲量與斷面法計(jì)算誤差分析[J].西部探礦工程,2009,(3):187-191.
[4]程東旭.一種改進(jìn)的Marching Cubes算法[A].第十二屆(北京)全國圖象圖形學(xué)學(xué)術(shù)會議(NCIG'2005)[C].北京:清華大學(xué)出版社,2006,(4):426-431.
[5]徐毅,李曉梅,許潤濤,等.對體可視化Marching Cube算法的改進(jìn)[J].計(jì)算機(jī)工程,1999(11):100-105.