可視化技術(shù)在計(jì)算機(jī)模擬中的應(yīng)用_第1頁(yè)
可視化技術(shù)在計(jì)算機(jī)模擬中的應(yīng)用_第2頁(yè)
可視化技術(shù)在計(jì)算機(jī)模擬中的應(yīng)用_第3頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

可視化技術(shù)在計(jì)算機(jī)模擬中的應(yīng)用

1適用于實(shí)時(shí)模擬的深度方面計(jì)算機(jī)模擬是計(jì)算機(jī)價(jià)值測(cè)試,是人們理解和研究自然環(huán)境的新手段??梢暬夹g(shù)能在計(jì)算模擬時(shí)為分析問(wèn)題提供可觀察的清晰逼真圖像。尤其是在模擬一些3D空間中發(fā)生的物理化學(xué)等變化時(shí),需要從不同視角觀察系統(tǒng)的演化過(guò)程,以便及時(shí)正確分析產(chǎn)生各種現(xiàn)象的原因及其相互聯(lián)系;因此,在計(jì)算模擬中融入可視化技術(shù)常常具有非常重要的意義。OpenGL是一種具有完全可移植性和質(zhì)量高性能好的3D圖形和建模庫(kù),被廣泛用于實(shí)時(shí)3D圖形顯示或構(gòu)圖等領(lǐng)域。但是,OpenGL是一組用C語(yǔ)言編寫(xiě)的API函數(shù),用C語(yǔ)言直接調(diào)用其中的函數(shù),就會(huì)象其它面向過(guò)程的程序一樣,其代碼的重用性和模塊間的獨(dú)立性較差等缺點(diǎn)。如果程序功能有微小變化,常常不得不重新編寫(xiě)許多代碼,不僅增加了工作量,也增加了錯(cuò)誤出現(xiàn)的機(jī)會(huì)。用C++的面向?qū)ο缶幊毯头缎途幊谭椒▽?duì)OpenGL的函數(shù)進(jìn)行封裝,可以大大地減少這種重復(fù)工作,而且程序的結(jié)構(gòu)更加清晰,可讀性更好。本文以計(jì)算模擬中用到的一個(gè)實(shí)時(shí)3D顯示問(wèn)題為例,討論范型編程對(duì)OpenGL函數(shù)進(jìn)行封裝的實(shí)現(xiàn)方法和步驟。2數(shù)的調(diào)用功能設(shè)有一個(gè)類CSimulator,它除了完成計(jì)算模擬涉及的各種運(yùn)算任務(wù)外,還有一個(gè)實(shí)現(xiàn)繪圖功能成員函數(shù)Draw(),比如顯示模擬的反應(yīng)器內(nèi)流場(chǎng)分布。該函數(shù)可以在OpenGL的渲染回調(diào)函數(shù)中被調(diào)用。一般可以在主函數(shù)的程序中這樣實(shí)現(xiàn):由于有程序清單2中的CGraph類幫助管理繪圖有關(guān)的數(shù)據(jù)和幾乎所有回調(diào)函數(shù)的實(shí)際代碼,程序清單3中回調(diào)函數(shù)只是用CGraph類對(duì)象aGraph的相應(yīng)函數(shù),因此比清單1中的要簡(jiǎn)潔得多,其代價(jià)是每個(gè)回調(diào)函數(shù)多了一層函數(shù)調(diào)用,而在一般情況下是微不足道的。而且CGraph類具有相對(duì)的完整性和封閉性,移植到其它程序中只需做很少的改動(dòng)就可以再次利用,因此,這一版的代碼質(zhì)量要比前一版好。3類dra類但是新版的程序有兩點(diǎn)缺陷:首先,在CGraph類中用到了類CSimulator,也即CGraph嚴(yán)重依賴于CSimulator類,如果要為新的模擬類服務(wù)時(shí),必須修改CGraph類中的#include語(yǔ)句和CGraph::RenderScene()函數(shù)的聲明和定義。雖然在這里這種改變只有幾行代碼的工作量,但這讓使用這個(gè)類的用戶每次修改都要記住這份重復(fù)工作是不可取的。這也破壞了類的封裝性,也即這個(gè)類沒(méi)有實(shí)現(xiàn)完全封裝。其次,在清單3中,回調(diào)函數(shù)和OpenGL的glut函數(shù)雖然現(xiàn)在看來(lái)是不多,但要加上一些其它功能的glut函數(shù)及相應(yīng)的回調(diào)函數(shù),還是會(huì)有很大一堆,盡管可以用拷貝粘貼來(lái)減小寫(xiě)代碼的工作量,但看起來(lái)還是太雜亂,不清晰簡(jiǎn)潔,使用起來(lái)很不方便,有理由要求程序能變得更好。第一個(gè)問(wèn)題的解決辦法是將類改成類模板,這樣,CGraph就不僅僅是針對(duì)具體某一個(gè)類了,而是針對(duì)許多類,即實(shí)現(xiàn)了范化,或者稱為一般化,只要這個(gè)類有一個(gè)名字為Draw()的共有成員函數(shù)實(shí)現(xiàn)其渲染。第二個(gè)問(wèn)題的解決辦法是利用宏,將回調(diào)函數(shù)的定義和glut函數(shù)的調(diào)用都移到CGraph模板所在的Graph.h頭文件中。在這一版從程序中,加入了初始化OpenGL設(shè)置函數(shù)和縮放、移動(dòng)和旋轉(zhuǎn)功能。這里也還是作為一個(gè)示例,在實(shí)際中可能更復(fù)雜,但范化的方法是一樣的。以上清單4中回調(diào)函數(shù)定義宏GRAPH_DEFINE有3個(gè)參數(shù):Simulator_T是一個(gè)計(jì)算模擬的類,該類必須有一個(gè)實(shí)現(xiàn)渲染的Draw()成員函數(shù),就像清單1中的CSimulator類。aSimulator是Simulator_T類的實(shí)例化對(duì)象,和程序清單1中的aSimulator對(duì)應(yīng),它在渲染回調(diào)函數(shù)中作為輸入?yún)?shù)傳給模板類對(duì)象的RenderScene函數(shù)。IdleFunction是一個(gè)用戶定義的函數(shù)指針,該函數(shù)沒(méi)有輸入?yún)?shù),其返回值為bool型,在回調(diào)函數(shù)IdleFunc中被調(diào)用,并根據(jù)其返回值決定是否要刷新窗口。OpenGL初始化宏GRAPH_INITIALIZE有5個(gè)參數(shù),正如其名字表示的意義,分別是窗口左上角的x,y坐標(biāo)、窗口的寬和高及窗口的名字。相對(duì)于前兩版,范型版增加了響應(yīng)鼠標(biāo)和鍵盤(pán)操作的glut函數(shù)及其回調(diào)函數(shù)(分別是旋轉(zhuǎn)、平移和縮放)和自定義的初始化函數(shù)GLSetupRC()。這樣,就完全封裝好了3D圖像實(shí)時(shí)顯示的功能。現(xiàn)在的主函數(shù)程序(也是用戶要做的工作)就可以變得很清晰簡(jiǎn)潔,使用CGraph時(shí),可以不對(duì)Graph.h頭文件的內(nèi)容作任何修改,就能實(shí)現(xiàn)圖像的移動(dòng)、縮放和旋轉(zhuǎn)等實(shí)時(shí)操作功能(當(dāng)然如要添加和更新功能,自然可以修改此文件的內(nèi)容)。如果給宏GRAPH_DECLARE傳入了一個(gè)名為IdleFunction的函數(shù),程序還可以在沒(méi)有響應(yīng)其它命令的時(shí)候反復(fù)調(diào)用該函數(shù),實(shí)現(xiàn)一種循環(huán)操作,模擬系統(tǒng)的演化過(guò)程(如不需要定義此函數(shù),可以false作輸入?yún)?shù))。下面是一個(gè)應(yīng)用范型版本類模板CGraph的主函數(shù)程序清單:程序中與3D圖像實(shí)時(shí)顯示有關(guān)的代碼只有4處:其中1,3,4都只有一句代碼,2是模擬中要實(shí)現(xiàn)的循環(huán)操作,它在內(nèi)部調(diào)用了模擬類CSimulator的一些函數(shù)(這里是由CSimulator::SingleStep(iStep)函數(shù)封裝了CSimulator的一系列內(nèi)部操作)??梢钥闯?在這一版里,Graph.h文件中的代碼不依賴于其它程序,具有很好的獨(dú)立性。唯一的要求是新的循環(huán)函數(shù)(例中的Loop)和模擬類中執(zhí)行渲染的成員函數(shù)(例中的Draw)遵守一定的接口要求,這些都是很容易做到的。圖1是一個(gè)運(yùn)用上面的方法實(shí)現(xiàn)了可視化功能的受迫振動(dòng)粒子系統(tǒng)的3D顯示圖片,在該實(shí)例中,實(shí)現(xiàn)了對(duì)3D圖形的實(shí)時(shí)顯示和平移、旋轉(zhuǎn)、縮放等功能。4glutlnitdisp內(nèi)部設(shè)置功能本文討論了運(yùn)用C++提供的范型編程思想在計(jì)算模擬中實(shí)現(xiàn)實(shí)時(shí)3D顯示的程序設(shè)計(jì)過(guò)程,并對(duì)OpenGL的有關(guān)可視化函數(shù)成功實(shí)現(xiàn)了封裝。設(shè)計(jì)結(jié)果表明,范型編程方法使CGraph具有更廣泛的適用性和可重用性,而不是強(qiáng)烈的依賴于某一個(gè)具體類。實(shí)際上,上面編寫(xiě)的CGraph類模板可以被用在很廣的計(jì)算模擬和其它領(lǐng)域中,而且用戶還可以根據(jù)需要在Graph.h文件中擴(kuò)展CGraph的功能,因此,還具有很好的可擴(kuò)展性。main函數(shù)中的glutlnitDisplayMode設(shè)置顯示模式為雙緩沖區(qū),并使用RGB顏色模式,指定一個(gè)32位深度緩沖區(qū);glutlnitWindowPosition,glutlnitWindowSize,glutCreateWindow分別定義窗口的初始位置,寬度和高度及窗口的名稱;glutReshapeFunc在窗口大小改變時(shí)調(diào)用回調(diào)函數(shù)ChangeSize重新設(shè)置坐標(biāo)系。glutDisplayFunc調(diào)用渲染函數(shù)RenderScene實(shí)現(xiàn)渲染功能。這是一個(gè)簡(jiǎn)單的OpenGL程序,實(shí)際應(yīng)用中一般還會(huì)調(diào)用更多的glut函數(shù),相應(yīng)的要定義更多的回調(diào)函數(shù)。并且為了實(shí)現(xiàn)函數(shù)之間的數(shù)據(jù)傳遞,還需額外定義一些公共變量。這樣,程序?qū)⒆兊酶嫶?更復(fù)雜??梢韵胂?這樣的程序代碼其可重用性是很差的(為了清晰起見(jiàn),本文在此沒(méi)有列出這部分代碼,只在最后的范型實(shí)現(xiàn)版本中作為示例加入一些新的功能)。一個(gè)改進(jìn)的方法是用一個(gè)類(CGraph)將與繪圖有關(guān)的變

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論