網(wǎng)絡(luò)模型圖形管理論文

時(shí)間:2022-06-29 07:13:00

導(dǎo)語:網(wǎng)絡(luò)模型圖形管理論文一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

網(wǎng)絡(luò)模型圖形管理論文

通過不連續(xù)面三維網(wǎng)絡(luò)模擬獲得了在模擬空間范圍內(nèi)具一定概率分布特征的不連續(xù)面,這些不連續(xù)面的形態(tài)以圓盤形式表示,空間位置由圓盤中心點(diǎn)坐標(biāo)及產(chǎn)狀表示,大小由圓盤直徑體現(xiàn)。根據(jù)模擬的結(jié)果可以進(jìn)一步進(jìn)行巖體穩(wěn)定分析、巖體水力學(xué)性質(zhì)等研究,但首先要解決的問題就是三維網(wǎng)絡(luò)模型圖形化,即可視性,沒有圖形,研究將難以深入。為了使得研究者能直觀地看到不連續(xù)面的三維網(wǎng)絡(luò)模型,并能對網(wǎng)絡(luò)模型進(jìn)行切割產(chǎn)生平面網(wǎng)絡(luò),進(jìn)而對這些圖形直接進(jìn)行處理,比如輸出等。筆者用C++語言在BorlandC++3.1集成環(huán)境下編寫了一系列計(jì)算機(jī)程序,使得三維網(wǎng)絡(luò)模型的應(yīng)用更加方便可行。

1程序組成

本模塊由以下文件組成:

3dnet.cpp,3dnet.exe,3ddraw.cpp,3dnet.prj,3dtools.cpp,3dnet.dat,news.cpp,3ddraw.h,tools.cpp,3dtools.h,3dfront.cpp,news.h,hzktext,tools.h,hzf24,egavea.bgi,trip.chr。

在Borlandc++3.1的集成環(huán)境中經(jīng)工程文件編譯,產(chǎn)生3DNET.EXE可執(zhí)行文件,在DOS或Windows環(huán)境下運(yùn)行。

2程序編制依據(jù)

2.1結(jié)構(gòu)面三維圖形顯示

2.1.1求圓盤上各點(diǎn)三維坐標(biāo)

對于一個節(jié)理圓盤,沿其法向觀測時(shí)其為一圓形,沿其走向觀測時(shí)其為一線段,除此之外,從其他任何角度去觀測,節(jié)理圓盤都為橢圓。C++語言所提供的繪橢圓函數(shù)ellipse()只能繪制長軸為X軸、短軸為Y軸的橢圓,而無法實(shí)現(xiàn)任意形狀橢圓的顯示,因此還得從圓盤軌跡著手,用moveto()、lineto()等函數(shù)來實(shí)現(xiàn)。

由于三維網(wǎng)絡(luò)模擬產(chǎn)生的節(jié)理是以具有中心點(diǎn)坐標(biāo)、產(chǎn)狀和直徑的圓盤表示,所以圓盤上的每一點(diǎn)相對于模型來說都是確定的,都可以用一組三維坐標(biāo)表達(dá)。

求圓盤各點(diǎn)的坐標(biāo)是出于這樣的出發(fā)點(diǎn):對照圖1,對于一圓盤,很容易得到其傾向線,以傾向方向的半徑OA順時(shí)針(或逆時(shí)針)旋轉(zhuǎn)一角度,得到另一半徑OB,求出B點(diǎn)的坐標(biāo),旋轉(zhuǎn)角的取值由0°到360°,即得到該圓盤的軌跡。

