基于OpenGL的数据显示系统的设计与实现

时间:2022-10-21 09:05:44

基于OpenGL的数据显示系统的设计与实现

摘 要: 基于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.

上一篇:每20秒就有一个女人在挨打 下一篇:慢性支气管炎病人的护理体会