摘 要: 基于OpenGL結合MFC設計了顯示大量數據的顯示系統。顯示系統使用顏色等深圖顯示數據的變化情況,設計中系統地解決了3個問題:首先提出了將數據依據數值大小映射到顏色的顏色映射方案;其次提出了在MFC架構下使用OpenGL進行繪圖的框架,框架使用面向對象的方法解決了OpenGL與MFC銜接;最后在鏡片面型顯示中應用相關的設計結果,基于框架及顏色映射方案設計程序將鏡片面型用顏色等深圖的方法顯示出來。實驗結果證明,設計的數據顯示系統可以方便地顯示大規模的數據,在數據顯示可視化中有著廣泛的應用。
關鍵詞: 數據顯示; OpenGL; 顏色映射; MFC
中圖分類號: TN919?34; TP368.1 文獻標識碼: A 文章編號: 1004?373X(2013)14?0108?04
Design and realization of data display system based on OpenGL
XU Li?song, GUO Jia?liang
(State Key Laboratory of Applied Optics, Changchun Institute of Optics, Fine Mechanics and Physics, CAS, Changchun 130033, China)
Abstract: The system to display large scale data was designed based on MFC and OpenGL. The system uses different colours to display the variation of data. Three problems were solved systematically in the design. The color mapping method is proposed, which maps the data to different colors according to data’s value. A drawing framework using object?oriented approach to settle down the connection between OpenGL and MFC is put forward. The relevant design results are applied to the lens’ surface figure display to display the lens’ surface shape by color depth map based on the framework and the color mapping method. The experiment results prove that the display system designed can display large scale data conveniently, and can be widely used in data visualization.
Keywords: data display; OpenGL; color mapping; MFC
0 引 言
在眾多的信息顯示方法中,使用圖形圖像顯示信息的方法直觀簡潔[1];隨著計算機技術的發展,計算機圖形圖像顯示在科學研究及工程技術上有著越來越廣泛的應用。OpenGL由美國高級圖形和高性能計算機系統公司SGI所開發,在不斷的發展中成為計算機硬件顯示系統的標準軟件接口,其優良的跨平臺特性使其在圖形圖像顯示中有廣泛的應用[2?3]。本文在Windows平臺下使用OpenGL,應用MFC架構,設計實現了顯示大量連續數據的顯示系統,系統設計過程中使用面向對象的方法解決了MFC框架中使用OpenGL的問題;數據的顯示方法上通過非線性的顏色映射方案使用顏色等深圖來表示數據的變化。最后在鏡片面型顯示系統中應用設計的軟件,證明了整個顯示系統軟件架構層次清晰,條理鮮明,具備優良的顯示效果及時間效率,可以方便地應用于數據可視化場合。
1 數據顯示方法設計
1.1 數據顯示方法分析
工程應用中常常會獲得大規模的某個平面數據,這些數據往往通過二維數組的形式來組織,較為常見的例子如地表的高低、起伏及某一個平面的溫度場等等,直觀的顯示這樣的數據以使用顏色等深圖最為便捷直觀[4],顏色圖的方法是將每個輸入數據點通過顏色映射轉換為一個顯示的像素點,這些像素點集合到一起就呈現出整個平面相關物理量的起伏變化,整個顯示過程可以用式(1)描述。
(1)
式中:和是數據點的位置,其對應于輸入數據的行數和列數;是平面點的某物理量的測量值;、和是由測量值到顏色的映射函數。人類視覺感受到的顏色變化不是線性變化的,因此符合人類視覺的顏色映射函數的確定是整個顯示系統設計的一個關鍵部分。
設計中通過反復的仿真實驗并結合RGB顏色模型的分析,設計了如圖1中曲線所示的顏色映射函數,使用該顏色映射函數時,首先將輸入數據進行歸一化處理,然后通過映射函數決定其顏色的RGB的值。
圖1 顏色映射函數設計曲線
上述的顏色映射方法巧妙而方便地實現了顏色的漸進變化,其映射方法簡單計算量小,編程實現容易而且有很好的運行效率。使用上述的顏色映射方案,當輸入數據在0~1之間連續變化時,可以得到較好的顏色變化效果,其效果圖在軟件的運行效果圖中會有體現。
1.2 顯示窗口規劃
基于數據的輸入形式和顯示方法的分析,整個顯示界面的規劃如圖2所示。顯示系統以MFC窗口的中心點作為OpenGL的原點,該點也是面型顯示區域的中心點,以窗口水平向右方向作為x軸正方向,以窗口的豎直向上的方向作為y軸正方向;數據顯示區域內使用顏色等深圖直觀的顯示數據的起伏變化,顏色等深圖使用相同顏色表示數據的等值面;同時在數據顯示區域的右側設計了數據顯示的顏色圖例,它是一個顏色漸變條,通過它直觀的顯示出了數據大小與顏色變化的關系。
2 數據顯示軟件的設計及實現
2.1 顯示軟件的框架設計
MFC框架下使用OpenGL進行數據顯示首先要解決MFC框架下的窗口與OpenGL繪圖的相互銜接問題;OpenGL下使用渲染環境完成這一操作,OpenGL渲染環境接收OpenGL相關的繪制操作,并最終將渲染的結果輸出到MFC框架下的窗口中[5]。文獻[5]中介紹了OpenGL渲染環境的更多細節及操作方法。整個系統輸入的數據是一個二維數組,這些數據不能被OpenGL繪圖系統直接使用,這些就需要一個轉換和提取環節,在轉換和提取環節中獲得OpenGL繪圖所需要的全部信息,OpenGL使用這些信息最終將數據以圖形的方式顯示在窗口中。
圖2 顯示系統的規劃
綜合上述,設計了如圖3所示的顯示系統框架,整個系統有3個相互獨立的過程:首先是繪圖環境模塊,它完成繪圖環境相關的操作,這些操作需要在MFC的消息響應函數中調用;其次是輸入數據整理及變換模塊,它提取相關的繪圖信息,為OpenGL的圖形繪制準備了數據;最后是圖形的繪制部分,它使用相關的OpenGL渲染命令將上述2個模塊中準備的數據在窗口中繪制出來。這樣的設計模式充分體現了軟件模塊化的思想,使得整個顯示系統在設計及測試上相互獨立,而在功能上又緊密的聯系在一起。
圖3 顯示系統的軟件框架
2.2 顯示系統的軟件實現
使用面向對象的抽象方法[6],將整個OpenGL相關的操作過程抽象成一個命名為D2Plot的C++類,這樣使得設計的可讀性好并且方便其工程應用,其類的定義如下所示:
class D2Plot{
//類的數據定義
…
//繪圖環境控制接口
//初始化函數,將繪圖環境與窗口綁定
int Initial(HWND hwnd);
//OpenGL繪圖場景控制函數
void setOpenglWin(float w,float h);
void setOpenglScale(float scale=1.0);
void setOpenglMove(float x,float y);
void setOpenglRotateX(float angle=5.0);
void setOpenglRotateY(float angle=5.0);
//消息響應函數
void D2PlotOnSize(int cx,int cy);
bool D2PlotOnEraseBkgnd();
//數據輸入及整理模塊接口
void PrepareData();
//圖形繪制接口
//圖形繪制的外部接口,在WM_PAINT消息響應函數中調用
void Plot();
void UpdataWindow();
//數據繪制函數,在Plot函數內部調用
void pointPlot();
//顏色映射函數,在Plot函數內部調用
void pointColour(float depth,float max,float min);
//顏色條繪制函數,在Plot函數內部調用
void colourBarPlot();
}
這樣的架構下繪圖的實現便捷而高效,其繪圖操作被分別的封裝于相互獨立的繪圖函數中,其最終的外部接口為void Plot(),函數的流程圖如圖4所示。繪圖的流程比較簡單,圖形繪制的整個過程依賴于數據處理函數PrepareData()對數據的預備及整理。
圖4 Plot函數的流程
整體軟件架構方面使用了MFC的文檔———視圖架構[7],這種架構中文檔用以存儲原始數據,而視圖用來實現數據的顯示,數據顯示中使用其中的一個視類窗口作為數據顏色圖顯示的窗口,D2Plot對象作為這個視類的一個重要屬性,處理相關的顯示操作,整個MFC軟件架構如圖5所示。
圖5 基于MFC文檔視圖類的軟件架構
3 軟件在鏡片面型顯示方面的應用
將實驗獲得的鏡片面型數據輸入到整個顯示系統中,得到數據顯示系統的顯示效果如如圖6所示,可以看到數據顯示系統顯示出了鏡片面型的起伏變化。
圖6 程序運行的效果圖
繪圖軟件能實現預定的顯示效果僅是設計的一個方面,它同時還需要有出色的時間性能。運行效果圖中使用的采集數據的是992×992的矩陣,這樣規模的輸入數據必然要考慮圖形繪制部分所使用的時間。窗口繪制時間的計算使用了Windows的API函數[8]::GetTickCount(),其測試的具體代碼實現如下所示:
void CTestView::OnPaint()
{
DWORD start=::GetTickCount();
plottest.Plot();
plottest.UpdataWindow();
DWORD last=::GetTickCount();
//記錄輸出的結果
…
CView::OnPaint();
}
使用上述方法,在測試計算機上得到窗口重繪的時間如表1所示。測試的計算機主要配置為:CPU E7500(2.93 G),內存4 GB,NVIDIA顯卡(512 MB緩存)。其窗口重繪的時間為39 ms滿足顯示的要求。
使用上述的測試方法在另一臺測試計算機上的測試結果如表2所示。測試計算機的主要配置為:CPU AMD雙核3600+,內存1GB,ATI Radeon X1200顯卡(512 MB緩存)。
表1 窗口重繪的時間統計
表2 窗口重繪的時間統計
分析兩組測試數據可以看到:數據顯示系統在鏡片面型顯示方面具備了出色的顯示效果及時間性能,可以在鏡片面型顯示中廣泛的應用。
4 軟件性能提高及改進方法
程序運行的時間往往與程序使用數據的規模成正比,可以預見如果減少數據的規模則可以顯著的提高程序的時間性能[9]。測試時使用的鏡片面型數據規模是992×992,在OpenGL的繪圖場景中這些數據點較為密集,相互臨近的點會有一定的重疊,因此完全可以減少使用繪圖數據點而使得程序有更好的時間性能。修改程序,將輸入的數據在x方向和y方向同時按照間隔取點,即使用的鏡片面型的數據規模是496×496,保持繪制圖形的方法不變,得到的繪制圖形效果如圖7所示。
使用前述的測試方法,在處理器為 E7500(2.93G),內存為4 GB,顯卡為NVIDIA(512 MB緩存)測試計算機上多次測試,獲取窗口重繪的時間如表3所示。通過效果圖及測試時間比較,可以得到結論如下:適當減小使用的數據規模時,可以提供軟件系統的時間性能,而軟件的顯示效果基本不變。
5 結 論
設計了基于MFC和OpenGL的顏色等深圖顯示系統,并在面型顯示系統中使用它完成面型顯示操作。設計中較為系統的討論了如下問題:首先是顏色等深圖渲染方法及顏色映射函數的提出,它解決了如何將數據轉變為像素的問題;其次是在MFC架構下使用OpenGL的問題,設計了D2Plot類,它解決了在MFC 架構下使用OpenGL的全部問題,這些問題包括架構的銜接、渲染數據的輸入及圖形的渲染。最后使用提出的設計方法應用于鏡片面型顯示系統,取得了較好的效果。
圖7 減少輸入數據規模的效果圖
表3 減少數據規模后的時間效果
參考文獻
[1] 周長發.精通Visual C++圖像編程[M].北京:電子工業出版社,1999.
[2] 李軍.OpenGL編程指南[M].北京:機械工業出版社,2009.
[3] 何克智.OpenGL編程技術詳解[M].北京:化學工業出版社,2010.
[4] HOPETAL H, DEROSE T, DUCHAMP T, et al. Surface reconstruction from unorganized point [J]. Computer Graphics, 1992, 26(2): 71?78.
[5] 張琪.OpenGL超級寶典[M].北京:人民郵電出版社,2010.
[6] 劉宗田.C++編程思想[M].北京:機械工業出版社,2011.
[7] 侯俊杰.深入淺出MFC[M].2版.武漢:華中科技大學出版社,1998.
[8] 馬均飛.軟件測試設計[M].北京:電子工業出版社,2011.
[9] 張懷勇.數據結構與算法分析C++描述[M].3版.北京:人民郵電出版社,2006.