利用OpenGL實現(xiàn)內(nèi)插算法可視化

2010-08-28 10:49:52來源:西部e網(wǎng)作者:

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

  \
  圖1 測試地形等高線圖

  內(nèi)插算法的可視化的實現(xiàn)

  1、讀取文件中離散點數(shù)據(jù)

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

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

  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

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

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

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

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文件中前十一個數(shù)據(jù)

  同時在主程序中,還需要調(diào)用如下兩個讀取int型和double型的函數(shù):

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));
}


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

    2、利用OpenGL實現(xiàn)算法的可視化

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

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

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

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

  程序代碼如下:

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的點視圖轉(zhuǎn)化為三角形格網(wǎng)試圖(如圖3)。

  \
  (a)加權(quán)平均內(nèi)插數(shù)學模型

  \
  (b)多面函數(shù)內(nèi)插數(shù)學模型

  \
  (c)最小二乘內(nèi)插數(shù)學模型

  圖3 利用搜索圓實現(xiàn)地形的三角形格網(wǎng)視圖

  結(jié)論

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

關鍵詞:OpenGL

贊助商鏈接: