資源描述:
《三維視圖繪制與消隱技術(shù)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、三維視圖繪制與消隱技術(shù)地理信息系統(tǒng)論壇(GISForum)--學(xué)術(shù)論文論壇BBS學(xué)術(shù)論文技術(shù)資料文件格式GIS標(biāo)準(zhǔn)化共享軟件GIS鏈接三維視圖繪制與消隱技術(shù) 作者:周堅華 1.問題的提出 在一些數(shù)據(jù)庫管理系統(tǒng)或辦公自動化和統(tǒng)計類軟件中,一般具有繪制三維視圖的功能。使用時通常要求在給出的表格中輸入繪圖的數(shù)據(jù)及視角、比例尺等參數(shù)。這只適用于小批量的統(tǒng)計數(shù)據(jù)繪制統(tǒng)計三維視圖。在地質(zhì)、地貌、氣象、水文、交通、林業(yè)等許多領(lǐng)域,需要描述的某一量通常具有空間分布特征,這種空間分布數(shù)據(jù)的數(shù)量一般十分龐大,當(dāng)使用上述三維視圖軟件繪圖時經(jīng)常會遇到輸數(shù)表格容納不下的問題,而且按表格重新輸入數(shù)據(jù)也容
2、易出錯和耗費許多人力。 三維視圖的繪制及相應(yīng)繪圖數(shù)據(jù)的組織并不是一件十分困難的事,使用少量程序代碼就可以實現(xiàn)這一目標(biāo)。本文將介紹一種以C++語言實現(xiàn)大批量數(shù)據(jù)繪制三維視圖的簡易方法。該法的關(guān)鍵技術(shù)在于:(1)以FoxPro數(shù)據(jù)庫管理系統(tǒng)整理繪圖數(shù)據(jù)并制成可為C++語言包括和調(diào)用的.h文件;(2)在繪制三維視圖中,以“多邊形法”進(jìn)行需遮蔽線段的消隱。 2.繪圖數(shù)據(jù)的準(zhǔn)備 繪圖的原始數(shù)據(jù)來自FoxPro(或FoxBase)數(shù)據(jù)庫管理系統(tǒng)??梢詫⒛撤鶊D的數(shù)據(jù)置于一個一維數(shù)組中,并包括在一個.h文件中。這樣只要在C++的繪三維視圖程序首包括該頭文件,就可以在程序的任何位置調(diào)用這些數(shù)
3、據(jù)。例如有一個數(shù)據(jù)串:3,8,10,11,27,6,……,設(shè)存放數(shù)組為A,數(shù)據(jù)文件名為data.h,在data.h中,該數(shù)據(jù)串的存放形式為: A={3, 8, 10, 11, 27, 6, ?。骸 。簘; 這些數(shù)據(jù)可由FoxPro的.dbf文件拷貝得到。當(dāng)然,在拷貝前還需經(jīng)過簡單的加工。設(shè)在.dbf文件中,待繪圖數(shù)據(jù)所在的字段為DT1,此時可增設(shè)一個字段DH(逗號),并將該字段的內(nèi)容全以“,”替換,然后以如下命令拷貝到data.h文件中:copytodata.hfieldDT1,DHdelewithblank隨后打開data.h文件,在數(shù)據(jù)首加上“A={”,在數(shù)據(jù)尾
4、加上“};”即可?! ?.繪三維視圖編程基本思想 繪三維視圖的關(guān)鍵技術(shù)在“消隱”,即消去在三維觀察時應(yīng)該被擋住看不見的線。在有關(guān)“計算機(jī)圖形學(xué)”的書籍中所介紹的消隱法多為“計算法”,即由當(dāng)前數(shù)據(jù)點行計算在已繪出的線條中哪些應(yīng)該隱去,再清除這些線條。筆者自己設(shè)計了一種簡便新穎的消隱法(這里姑且稱之為“多邊形法”),不僅程序代碼簡單,而且這種消隱法的原理也十分簡潔明了?,F(xiàn)將其基本思想及運算步驟介紹如下: 3.1首排數(shù)據(jù)繪X方向網(wǎng)線。以line函數(shù)將首排數(shù)據(jù)點連線; 3.2繪Y方向網(wǎng)線。將第2排與第1排在Y方向相對應(yīng)的數(shù)據(jù)點連線; 3.3以“多邊形法”做消隱。據(jù)第2排點的數(shù)據(jù)以
5、背景色涂刷一個多邊形,這樣,可能被第2排數(shù)據(jù)點連線所遮蔽的線條(即應(yīng)消隱的線)即被擦除; 3.4第2排數(shù)據(jù)繪X方向網(wǎng)線。以line函數(shù)將第2排數(shù)據(jù)點連線; 3.5重復(fù)步驟3.2~3.4,直至繪完全圖?! ?.繪三維視圖源程序(forWindows) draw3d.cpp #include #include"data.h" intPASCALWinMain(HANDLE,HANDLE,LPSTR,int); longFARPASCALWindowProc(HWND,WORD,WORD,LONG); intmv[15625];//mv[]為繪圖數(shù)據(jù)數(shù)組,存于data.
6、h中 HANDLEhInst; intPASCALWinMain(HANDLEhInstance,HANDLEhPrevInstance, LPSTRlpszCmdLine,intnCmdShow) { ……//此處略去了創(chuàng)建窗口的代碼塊 } longFARPASCALWindowProc(HWNDhWnd,WORDmessage, WORDwParam,LONGlParam) { HDChDC; PAINTSTRUCTps; HBRUSHhOldBrush; inti=0,j=0; intyy[MAXPTS];//MAXPTS為繪圖行或列數(shù),在dat
7、a.h中定義 staticPOINTPointTable[MAXPTS+2]; switch(message) {//定義畫筆或畫刷 staticLOGPENlpBlack={PS_SOLID,1,1,RGB(0,0,0)}; staticLOGPENlpGreen={PS_SOLID,1,1,RGB(0,255,0)}; staticLOGPENlpWhite={PS_SOLID,1,1,RGB(255,255,255)}; HBRUSHhBlackBrush;