基于OpenGL的Hanoi塔问题动画模拟程序的设计与实现
- 格式:pdf
- 大小:186.39 KB
- 文档页数:2
基于c++语言的汉诺塔微课设计与实现
幺连福
【期刊名称】《装备制造技术》
【年(卷),期】2016(0)3
【摘要】本文对计算机专业基础课数据结构中的典型递归调用模型(汉诺塔问题)采用微课程模式授课的方案,编写了基于c++语言的汉诺塔微课程序。
【总页数】2页(P268-269)
【关键词】c++;堆栈;递归;微课
【作者】幺连福
【作者单位】吉林化工学院
【正文语种】中文
【中图分类】O141.3
【相关文献】
1.基于VC++语言的四针汉诺塔游戏的设计与算法研究 [J], 申惠芳
2.基于网络的汉诺塔游戏型课件的设计与实现 [J], 杨雪;张学刚
3.基于Flash的汉诺塔递归算法分析动画的设计与实现 [J], 丁爽
4.汉诺塔问题的算法设计及C++语言实现 [J], 俞哲明;樊艳芬
5.基于“汉诺塔”游戏的ABB工业机器人应用编程设计与实现 [J], 李愿
因版权原因,仅展示原文概要,查看原文内容请购买。
汉诺塔问题的算法分析及C语言演示程序的实现作者:白会波高瑞平来源:《电脑知识与技术》2010年第09期摘要:该文对经典的“汉诺塔”问题进行了详细的分析,并用C语言实现。
通过问题的具体实现,使学习者了解问题的全过程,推广到一般。
关键词:汉诺塔;递归;C语言中图分类号:TP301.6文献标识码:A文章编号:1009-3044(2010)09-2130-02Algorithm Analysis and C Realization of Hanio IssueBAI Hui-bo1,GAO Rui-ping2(1.Qinhuangdao Branch of Daqing Petroleum Institute, Qinhuangdao 066004, China;2.Hebei Normal University of Science and Technology, Qinhuangdao 06600, China)Abstract: This text carries on detailed analysis about classical Hanio issue and provides realization of algorithm in C.Through concrete realization of the problem,can make learners observe the whole course which solves this issue and Extend to the general.Key words: hanio; recursive; the C programming language1 问题描述汉诺塔是一个经典的数学问题,其具体描述如下:有三根相邻的塔子,标号为A,B,C,A塔子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子借助于A,B,C三个塔子一个一个移动到塔子C上,并且每次移动在同一根塔子上都不能出现大盘子在小盘子上方.根据问题描述得到以下规则:1)圆盘必须一个一个的移动;2)大的圆盘必须在小圆盘的下方或单一圆盘;3)满足规则2)的序列可以出现在A,B,C任意一根塔子上。
基于OpenGL的三维模型渲染与动画设计OpenGL是一种跨平台的图形库,广泛应用于计算机图形学、游戏开发等领域。
在三维模型渲染与动画设计中,OpenGL扮演着至关重要的角色。
本文将介绍基于OpenGL的三维模型渲染与动画设计的基本原理、技术实现以及实际案例分析。
一、三维模型渲染基础在三维图形学中,三维模型是由一系列的顶点、法线、纹理坐标等信息组成的。
渲染即是将这些信息转化为屏幕上的像素点,呈现出真实感的三维场景。
OpenGL通过图形管线来实现三维模型的渲染,包括顶点着色器、片元着色器等。
顶点着色器主要负责对顶点坐标进行变换和投影,将三维坐标转化为屏幕坐标;片元着色器则负责对每个像素进行着色,计算光照、纹理等效果。
通过编写这些着色器程序,可以实现各种复杂的渲染效果。
二、OpenGL的基本操作在使用OpenGL进行三维模型渲染时,首先需要初始化OpenGL环境,并创建一个窗口用于显示渲染结果。
然后通过OpenGL提供的API 接口,加载模型数据、纹理数据等,并编写着色器程序。
接下来,通过设置视口、投影矩阵等参数,将场景中的三维模型正确地投影到屏幕上。
同时,还可以通过设置光照、材质等属性,增强渲染效果。
最后,调用OpenGL的绘制函数,将场景渲染到屏幕上。
三、三维模型动画设计除了静态的三维模型渲染外,动画设计也是三维图形学中的重要内容。
在OpenGL中,可以通过对模型的变换、旋转、缩放等操作来实现动画效果。
通过逐帧更新模型的状态,并重新渲染场景,可以呈现出生动的动画效果。
在动画设计中,关键帧插值是一种常用的技术。
通过在不同关键帧上记录模型的状态,并使用插值算法来计算中间状态,可以实现平滑流畅的动画过渡效果。
同时,还可以结合骨骼动画、蒙皮等技术,实现更加复杂和逼真的动画效果。
四、实际案例分析下面我们以一个简单的实例来说明基于OpenGL的三维模型渲染与动画设计。
假设我们有一个立方体模型,并希望实现一个旋转动画效果。
基于OpenGL的虚拟物体仿真的方法及其实现
韦灵丽
【期刊名称】《现代计算机(专业版)》
【年(卷),期】2009(000)007
【摘要】对OpenGL的基本概念、变换原理、颜色、光照、材质、纹理贴图、动画机制等方面进行讨论.给出利用Borland公司的C++Builder6.0开发Windows 环境下的OpenGL程序的方法.以实现三维体旋转体为例,详述如何载入一个BMP 文件,使BMP文件做为一个OpenGL的纹理贴在物体的表面上,并使之具有真实的效果的步骤.
【总页数】3页(P174-176)
【作者】韦灵丽
【作者单位】肇庆工业贸易学校,肇庆,526060
【正文语种】中文
【中图分类】TP311.52
【相关文献】
1.基于VC和OpenGL的导航仿真系统三维物体建模的实现 [J], 吴昊;刘建业;赵伟;段方
2.基于MFC和OpenGL的虚拟人体经络穴位模型实现方法 [J], 许玉龙;张佩江;王忠义;盛梦园;赵玉梅;王兵营
3.基于OpenGL三维物体建模方法的研究与实现 [J], 赵启升
4.基于opengl的虚拟视景仿真系统研究与实现 [J], 刘瑞恒;张婷婷;李现涛
5.基于OpenGL三维物体建模方法的研究与实现 [J], 赵启升
因版权原因,仅展示原文概要,查看原文内容请购买。
福建电脑2006年第6期基于OpenGL的Hanoi塔问题动画模拟程序的设计与实现吴元斌(重庆三峡学院计算机科学系四川重庆404000)【摘要】:该文介绍了实现Hanoi塔问题动画模拟程序的OpenGL相关编程函数,给出了模拟程序所采用的主要数据结构和算法。
程序在VisualC++.NET下实现,较好地模拟了Hanoi塔问题的移动过程。
【关键词】:OpenGLHanoi塔问题双缓存动画VisualC++.NET1.引言Hanoi塔问题在程序设计与算法研究中被作为经典的递归算法实例[1,2,3,7]。
Hanoi塔问题的递归算法实现简单、易于理解,但其执行过程却比较费解。
笔者利用OpenGL图形编程技术的优势,编写基于OpenGL的Hanoi塔问题动画模拟程序,对Hanoi塔问题递归算法的执行过程进行了直观、形象的动画模拟,对于理解Hanoi塔问题,特别是其递归算法的执行过程很有必要。
动画模拟程序在VisualC++.NET下实现,本文介绍了实现该程序的OpenGL相关编程函数,分析了实现动画的主要数据结构和算法,并给出了程序运行时的动画场景图示。
2.相关OpenGL编程函数OpenGL是公认的工业标准,包含核心库、实用库、辅助库、工具库、Windows专用库等多个函数库,提供了丰富的图形编程函数[4,5]。
本文主要涉及建模、几何变换、双缓存动画函数。
2.1建模函数OpenGL提供了很多复杂三维物体(如:球、锥、多面体、茶壶及复杂曲线和曲面)绘制函数。
为了表示Hanoi塔中的“圆盘”、“塔柱”、“底座”,本文使用了辅助库中的3个函数:圆环函数、圆柱函数、长方体函数。
原型分别是:voidauxSolidCylinder(GLfloatradius,GLfloatheight)、voidauxSolidTorus(GLfloatinnerRadius,GLfloatouterRadius)、auxSolidBox(GLfloatwidth,GLfloatheight,GLfloatdepth)。
2.2颜色设置与几何变换本文所用颜色设置函数原型为:voidglColor3fv(GLfloatv[3])。
为了实现动画和表现移动过程,主要使用基本变换中的平移、旋转变换,平移和旋转函数的原型分别为:voidglRranslatefv(GLfloat,GLfloat,GLfloat)、glRotatef(GLfloat,GLfloat,GLfloat,GLfloat)。
2.3双缓存动画双缓存动画技术是一种边画边显示的实时动画技术。
它提供了两个基本缓冲区,在显示前台缓存内容中的一帧画面时,后台缓存正在绘制下一帧画面,当绘制完毕,则后台缓存内容在屏幕上显示出来,而前台绘制下一副画面内容。
相关函数的原型为:SetPixelFormat()、SwapBuffers(hdc)。
3.程序所采用的主要数据结构、算法3.1主要数据结构Hanoi塔中所涉及对象是“圆盘”、“塔柱”,各自有多种属性(如:半径、高度、颜色等)。
本文将它们抽象为两种结构:Peg、Disk。
为了表示圆盘在塔柱之间的移动情况,在结构Peg中用栈结构记录其中存放的各圆盘的编号。
具体定义为:structPeg{//塔柱结构GLfloatx0,y0;//底部的中心坐标GLfloatr;//半径GLfloathigh;//高度GLfloatcolor[3];//颜色GLfloattop;//可放圆盘的位置intdisksNo[10];//目前存放的各圆盘编号,实现为栈intdiskNum;//圆盘数,并作为栈顶指针};structDisk{//圆盘结构GLfloatx0,y0;//中心坐标GLfloatinr,outr;//内外半径GLfloatcolor[3];//圆盘的颜色};将Hanoi塔动画的相关函数组成一个类CHanoi,具体定义为:classCHanoi:publicCWnd{DECLARE_DYNAMIC(CHanoi)public:CHanoi();virtual ̄CHanoi();intMySetPixelFormat(HDChdc);//设置像素格式函数HDChdc;//绘图描述表HGLRChglrc;//渲染描述表voiddrawPegs();//绘制塔柱voiddrawInitDisks();//绘制开始移动前各塔柱中的圆盘voidDrawBottomBox(void);//绘制底座voidinit(intn);//Hanoi塔初始化,设置各塔柱、圆盘的各种属性等voidhanoiGame(inthigh,intFrom,intUsing,intTo);//Hanoi塔递归函数voidmoveDisk(intno,intfrom,intto);//第no号圆盘从from塔柱移动到to塔柱voiddrawDynamicDisk(intno);//绘制第no号圆盘动画voiddrawStaticDisk(intno,GLfloatcolor[]);//用制定颜色绘制第no号圆盘protected:DECLARE_MESSAGE_MAP()public:afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);afx_msgvoidOnPaint();};3.2主要算法3.2.1Hanoi塔递归算法voidhanoi(intdiskno,intfrom,intusing,intto){if(diskno>0){hanoi(diskno-1,from,to,using);moveDisk(diskno,from,to);hanoi(diskno-1,using,from,to);}}3.2.2moveDisk(diskno,from,To)函数的实现步骤编号为diskno圆盘从from塔柱移到to塔柱上(即moveDisk(diskno,from,To)函数的实现)的步骤为:(1)从当前位置上移至源柱from顶上;(2)水平(方向依赖于form与to间的位置关系)移到目标柱to顶;(3)下移至目标柱to原有圆盘的上面;(4)修改from、to塔柱圆盘和可放圆盘的位置:from塔柱的圆盘减1,可放圆盘的位置降低;to塔柱圆盘增1,可放圆盘的位置升高。
3.2.3二次作图法移动圆盘采用二次作图法:第一次用圆盘的颜色画圆盘,交换缓存,第二次用背景色画圆盘;然后再改变圆盘位置画圆盘,于是视觉上被圆盘移动。
具体实现函数是:voiddrawDynamicDisk(intno)。
画圆盘的函数为voiddrawStaticDisk(intno,GLfloatcolor[3])。
3.3开发环境及模拟效果该动画程序利用OpenGL和VisualC++.NET编程技术[4,5,6]在VisualC++.NET环境下用基于对话框的应用程序模式实现(源程序清单略)。
界面中包含显示动画的区域、设(下转第83页)160福建电脑2006年第6期!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(上接第160页)置圆盘数框、开始动画、速度控制滑条、结束动画命令按钮。
图1是程序运行时的一个场景。
图1Hanoi塔移动过程动画场景4.结语本文介绍了实现Hanoi塔问题递归算法动画模拟程序的OpenGL相关编程函数,分析了实现动画的主要数据结构和算法。
程序在VisualC++.NET下实现,圆盘数可动态设置,各圆盘、塔柱、底座的颜色在运行时随机形成,可进行速度控制,较好地模拟了Hanoi塔问题递归算法的执行过程。
若对程序作适当修改,如加上光照、材质、纹理等,模拟效果将进一步增强。
参考文献:1.王晓东.计算机算法设计与分析(第2版)[M].北京:电子工业出版社,2004.2.严蔚敏,吴伟明.数据结构(C语言版)[M].北京:清华大学出版社,1997.3.谭浩强.C程序设计(第二版)[M].北京:清华大学出版社,1999.4.和平鸽工作室.OpenGL三维图形系统开发与实用技术(基础编程篇)[M].北京:清华大学出版社,重庆:重庆大学出版社,2003.5.和平鸽工作室.OpenGL高级编程与可视化系统开发(高级编程篇)[M].北京:中国水利水电出版社,2003.6.Archer,T.等著,马云等译.VisualC++.NET宝典[M].北京:电子工业出版社,2003.7.王晓东,吴英杰.广义Hanoi塔问题的动态规划算法[J].小型微型计算机系统,2005(5).本试验总共要进行9次,将试验结本试验总共要进行9次,将试验结果———静电电位值y1,y2,…,y9填写在正交表的最后一列中,如表2所示。
3.2.2计算极差确定最优方案引进记号Kij和Rj。
其中,Kij=第j列上水平号为i的各个试验结果之和;Rj=max{Kij}-min{Kij}。
Rj称为第j列的极差或其所在因素的极差。
对于本试验,有:K11=y1+y2+y3=0.0247+0.254+0.861=1.1397;K21=y4+y5+y6=0.584+0.756+1.245=2.585;K31=y7+y8+y9=0.829+1.720+1.719=4.268;R1=max{K1A,K2A,K3A}-min{K1A,K2A,K3A}=4.268-1.1397=3.1283。
依此类推,可以确定其它的Kij,Rj。
它们的计算结果填写在表2中。
挑选因素的最优水平与所要求的指标有关,若指标越大越好,则应该选取使指标大的水平,即各列K1j、K2j、K3j中最大的那个水平;否则,若指标越小越好,则应该选取使指标最小的那个水平。
试验的目标找出静电电位最大时的条件。
因为指标越大越好,所以应该挑选出每个因素的K1j、K2j、K3j中最大的那个水平。
由于K3A>K2A>K1A;K3B>K2B>K1B;K3C>K1C>K2C。
故得最优方案为A3B3C3,即选取试验条件为“相对湿度25%,摩擦速度130转/分钟,摩擦时间24秒”。
3.3试验分析在静电电位试验中,若对正交试验进行理论分析得到的最优方案为A3B3C3,但是,在真正把它作为方案来执行之前,往往还需要进行对比验证试验。
其步骤如下:首先是把理论最优方案A3B3C3与按正交表的规定做过的9个试验中产生静电电位最高的第8号方案A3B2C3做多次对比试验。
如果在试验中方案A3B3C3确实比8号试验方案A3B2C3产生的静电电位更高,通常就认为由理论分析确定的A3B3C3为静电电位最优方案。
否则就取8号试验方案A3B3C3为最优方案。
若对这两个试验方案进行多次对比试验中发现由理论分析获得的最优试验方案A3B3C3产生的静电电位比第8号试验方案A3B2C3要低,一般来说可能是各个因素之间存在不可忽略的交互作用,也可能是试验误差较大所引起的,那么,需要作进一步的研究,经过试验方案的一定改动,可能还可以提高试验产生的静电电位。