對于傾角為α、傾向?yàn)棣?、半徑為R中心點(diǎn)坐標(biāo)為(Xo,Yo,Zo)的節(jié)理圓盤,其投影到水平面上則為一橢圓,該橢圓長半軸沿走向方向(以下所說的走向均指服從右手法則,長度為a=R,短半軸沿傾向方向,長度為b=Rcosa。

如果平移并沿Z軸旋轉(zhuǎn)坐標(biāo)系,使X軸與圓盤在水平面投影的橢圓長軸一致且原心在橢圓中心點(diǎn),則橢圓上一點(diǎn)的坐標(biāo)可表示為:

X''''=acosq=Rc(2-1-1)

Y''''=bsinq=Rcosasinq(2-1-2)

q為所求坐標(biāo)點(diǎn)與原心連線與橢圓長軸的夾角(逆時(shí)針為正),也就是圓盤上所求坐標(biāo)點(diǎn)與圓盤中心點(diǎn)連線與走向線的夾角。

再把坐標(biāo)變換回來,即得到圓盤上任意一點(diǎn)的三維坐標(biāo),分別為:

X=Xo+X''''cosb+Y''''sinb(2-1-3)

Y=Y(jié)o+X''''sinb+Y''''cosb(2-1-4)

Z=Zo-Rsinα''''(2-1-5)

α''''為所求坐標(biāo)點(diǎn)與圓盤中心點(diǎn)連線的傾角

α''''是這樣確定的,圓盤與水平面的交線必為走向線,在圖1中,OA為圓盤傾向方向半徑,OB為與OA夾角為θ的一半徑,兩半徑與水平面分別交于A''''點(diǎn)和B''''點(diǎn),圓盤中心點(diǎn)O在水平面上的垂直投影點(diǎn)為O'''',A''''B''''即為走向線,O''''A''''B''''構(gòu)成水平面。

因?yàn)镺O''''與A''''O''''垂直、OB''''與B''''O''''垂直,并且OA''''垂直于A''''B''''(走向線與傾向線),所以有:

OA''''=OO''''/sina(α為圓盤傾角)(2-1-6)

OB''''=OO''''/sina''''(a''''為OB與水平面夾角)(2-1-7)

OA''''=OB''''sinq(2-1-8)

即:

sina''''=sinasinq(2-1-9)

所以

Z=Zo-Rsinasinq(2-1-10)

2.1.2求圓盤在視面上的平面坐標(biāo)

計(jì)算機(jī)屏幕是個平面,要把一個三維物體在屏幕上顯示出來,首先要把該物體各點(diǎn)的三維坐標(biāo)變換為平面坐標(biāo)。相對于物體,屏幕是個投影面,該面位于觀測者與被觀測物體之間,如圖2。對于表征物體的三維坐標(biāo)系O_XYZ,設(shè)觀測點(diǎn)的位置為V,其直角坐標(biāo)為(X,Y,Z),球面坐標(biāo)為(ρ,θ,φ),顯示屏與直線OV垂直,與V點(diǎn)的距離為D,對于物體的每一個點(diǎn)(X,Y,Z),都對應(yīng)一個投影面平面坐標(biāo)(SX,SY),該投影面坐標(biāo)系方向如此定:當(dāng)觀測者的視線朝著O_XYZ坐標(biāo)系的坐標(biāo)原點(diǎn)時(shí),SX軸指向右側(cè),SY軸指向上方。

三維物體上的任一點(diǎn)(X,Y,Z)表示到二維顯示平面上的平面坐標(biāo)(SX,SY)為:

SX=-Xsinθ+Ycosθ(2-1-11)

SY=-Xcosθcosφ-Ysinθcosφ+Zsinφ(2-1-12)

式中:θ為觀測線在O-XY面上的投影線與X軸之間的夾角,φ為觀測線與Z軸的夾角。

2.1.3視區(qū)及象素

在C++圖形方式下,計(jì)算

機(jī)屏幕上的位置通過象素(正整數(shù))體現(xiàn),每一個象素對應(yīng)于屏幕上的一個點(diǎn),象素的個數(shù)(分辨率)依賴于系統(tǒng)的圖形適配器和連入系統(tǒng)的顯示器類型及所處的方式。對于一般的VGA彩卡和彩色顯示器,X方向的象素為0~640,Y方向的象素為0~480,C++的繪圖函數(shù),只能在此矩形區(qū)間內(nèi)顯示圖形。

通過三維物體的二維表示得到的三維網(wǎng)絡(luò)模型各點(diǎn)的二維坐標(biāo)值是相對于用戶投影坐標(biāo)系的,要全顯或部分顯示網(wǎng)絡(luò)模型,必須通過比例縮放把這些二維坐標(biāo)值轉(zhuǎn)換為計(jì)算機(jī)屏幕上的象素,才能顯示圖形。

在C++圖形狀態(tài)下,往往在屏幕上留下一部分位置作菜單顯示或其他用途,只用屏幕上的某一矩形范圍作為圖形顯示用,該矩形部分稱為視區(qū)。對于三維網(wǎng)絡(luò)模型,為了全顯或部分顯示其圖形,也需要在其平面投影圖上確定要顯示的范圍,該矩形范圍成為窗口。如何把由窗口內(nèi)的物體在視區(qū)中顯示出來,首先要確定顯示比例。

如圖3,設(shè)窗口的四條邊界分別為:

左X=X1,右X=X2,下Y=Y1,上Y=Y2

設(shè)視區(qū)的四條邊界分別為:

左X=SX1,右X=SX2,下Y=SY1,上Y=SY2

經(jīng)變換后,窗口的上邊界線段(或下邊界線段)長X2-X1變換成視區(qū)上邊界線段(或下邊界線段)長SX2-SX1,設(shè)其比例變換因子為K1,則

K1=(SX2-SX1)/(X2-X1)(2-1-13)

對窗口內(nèi)任一X坐標(biāo)(X1≤X≤X2)變換后為視區(qū)內(nèi)水平方向SX坐標(biāo)(SX1≤SX≤SX2),

SX=SX1+K1(X-X1)(2-1-14)

同理,對窗口內(nèi)任一Y坐標(biāo)(Y1≤X≤Y2)變換后為視區(qū)內(nèi)水平方向SX坐標(biāo)(SY1≤SY≤SY2),

K2=(SY2-SY1)/(Y2-Y1)(2-1-15)

SY=SY1+K2(Y-Y1)(2-1-16)

由式(2-1-14)和式(2-1-16),把所求得的SX、SY值通過四舍五入的辦法由實(shí)型數(shù)都轉(zhuǎn)化為整型數(shù),該數(shù)值即為C++圖形狀態(tài)的象素值。根據(jù)這些象素值,利用C++語言的基本繪圖函數(shù),就可以把由窗口定義的范圍內(nèi)的物體在視區(qū)中顯示出來,但必須注意以下兩點(diǎn):

①長寬比例變換。由于窗口的長寬比與視區(qū)的長寬比并不一定相同,如果圖形的X與Y方向按各自的比例變換因子K1、K2,將使的圖形發(fā)生變形,而盲目使用某一個值又可能會使得窗口中的圖形不能全顯,為確保窗口中的圖形全顯且保持原樣,必須對K1、K2值進(jìn)行比較,取兩者之間的小者,作為統(tǒng)一的圖形比例系數(shù)。

②坐標(biāo)軸方向變換。一般屏幕坐標(biāo)系是直角左手系,Y軸方向向下為正,原點(diǎn)在屏幕左上角,而窗口內(nèi)圖形上的任一點(diǎn)(X,Y)是相對于右手坐標(biāo)系的,因此在把(X,Y)變換為屏幕上的(SX,SY)時(shí),Y值發(fā)生了變化,即圖形產(chǎn)生了倒置,為保持圖形一致,只需把所得的SY值用SY2-SY代替即可。

2.2三維圖形處理及輸出

對于一個圖形的操作是十分必要的,通過對圖形旋轉(zhuǎn)、放大、移動,可以全面地了解圖形的特征,把圖形打印輸出,可以永久保存。

2.2.1旋轉(zhuǎn)、放大及移動

在計(jì)算機(jī)屏幕上顯示三維網(wǎng)絡(luò)模型等圖形之后,有時(shí)要對圖形進(jìn)行旋轉(zhuǎn),從不同的角度來觀測該圖形,可通過改變觀測線的角度實(shí)現(xiàn)這一目的。在三維坐標(biāo)的二維表示中已引進(jìn)了θ和φ兩個參數(shù),θ為觀測線在OXY平面上的投影線與X軸的夾角,φ為觀測線與Z軸的夾角,調(diào)整θ、φ,即可唯一確定一觀測線,所得的圖形即相對于與該觀測線垂直的視平面圖形。在程序中可利用菜單,通過屏幕輸入θ、φ值,由式(2-1-11)、式(2-1-12)而改變圖形在視平面上的二維坐標(biāo),圖形的象素也將隨之改變,從而實(shí)現(xiàn)圖形在三度空間中沿任意軸的選轉(zhuǎn)。

圖形的放大及移動實(shí)際上是對窗口進(jìn)行操作。對屏幕上顯示的圖形的某部分進(jìn)行放大顯示時(shí),用鼠標(biāo)在屏幕圖形上選定一矩形域,該矩形域的各頂點(diǎn)相應(yīng)于二維平面視圖中的窗口中的一小窗口,通過調(diào)整比例變換因子而使該小窗口中的圖形充滿整個視區(qū),從而達(dá)到圖形放大的目的。這時(shí)要想看到其他位置的圖形,可以用鼠標(biāo)在圖形中固定一點(diǎn)再拖動到一個新位置,可求出鼠標(biāo)的象素位移,由比例變換因子而知道相應(yīng)于該位移的視平面坐標(biāo)值,依此值而相應(yīng)調(diào)整窗口中的圖形內(nèi)容,達(dá)到圖形移動的目的。

2.2.2圖形輸出

通過坐標(biāo)變換,用C++程序在屏幕上顯示所需要的圖形,這些圖形其實(shí)是由一系列坐標(biāo)值通過繪圖函數(shù)而實(shí)現(xiàn),為了輸出這些圖形,可以把這些坐標(biāo)值寫到文件上,同時(shí)寫入各繪圖命令,比如用起筆、落筆的方式寫到*.plt文件上,用Surfer軟件輸出圖形;用AutoCAD基本圖元命令寫到*.scr文件上,并在AutoCAD環(huán)境中進(jìn)行編輯,最后打印輸出這些圖形。

3結(jié)束語

根據(jù)以上介紹的原理編制出的程序,不僅可以對不連續(xù)面三維網(wǎng)絡(luò)模擬產(chǎn)生的三維網(wǎng)絡(luò)模型進(jìn)行三維圖形顯示及處理,也可以對實(shí)測的不連續(xù)面構(gòu)成的實(shí)體三維圖形進(jìn)行操作。該程序的主要作用之一是為了切割任意截面的不連續(xù)面形跡圖。至于如何切制這些圖形,將在以后的文章中介紹。