




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第七章 消隱一、地形顯示 11、原理說明地形起伏數據常用DEM 形式給出。DEM 數據是一個規則排列的二維數組,它對應了一塊所表示的地面范圍,整個范圍劃分成大小相等的一系列矩形(通常是正方形)區域。區域對應的地面實際面積越小,DEM 分辨率越高。數組中的每個數據的下標都對應地形區域中的 X、Y 坐標表示的一個區域,數據本身表示該區域的平均高程。法是將每個DEM 數據用一個表示其高度的柱狀長方體,長方體的放地形表示的置位置對應于數據所在的位置。當所有的數據都這樣表示以后,從這些柱狀體的頂面組合可以看出地面的起伏狀況(如圖 7-1 所示)。為了正確的遮擋關系以達到消隱的目的,應該采用先遠后近的次序
2、依次繪制這些柱狀體。圖 7-1圖 7-2投影方式采用上一章所述的簡單投影方法。為了體現高程差異,投影平面選取 YOZ 平面,如圖 7-2 所示,那么,X 位置成為距離投影面的深度值,它對投影點(Y,Z)位置的影響如下式所示:Y=Y-Ky*XZ=Z-Kz*X(7-1)在 DEM 數據下標(i,j,0)的投影點(Y,Z)處繪制一個垂直的、高度為 X(i,j)的柱狀體;按照由遠到近的次序繪制好所有柱狀體,地形就繪制完畢。2、操作說明首先讀入DEM 數據,這需要準備一個二維數組存放數據。按照由遠到近的次序依次從數組中讀出數據,計算投影點位置,在計算的位置上繪制柱狀體。XYZ3、編程說明.打開工程項目,
3、選擇菜單項“消隱”,添加“地形顯示 1”子項,將其屬性項(Name)的屬性值改為英文字符“Terrain1”,雙擊菜單項建立菜單響應函數,在系統建立的空的響應函數中加入語句如下:private void Terrain1_Click(objecID = 51;Terrain11();der, EventArgs e)為了簡化編程,DEM 數據規定為一個 200X200 的 ASCII 碼數據文件,文件名為DEM.DAT,存放于C 盤根目錄下。建立函數 Terrain11,如下所示:private void Terrain11(), DEM=new200,200;/建立二維數組存放DEM數據DE
4、M = ReadDEM();/讀入高程數據size=3;/柱狀體的底面積設置為size*sizedouble ky = 0.4, kz = 0.3;/深度值對投影位置的影響比例系數 Graphics g = CreateGraphics();/創建圖形設備 g.Clear(Color.LightGray);/清空繪圖區dy =dz =)(ky * size+0.5);/深度值對投影位置的影響值)(kz * size+0.5);= 0; i 200; i+)j = 0; j 200; j+)forifory =z=)(j * size - i * size * ky);/Ky=0.4,Kz=0.
5、3)(-i*size*kz);/柱狀體基點為空間點(i,j,0)的投影點DrawPixel(g,dy,dz,size,y,z,DEMi,j);/畫高程值DEMi,j對應的柱狀體函數 ReadDEM 將硬盤中的DEM 數據文件讀入,其實現方法如下:private, ReadDEM(), D=new200,200;/建立數組存放DEM數據FileStream fs = new FileStream(c:DEM.dat, FileMode.Open, s.Read);BinaryReader r = new BinaryReader(fs);FileAfori = 0; i 200; i+)j =
6、0; j 200; j+)Di, j = r.ReadByte();forreturn D;該函數根據文件數據以二進制格式存取、且大小為 200 X200 等已知信息直接運用流方式實現,是一種簡化的方法。大多數的實際數據文件都有一個文件首部描述文件的組織信息,一般需要先讀出首部信息,然后根據首部信息生成數據存放結構變量、確定讀數據方法。該函數運用的流方式中的數據類型、方法等屬于系統提供的 System.IO 命名空間,因此需要事先說明命名空間,方法是在程序的頂端加入以下語句:using using using using using using using using using usingu
7、singSystem;System.IO;System.Collections.Generic;ponentM System.Data;System.Drawing;System.Drawing.Drawing2D; System.Linq;System.Text; System.Windows.Forms;System.Web.UI.DataVisualization.Charting;函數DrawPixel 繪制高程值DEMi,j對應的柱狀體。由于程序所使用的 System.Drawing.Drawing2D 命名空間沒有提供直接繪制三維柱狀體的方法,該函數用繪制三個填充四邊形的方法來實現
8、,如圖 7-3 所示:圖 7-3實現方法如下:private void DrawPixel(Graphics g,dx,dysize,x,y,z)x = x + 400;/X、Y方向適當偏移,以調整場景顯示位置y = -y + 400;/y方向需要顛倒P pts = new P4;pts0.X = x - dx;pts0.Y = y + dy;/y方向增量也需要顛倒,即y-dy變成y+dypts1.X = x - dx;pts1.Y = y + dy-z; pts2.X = x - dx+size; pts2.Y = y + dy-z; pts3.X = x - dx+size; pts3.Y
9、 = y + dy;g.FillPolygon(Brushes.White, pts); g.DrawPolygon(Pens.Black,pts); pts0.X = x;pts0.Y = y-z;pts1.X = x - dx;pts1.Y = y + dy-z; pts2.X = x - dx+size; pts2.Y = y + dy-z; pts3.X = x +size; pts3.Y = y -z;g.FillPolygon(Brushes.White, pts); g.DrawPolygon(Pens.Black,pts); pts0.X = x +size;pts0.Y =
10、y;pts1.X = x ;pts1.Y = y -z; pts2.X = x - dx+size; pts2.Y = y + dy-z; pts3.X = x - dx+size; pts3.Y = y + dy;g.FillPolygon(Brushes.White, pts);g.DrawPolygon(Pens.Black,pts);運行程序,查看效果。二、地形顯示 21、原理說明地形顯示 2 采用“曲面隱藏線的消除”算法根據 DEM 進行地形繪制。將每一個 DEM數據看成是一個空間點(i,j,z),其中 i,j 是 DEM 數據在數組中的下標,Z 是 DEM 數據。曲面隱藏線消除算法
11、是分別以行、列為,將每個行(列)的空間點用折線連接起來,構建一條空間曲線,將該空間曲線投影到投影平面。為了形成正確的遮擋關系,采用從前行(列)到后行(列)的次序依次繪制空間曲線;后行(列)的空間曲線只有投影結果的高度超過前行(列)已繪制曲線、因而沒有被阻擋的部分才得到繪制。由于行曲線會遮擋列曲線,列曲線也會遮擋行曲線,在實際繪制過程中采用行列交替的方式進行,目的是保證當前繪制的空間曲線在所有違背繪制的空間曲線中處在最前面。投影方式可以采用、平行投影中的任何式,在這里仍然采用簡單投影方法。觀察方向與 DEM 數組的關系如圖 7-3 所示,也就是行(列)數大的行(列)排面。投影平面選取 YOZ 平
12、面,如圖 7-2 所示,那么,X 位置(也就是行,在 DEM 中對應下標 j)成為距離投影面的深度值,它對投影點(Y,Z)位置的影響如仍可由式(7-1)表示。圖 7-3設置兩個一維數組分別已繪制曲線投影點(Y,Z)的高度值 Y的最大值和最小值,只有超出已有的最大值、最小值的投影曲線部分才得以繪制,同時更新最大、最小值。為了方便高度值的比較,兩個數組的是對應于投影平面中 Z軸整數值對應的 Y值。按照由遠到近的次序繪制好所有行、列對應的空間曲線,地形就繪制完畢。2、操作說明點擊菜單項“地形顯示 2”,系統將 DEM 數據讀入一個二維數組存放數據。按照由遠到近的次序依次從數組中讀出行、列數據,計算投
13、影點位置,將投影點依次連接,得到空間曲線。3、編程說明.打開工程項目,選擇菜單項“消隱”,添加“地形顯示 2”子項,將其屬性項(Name)的屬性值改為英文字符“Terrain2”,雙擊菜單項建立菜單響應函數,在系統建立的空的響應函數中加入語句如下:private void Terrain2_Click(objecID = 52;Terrain21();der, EventArgs e)行順序觀 方向DEM 數組列順序Terrain21 就是實現曲面隱藏線消隱的函數。使用的地形數據和讀地形數據的函數與“地形顯示 1”完全一樣。由于繪制的是地形,只設置了一個高程器,只有高于器的地形曲線才能得到繪制
14、。按照從右到左、從下到上的次序從 DEM 數組中并繪制 DEM 行列地形曲線。函數的最后還將可見的模型行列邊框繪制出來。具體函數及解釋如下所示:private void Terrain21(), DEM=new200,200;/建立二維數組存放DEM數據DEM = ReadDEM();/讀入高程數據 size=3;/相鄰兩像素點的距離double A = new double1280;/最大值,假設顯示器水平分辨率不超過1280fori = 0; i =0; i-)forj = 0; j =0; j-)/處理一列double y1 = i * size - j * size * ky;/(j,
15、i,DEMj,i)的投影點 double z1 = DEMj, i - j * size * kz;double y2 = i * size - (j + 1)* size * ky;/(j+1,i,DEMj+1,i)的投影點double z2 = DEMj + 1, i - (j + 1) * size * kz;Dealwith(g, y1+dy, z1+dz, y2+dy, z2+dz, A);fori = 0; i x2)/確保x1x2double1;x1=x2;x2=xx;double yy=y1;y1=y2;y2=yy;for (x =)x1 + 1; x Ax)Ax = y;if
16、 (flag = 0)/線段超出起始點xsave1 = x; ysave1 = y; flag = 1;elseif (flag = 1)/線段超出部分結束點xsave2 = x - 1; /計算超出部分結束點ysave2 = (y2 - y1) / (x2 - x1) * (double)(x - 1) - x1)+y1;flag = 0;ysave1 = 900 - ysave1; /向下的設備坐標系Y坐標反向 ysave2 = 900 - ysave2;/畫出超出部分g.DrawLine(Pens.Black,xsave1,)ysave1, xsave2,)ysave2);if (fla
17、g = 1)/直到本線段結束也未 被遮擋的處理方法y = (y2 - y1) / (x2 - x1) * (x - x1)+y1; ysave1 = 900 - ysave1; y = 900 - y;g.DrawLine(Pens.Black, xsave1,)ysave1, x,)y);運行程序,查看效果。三、Z 緩沖區算法1、原理說明本算法的前提是已經將投影進行了規范化處理,也就是本算法的投影垂直于投影平面的正平行投影,投影方向與 Z 軸方向相反,投影平面為Z=0。Z 緩沖區算法是系統開辟一片空間圖形顯示窗口區域每一個像素點所對應的高程值。一個空間多邊形任意內點的投影能否在顯示窗口得到繪
18、決于該空間三維內點的高程值是否大于對應的像素點高程值。如果條件成立,則繪制該內點的投影,并用該內點的高程值替換像素點的高程值;否則就不繪制。最終,顯示窗口中的每個像素都顯示的是高程值最高的圖形內點,也就是離視點最近的圖形內點,從而體現了正確的遮擋關系。空間多邊形的表達方式是頂點表示,即依次的多邊形頂點三坐標。根據任意三個不在同一直線上的三個點,可以計算出多邊形平面方程;根據多邊形的掃描轉換填充算法,可以計算投影多邊形的每一個內點的投影坐標(X,Y);由投影坐標和多邊形平面方程可以計算出投影點的對應高程;將該高程與 Z 緩沖區的高程值對比可以確定該投影點是否被繪制。設多邊形平面方程為:(7-2)
19、z=Ax+By+C根據三點確定一個平面的原理,在一個空間多邊形上,任取不在一條直線上的三個頂點(x1,y1,z1)、(x2,y2,z2)、(x3,y3,z3),可以計算出平面方程系數如下:(1 3)(1 2) (1 2)(1 3)(7 3)A =(1 2(1 3) (1 3)(1 2)(1 2)(1 3) (1 3)(1 2) B = (1 2(1 3) (1 3)(1 2)(7 4)(7 5)C = z1 Ax1 By1當(x1,y1,z1)、(x2,y2,z2)、(x3,y3,z3)不在一條直線上時,分母(y1 y2)(x1 x3) (y1 y3)(x1 x2) 0這也是選擇三個空間頂點必
20、須滿足的條件。2、操作說明新建了結構My3DPolygon 用于多邊形信息,包括:空間多邊形填充顏色,3空間多邊形頂點數量和頂點坐標值。基于該結構,建立一個結構數組,用于所有空間多邊形。為了簡化編程,在程序中直接給出了 6 個空間多邊形的相關信息。算法的實現思路是:點擊菜單項;系統程序直接調入空間多邊形參數;系統建立和初始化 Z 緩沖區;系統運用本算法依次對每一個空間多邊形進行投影、顯示。3、編程說明.打開工程項目,選擇菜單項“消隱”,添加“Z 緩沖區算法”子項,將其屬性項(Name)的屬性值改為英文字符“ZBuffer”,雙擊菜單項建立菜單響應函數,在系統建立的空的響應函數中加入語句如下:p
21、rivate void ZBuffer_Click(objecID = 53;der, EventArgs e)Rolygon();ZBufferDraw();在 Form 類中建立新結構My3DPolygon 用于多邊形信息,并定義結構數組3如下所示:public struct EdgeInfoymax, ymin; float k,xmin;publicpublicYMax getreturn ymax; set ymax = value; YMin getreturn ymin; set ymin = value; public float XMin get return xmin; s
22、et xmin = value; public float K get return k; set k = value; public EdgeInfo(x1,y1,x2,y2)/(x1,y1):下端點;(x2,y2):上端點ymax = y2; ymin = y1; xmin = (float)x1; k = (float)(x1 - x2) / (float)(y1- y2); /p = -1;public struct My3DPolygonpublic Color pcolor;publicpublic Pnumber;3D Ps;My3DPolygon PGroup = new My
23、3DPolygon6;Po group=new Po100;/創建一個能放100個點的點數組Reolygon 函數的功能是從數據庫中讀入相關的空間多邊形。由于本實驗中,空間多邊形為自定義,因此,Reolygon 函數實際是定義 6 個空間多邊形,并將數據存入結構數組中。其實現方法如下:private void Rolygon()PGroup0.pcolor = Color.Red;PGroup0.number = 4;PGroup0.P PGroup0.P PGroup0.P PGroup0.PPGroup0.Ps = new P3D4;3D(150,3D(340,3D(380,3D(160,
24、s0 =s1 =s2 =s3 =new new newnewP P PP130,150,410,380,310);540);1100);820);PGroup1.pcolor = CoPGroup1.number = 5reen;PGroup1.P PGroup1.P PGroup1.P PGroup1.P PGroup1.PPGroup1.Ps = new P3D5;3D(160,3D(410,3D(520,3D(350,3D(170,s0 =s1 =s2 =s3 =s4 =new new new newnewP P P PP120,110,550,430,220,440);930);157
25、0);1130);560);PGroup2.pcolor = Color.Blue;PGroup2.number = 6;PGroup2.P PGroup2.P PGroup2.P PGroup2.PPGroup2.Ps = new P s0 = new P s1 = new P s2 = new Ps3 = new P3D6;3D(600,3D(770,3D(960,3D(830,600,500,420,300,1300);1370);1480);1230);PGroup2.PPGroup2.Ps4 = new Ps5 = new P3D(720,3D(650,230,210,1050);9
26、60);PGroup3.pcolor = Color.Yellow;PGroup3.number = 6;PGroup3.P PGroup3.P PGroup3.P PGroup3.P PGroup3.P PGroup3.PPGroup3.Ps = new P s0 = new P s1 = new P s2 = new P s3 = new P s4 = new Ps5 = new P3D6;3D(220,3D(350,3D(590,3D(300,3D(180,3D(150,200,340,660,600,320,220,710);1055);1815);1550);930);715);PG
27、roup4.pcolor = Color.SkyBlue;PGroup4.number = 6;PGroup4.P PGroup4.P PGroup4.P PGroup4.P PGroup4.P PGroup4.PPGroup4.Ps = new P s0 = new P s1 = new P s2 = new P s3 = new P s4 = new Ps5 = new P3D6;3D(600,3D(300,3D(200,3D(190,3D(380,3D(540,680,670,520,430,220,300,2260);1840);1440);1250);1020);1340);PGro
28、up5.pcolor = Color.Brown;PGroup5.number = 6;PGroup5.P PGroup5.P PGroup5.P PGroup5.P PGroup5.P PGroup5.PPGroup5.Ps = new P s0 = new P s1 = new P s2 = new P s3 = new P s4 = new Ps5 = new P3D6;3D(400,3D(680,3D(690,3D(500,3D(200,3D(400,670,610,340,210,180,320,1470);1690);1430);1110);780);1120);ZBufferDr
29、aw 函數是實現算法的主要函數。其功能是先建立一個Z 緩沖區,然后從結構數組中依次讀出每一個空間多邊形,在與 Z 緩沖區進行比較的基礎上,依次畫出每一個空間多邊形的投影結果。其實現程序如下:private void ZBufferDraw()double, Z=new double1000,800;fori = 0; i 1000; i+)/初始化Z緩沖區 j = 0; j 800; j+)Zi, j = 0.0;i = 0; i 6; i+)forforZBufolygon(PGroupi, Z);/畫一個投影多邊形ZBuffolygon 函數的功能是在與Z 緩沖區進行比較的基礎上,畫出一個
30、空間多邊形的投影結果。該函數的主要功能是畫一個填充多邊形,但在繪制每一個內點時需要與 Z 緩沖區中的對應單元的高程值進行比較,只有大于 Z 緩沖區高程值的內點才被畫出。因此可以將多邊形掃描轉換填充函數拷貝過來,做必要修改。該函數的實現程序如下所示:private void ZBuffolygon(My3DPolygon PG, double, Z)if (!GetPolygen(PG)return;Po g1 = new Po100;/用于存放投影后的二維多邊形EdgeInfo edgelist = new EdgeInfo100;j = 0, yu =0, yd = 1024;/活化邊的掃描
31、范圍,從yd到yui PG.number; i+)for (i = 0;g1i.X = (g1i.Y = ()(PG.Po)(PG.Posi.X+0.5);si.Y+0.5);g1PG.number.X g1PG.number.Y= (= ()(PG.Pos0.X+0.5);/將第一點)(PG.Pos0.Y + 0.5);為數組最后一點for (i = 0;i yu) yu = g1i.Y;/活化邊的掃描范圍從yd到yu g1i + 1.Y)edgelistj+ = new EdgeInfo(g1i + 1.X, g1i + 1.Y, g1i.X,g1i.Y);elseedgelistj+ =
32、 new EdgeInfo(g1i.X, g1i.Y, g1i + 1.X, g1i+ 1.Y);Graphics g = CreateGraphics();/創建圖形設備 for (y = yd; y yu; y+)var sorted =from item in edgelist/選出與當前掃描線相交的邊結構排序where y = item.YMin orderby item.XMin, item.Kselect item; flag = 0;foreach (var item in sorted)/兩兩配對,畫線if (flag = 0)X = ()(item.XMin + 0.5); flag+;elsePen p = new Pen(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全文化課件公司介紹
- 電梯合同協議書注意事項
- 老年創業活動策劃方案模板
- 考研網絡平臺創業計劃書
- 2025年智能家居能源管理系統的節能效果與優化策略報告
- 拆除改裝合同協議書模板
- 獸醫診療實訓報告
- 4.3探索三角形全等的條件課件 -2024-2025學年北師大版數學七年級下冊
- 7《納米技術就在我們身邊》課件-2024-2025學年四年級下冊語文統編版
- 拓展培訓機構哪家好002
- 潛水主題素材課件
- 三供一業移交政策規定
- 小班活動學情分析
- 風電施工安全生產事故案例匯編(第一期)
- 固定資產使用與維護制度
- 黑龍江三支一扶考試筆試真題2023
- (正式版)JBT 14694-2024 電氣絕緣用合成有機酯與結構材料的相容性試驗方法
- MOOC 工程制圖-重慶大學 中國大學慕課答案
- 銀川市安置房買賣合同合集3篇
- 男西褲結構制圖課件
- 道觀行業分析
評論
0/150
提交評論