成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

利用OpenGL實現內插算法可視化

2010-08-28 10:49:52來源:西部e網作者:

    為了便于對算法實現進行測試和效果分析,我們依據圖1進行離散點采樣。在圖1中,地形面積為 ,其等高線分布如圖所示,A點和B點為兩座山的頂峰,其中A點高程值為3.6,B點高程值為2.3。我們將采樣得到的離散點按照一定的規則存放在*.dem的文件中,通過讀取文件中的數據來獲取離散點的高程值。我們通過采樣10或20個點生成 的DEM格網模型。

  \
  圖1 測試地形等高線圖

  內插算法的可視化的實現

  1、讀取文件中離散點數據

  離散點數據包括平面位置和高程兩種信息,可以直接在野外通過全站儀或者GPS、激光測距儀等進行測量,也可以間接地從航空影像或者遙感圖象以及既有地形圖上得到。具體采用何種數據源和相應的測量技術,一方面取決于這些源數據的可獲得性,另一方面也取決于DEM的分辨率、精度要求、數據量大小和技術要求等。

  對于離散點的數據,往往是很大的,我們只有按照一定數據結構存儲在*.dem文件中,才能便于管理和修改。在程序中通過讀取文件,可以得到任意一個文件中的地形信息。為了測試的需要,依據圖1中的等高線我們可以采集到一些特征點的三維信息。例如,我們采集10個點的信息,將其存入文件中,其結構如下所示:

  10 0.0 0.0 0.0 10.0 10.0 10.0 10.0 0.0 0.0 3.6 3.0 7.1 3.6 7.1 3.0 2.3 5.5 5.5 1.4 5.7 8.0 1.0 8.0 8.0 0.5 9.0 2.0 1.3 6.0 1.2 1.0 5.0 4.0 1.0 1.0 7.2 2.0 2.0 2.0 0.3

  在實例中每個數據按照5個字符來存儲。第一個數據為采樣離散點的總數,第二到第九個數據分別為所選地形左下、左上、右上、右下點的平面X和Y的坐標,第十和第十一個數據為地形的最小高程值和最大高程值,余下的數據每三個為采樣離散點的三維坐標X、Y和Z,共有十個。

  在LoadFileData類中,需要先定義如下:

public int DataNum; //離散點的總數
public double[,] DataPoint=new double [50,3]; //離散數據點的三維坐標
int readDemPosition; // 讀取位置
string DemFileContent; //DEM文件內容

public struct Point
{
 public double x;
 public double y;
}

public struct DEMStruct
{
 public Point LeftBottom;
 public Point LeftTop;
 public Point RightTop;
 public Point RightBottom;
 public double MinElevation;
 public double MaxElevation;
}

public DEMStruct DemDataStruct;//存儲*.dem文件中前十一個數據

  同時在主程序中,還需要調用如下兩個讀取int型和double型的函數:

private int readInt()
{
 string tmps ;
 tmps = DemFileContent.Substring(readDemPosition,5);
 readDemPosition += 5;
 return ( Convert.ToInt32(tmps));
}

private double readDouble()
{
 string tmps;
 tmps = DemFileContent.Substring(readDemPosition,5);
 readDemPosition += 5;
 return (Convert.ToDouble(tmps));
}


  通過讀取文件中的數據,我們可以很容易的得到地圖的四邊、地圖中心點坐標和最大與最小高層差,以便在繪制地形時確定屏幕的顯示位置和鼠標控制的縮放和移動比例。

    2、利用OpenGL實現算法的可視化

  Open GL是Open Graphics Library 的縮寫,它是SGI公司開發的一套高性能圖形處理系統,是圖形硬件的軟件接口,意為開放的圖形庫。通過OpenGL程序員可以創建交互式的應用程序,實現具有逼真效果的三維圖形圖像。由于其開放性和高度的可重用性,目前已成為業界標準。 OpenGL被設計成獨立于硬件,獨立于窗口系統的,在運行各種操作系統的各種計算機上都可用,并能在網絡環境下以客戶/服務器模式工作,是專業圖形處理、科學計算等高端應用領域的標準圖形庫。

  為了便于我們后期的LOD地形簡化,我們一般要將地形繪制成三角格網的形式。在繪制三角形時,由于地形不可能都是規則的長方形或正方形,考慮到一般地形的多樣性和復雜性,不能夠將點簡單的連線。根據三角形的四種形式,每個構成三角形的點都先按照四邊形的方式進行劃分成四個點(如圖2)。

  \
  圖2 三角形四種情況下點的的劃分

  在圖中,三角形中必有一個點被兩個編號所代表,然后按照1-2-4-1-3-4的順序進行連接,必然能繪制出四種情況中的任何一種三角形。通過上述操作,可以實現程序能運用到所有地形的顯示。

  程序代碼如下:

private void DrawTriangle
 (Point3D Point1, Point3D Point2, Point3D Point3, Point3D Point4 )
{
 GL.glBegin(GL.GL_TRIANGLES);//開始繪三角形
 GL.glVertex3d(Point1.x, Point1.y, Point1.z);//從1起筆
 GL.glVertex3d(Point2.x, Point2.y, Point2.z);//畫到2
 GL.glVertex3d(Point4.x, Point4.y, Point4.z); //畫到4
 GL.glVertex3d(Point1.x, Point1.y, Point1.z); //畫到1
 GL.glVertex3d(Point3.x, Point3.y, Point3.z); //畫到3
 GL.glVertex3d(Point4.x, Point4.y, Point4.z); //畫到4
 GL.glEnd();//完成一個三角形的繪制
}

  通過上述操作,可以將圖2的點視圖轉化為三角形格網試圖(如圖3)。

  \
  (a)加權平均內插數學模型

  \
  (b)多面函數內插數學模型

  \
  (c)最小二乘內插數學模型

  圖3 利用搜索圓實現地形的三角形格網視圖

  結論

  在現實中,我們需要生成的地形往往是很龐大,很復雜的,因此不能夠僅利用某一種算法和某一種搜索方式生成全部的地形。對于大范圍的復雜地形,就必須先對地形按起伏程度進行區域分塊,對不同的區域選擇合適的算法和搜索方式。

關鍵詞:OpenGL

贊助商鏈接:

主站蜘蛛池模板: 厦门市| 左云县| 新蔡县| 北川| 海城市| 合川市| 莫力| 吉木萨尔县| 云和县| 张家川| 江安县| 罗源县| 密云县| 武平县| 民乐县| 武汉市| 锦屏县| 澳门| 洞头县| 高青县| 宁津县| 定兴县| 抚远县| 石门县| 桐庐县| 阜城县| 吴桥县| 金平| 贵德县| 林芝县| 广昌县| 古田县| 庆阳市| 富阳市| 通城县| 中江县| 民乐县| 千阳县| 静乐县| 嘉义县| 武乡县|