付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
可视化技术在计算机模拟中的应用
1适用于实时模拟的深度方面计算机模拟是计算机价值测试,是人们理解和研究自然环境的新手段。可视化技术能在计算模拟时为分析问题提供可观察的清晰逼真图像。尤其是在模拟一些3D空间中发生的物理化学等变化时,需要从不同视角观察系统的演化过程,以便及时正确分析产生各种现象的原因及其相互联系;因此,在计算模拟中融入可视化技术常常具有非常重要的意义。OpenGL是一种具有完全可移植性和质量高性能好的3D图形和建模库,被广泛用于实时3D图形显示或构图等领域。但是,OpenGL是一组用C语言编写的API函数,用C语言直接调用其中的函数,就会象其它面向过程的程序一样,其代码的重用性和模块间的独立性较差等缺点。如果程序功能有微小变化,常常不得不重新编写许多代码,不仅增加了工作量,也增加了错误出现的机会。用C++的面向对象编程和范型编程方法对OpenGL的函数进行封装,可以大大地减少这种重复工作,而且程序的结构更加清晰,可读性更好。本文以计算模拟中用到的一个实时3D显示问题为例,讨论范型编程对OpenGL函数进行封装的实现方法和步骤。2数的调用功能设有一个类CSimulator,它除了完成计算模拟涉及的各种运算任务外,还有一个实现绘图功能成员函数Draw(),比如显示模拟的反应器内流场分布。该函数可以在OpenGL的渲染回调函数中被调用。一般可以在主函数的程序中这样实现:由于有程序清单2中的CGraph类帮助管理绘图有关的数据和几乎所有回调函数的实际代码,程序清单3中回调函数只是用CGraph类对象aGraph的相应函数,因此比清单1中的要简洁得多,其代价是每个回调函数多了一层函数调用,而在一般情况下是微不足道的。而且CGraph类具有相对的完整性和封闭性,移植到其它程序中只需做很少的改动就可以再次利用,因此,这一版的代码质量要比前一版好。3类dra类但是新版的程序有两点缺陷:首先,在CGraph类中用到了类CSimulator,也即CGraph严重依赖于CSimulator类,如果要为新的模拟类服务时,必须修改CGraph类中的#include语句和CGraph::RenderScene()函数的声明和定义。虽然在这里这种改变只有几行代码的工作量,但这让使用这个类的用户每次修改都要记住这份重复工作是不可取的。这也破坏了类的封装性,也即这个类没有实现完全封装。其次,在清单3中,回调函数和OpenGL的glut函数虽然现在看来是不多,但要加上一些其它功能的glut函数及相应的回调函数,还是会有很大一堆,尽管可以用拷贝粘贴来减小写代码的工作量,但看起来还是太杂乱,不清晰简洁,使用起来很不方便,有理由要求程序能变得更好。第一个问题的解决办法是将类改成类模板,这样,CGraph就不仅仅是针对具体某一个类了,而是针对许多类,即实现了范化,或者称为一般化,只要这个类有一个名字为Draw()的共有成员函数实现其渲染。第二个问题的解决办法是利用宏,将回调函数的定义和glut函数的调用都移到CGraph模板所在的Graph.h头文件中。在这一版从程序中,加入了初始化OpenGL设置函数和缩放、移动和旋转功能。这里也还是作为一个示例,在实际中可能更复杂,但范化的方法是一样的。以上清单4中回调函数定义宏GRAPH_DEFINE有3个参数:Simulator_T是一个计算模拟的类,该类必须有一个实现渲染的Draw()成员函数,就像清单1中的CSimulator类。aSimulator是Simulator_T类的实例化对象,和程序清单1中的aSimulator对应,它在渲染回调函数中作为输入参数传给模板类对象的RenderScene函数。IdleFunction是一个用户定义的函数指针,该函数没有输入参数,其返回值为bool型,在回调函数IdleFunc中被调用,并根据其返回值决定是否要刷新窗口。OpenGL初始化宏GRAPH_INITIALIZE有5个参数,正如其名字表示的意义,分别是窗口左上角的x,y坐标、窗口的宽和高及窗口的名字。相对于前两版,范型版增加了响应鼠标和键盘操作的glut函数及其回调函数(分别是旋转、平移和缩放)和自定义的初始化函数GLSetupRC()。这样,就完全封装好了3D图像实时显示的功能。现在的主函数程序(也是用户要做的工作)就可以变得很清晰简洁,使用CGraph时,可以不对Graph.h头文件的内容作任何修改,就能实现图像的移动、缩放和旋转等实时操作功能(当然如要添加和更新功能,自然可以修改此文件的内容)。如果给宏GRAPH_DECLARE传入了一个名为IdleFunction的函数,程序还可以在没有响应其它命令的时候反复调用该函数,实现一种循环操作,模拟系统的演化过程(如不需要定义此函数,可以false作输入参数)。下面是一个应用范型版本类模板CGraph的主函数程序清单:程序中与3D图像实时显示有关的代码只有4处:其中1,3,4都只有一句代码,2是模拟中要实现的循环操作,它在内部调用了模拟类CSimulator的一些函数(这里是由CSimulator::SingleStep(iStep)函数封装了CSimulator的一系列内部操作)。可以看出,在这一版里,Graph.h文件中的代码不依赖于其它程序,具有很好的独立性。唯一的要求是新的循环函数(例中的Loop)和模拟类中执行渲染的成员函数(例中的Draw)遵守一定的接口要求,这些都是很容易做到的。图1是一个运用上面的方法实现了可视化功能的受迫振动粒子系统的3D显示图片,在该实例中,实现了对3D图形的实时显示和平移、旋转、缩放等功能。4glutlnitdisp内部设置功能本文讨论了运用C++提供的范型编程思想在计算模拟中实现实时3D显示的程序设计过程,并对OpenGL的有关可视化函数成功实现了封装。设计结果表明,范型编程方法使CGraph具有更广泛的适用性和可重用性,而不是强烈的依赖于某一个具体类。实际上,上面编写的CGraph类模板可以被用在很广的计算模拟和其它领域中,而且用户还可以根据需要在Graph.h文件中扩展CGraph的功能,因此,还具有很好的可扩展性。main函数中的glutlnitDisplayMode设置显示模式为双缓冲区,并使用RGB颜色模式,指定一个32位深度缓冲区;glutlnitWindowPosition,glutlnitWindowSize,glutCreateWindow分别定义窗口的初始位置,宽度和高度及窗口的名称;glutReshapeFunc在窗口大小改变时调用回调函数ChangeSize重新设置坐标系。glutDisplayFunc调用渲染函数RenderScene实现渲染功能。这是一个简单的OpenGL程序,实际应用中一般还会调用更多的glut函数,相应的要定义更多的回调函数。并且为了实现函数之间的数据传递,还需额外定义一些公共变量。这样,程序将变得更庞大,更复杂。可以想象,这样的程序代码其可重用性是很差的(为了清晰起见,本文在此没有列出这部分代码,只在最后的范型实现版本中作为示例加入一些新的功能)。一个改进的方法是用一个类(CGraph)将与绘图有关的变
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 喷涂使用说明书
- 2026治安巡防面试题目及答案
- 2026创业社团面试题及答案
- 2026法律顾问面试题目及答案
- 2026关于诚信面试题模板及答案
- 2026年怎么编试题及答案高中
- 骨科理论试题及答案
- 革兰氏染色试题及答案
- 近期法规条例解读是
- 儿科用药护理课件
- TD-T 1048-2016耕作层土壤剥离利用技术规范
- 2023年湖北省襄阳市生物中考真题(解析版)
- DL-T1362-2014输变电工程项目质量管理规程
- 同济大学课件钢结构设计原理
- 食品行业的食品安全风险评估案例分析
- 沥青路面修补恢复施工方案
- 巡察组作风纪律情况评估表
- 《电能计量装置》课件
- 河北专接本化工原理汇编
- GB.T19418-2003钢的弧焊接头 缺陷质量分级指南
- GB/T 41317-2022燃气用具连接用不锈钢波纹软管
评论
0/150
提交评论