《计算机图形学基本图元生成系统设计与实现大学学位论文.doc》由会员分享,可在线阅读,更多相关《计算机图形学基本图元生成系统设计与实现大学学位论文.doc(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 题 目 计算机图形学基本图元生成系统的设计与实现 学生姓名 刘晓东 学号 1118014007 所在学院 数学与计算机科学学院 专业班级 计本1101班 指导教师 高虎 _ 完成地点 陕西理工学院 2015 年 6 月 3 日计算机图形学基本图元生成系统的设计与实现刘晓东(陕西理工学院数学与计算机科学学院计算机科学与技术专业1101班,陕西 汉中 723001)指导教师:高虎摘要:本设计旨在提高计算机图形学课程效果,直观地显示部分图形学算法,将抽象知识可视化,方便学生理解。该系统以VC+6.0作为开发环境,实现了基本图元的生成,设置线条属性、曲线和曲面的生成等,这一系统的开发和应用会对图形学
2、课程的教学提供较大的帮助。关键词:计算机图形学;VC+6.0;可视化Computer Graphics Primitives to Generate Basic System Design and ImplementationLiu Xiaodong(Grade 11,Class 01, Major Computer Sinence and Technology ,School of Mathematics and Computer Science,Shaanxi University of Technology,Hanzhong 723001, Shaanxi)Tutor:Gao HuAbs
3、tract: This design aims to improve the effect of computer graphics course,display some visual graphics algorithms,make the abstract knowledge visualization,being convenient for studengs to understand.With VC+6.0 as development environment,the system realizes the basic figure generated, seting line p
4、roperties,curve and cured surface formation.Development and application of this system will provide great help for graphics teaching. Key words: vc+6.0; computer graphics; visualization陕西理工学院毕业设计目 录引言11 课题描述21.1选题来源与背景21.2研究的目的与意义21.3设计思路21.4系统特点31.5系统开发环境32 系统的功能分析与总体设计42.1系统的功能需求分析42.1.1系统开发的内容42.
5、1.2系统需要实现的功能42.2 总体设计43 二维图形的基本生成53.1 概述53.2二维图形的生成原理分析53.2.1直线53.2.2椭圆53.2.3曲线63.3 系统的界面设计93.4程序运行实例104 三维图形的生成124.1概述124.2三维图形的生成算法原理分析124.2.1曲面124.3三维图形的可视化原理分析124.3.1三维变换124.3.2曲面144.4程序运行实例145 系统与编码实现205.1系统的类205.2类的实现205.2.1 CPainterView类205.2.2 CMainFrame类205.3程序控制与操作256 结论26致谢27参考文献28科技外文文献2
6、9引言计算机图形学是利用计算机研究图形的生成表示、处理和显示的学科,其主要研究内容是图形在计算机中的表示方法,以及利用计算机对图形的计算、处理和显示的相关原理和算法。计算机图形学的研究成果已被广泛应用于航天、航空、建筑工程、地理信息等许多工程领域。这就决定了此课程必须要理论于实际相结合的原则。不仅要使学生系统地掌握计算机图形学生成与处理技术的基础知识、原理和方法,而且要培养学生图形软件的设计技能。遗憾的是,国内计算机图形学主要取决于经典的教学书,重点是讲述上世纪的图形学技术,教学过程中一般围绕着数学公式的推导进行,学生不易理解,而且繁冗的数学公式会令学生对课程的兴趣下降,教学效果不能令人满意。
7、为了提高教学质量,本文基于VC+6.0在MFC单文档的窗体下,开发了计算机图形学基本图元生成的教学演示系统。该系统能够让学生直观的看到图元的生成和显示过程,使得数学公式不再枯燥无趣,学生易于接受,也乐于接受,可以大大提高教学效果。1 课题描述1.1选题来源与背景计算机图形学是研究怎样用计算机生成、处理、显示和输出图形的学科。而图形学教学的关键在于如何将图形的各种变换生动直观地展示给学习者,使学习者更深入的理解计算机图形学的理论和算法原理。传统的计算机图形学算法的实现和开发主要是基于以Turbo C为代表的DOS开发环境,这种方法可视化效果很差,并且缺乏交互控制和动态演示。因而往往会给学习者的理
8、解和深入探讨带来很大的问题。后来,随着多媒体技术的发展,计算机图形学的教学开始运用静态的图片教学幻灯片的形式来讲授,这些教学幻灯片虽然弥补了传统的黑板板书的不足,较大地提高了教学质量,但是这种教学模式在可视化和交互式方面仍然存在着较大的不足。往往让学习者感到很抽象,难以理解。近几年,编程语言的较快发展使计算机图形学教学系统有了很大的进步。使教学系统实现了计算机图形学理论的实践化,能使学习者通过交互式的操作,更深入了解计算机理论的用法,但是这种教学系统无法学习者看见图形生成的源程序,在帮助学习者对理论的深入理解上仍存在着些许不足,使他们无法真正体会图形生成的算法原理。目前,还有一种教学模式是采用
9、flash动画演示并配加一定文字说明的方式,这种方式可以在很大程度上揭示图形生成的算法原理,遗憾的是不能很全面的演示教学内容,缺乏交互性,不能让学习者自己输入相关的参数。为此,本文在ViusalC+6.0的编程环境下,开发了一套专门致力于帮助学习者理解计算机图形学理论而设计了图元生成系统。该系统将可视性,交互性和可扩展性紧紧地结合在一起,能够大大改善传统教学的弊端,使复杂的难以理解的计算机图形学理论通过教师的课堂演示和学习者的不断自我交互式操作试验变得通俗明朗,有效地提高教学的质量和效果。特别是本文在图形学可视化和交互式操作方面进行了深入研究,这些也是本系统最重要的亮点。1.2研究的目的与意义
10、计算机图形学是一门发展迅速的新兴学科,是计算机应用学科的一个重要分支。计算机图形学的研究内容非常广泛,如图形硬件、光栅图形生成算法、图形交互技术、实体造型与显示算法虚拟现实等。随着计算机系统软件、硬件及其外部设备的发展,特别是光栅图形显示器的问世。计算机图形学的应用已经渗透到各个工程技术领域, 成为用户界面、数据可视化、电视广告、动画和其他应用中的公共成分,而计算机图形学中的基本图形生成算法,在该学科中扮演着至关重要的角色。计算机图形学基本图元生成系统的目标是设计一个辅助教师教学的基本图元生成的系统。教师可以较为简单的实现图形的绘制,例如圆、椭圆、直线和弧面等,同时可以实现图形的保存和修改以及
11、改变图形的线宽和颜色,便于下次使用。计算机图形学主要是利用计算机产生令人赏心悦目的具有真实感图形。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成,本研究中将对直线、圆、椭圆生成算法、多边形填充进行全面的介绍、学习探讨以及归纳总结,力求将基本的图元展示给大家。该系统设计的目的是实现各种基本的图元生成和展示,提高教学的效率。无论在学习上,还是实际应用上,本研究都具有促进作用和深远的意义。1.3设计思路本文理论与实践相结合,在认真分析了图形学算法原理的基础上,提出了一种将图形生成过程与图形的变换过程同步可视化演示的新思路,实现了计算机图形学中大部分图形的可视化演示。论文研
12、究的主要内容及结构安排如下:(1)描述了计算机图形学基本图元生成系统的研究背景,研究目的和研究意义及开发环境。(2)主要介绍了系统的功能需求分析以及系统的总体结构设计。(3)主要讲述了计算机图形学中二维图形的生成,其中包括直线,三角形,矩形,椭圆的生成方法,各种二维变换的可视化,和各种曲线的可视化实现原理。(4)主要讲述了计算机图形学中三维图形中Bezier曲面的生成方法。(5)重点讲述了系统实现的各主要的类之间的层次关系,同时将其中的主要的类作了详细介绍,说明了类中的函数的调用关系,最后还简单说明了程序的操作和控制方法。(6)对系统做出了三方面的总结。1.4系统特点本文在VC+ 6.0的环境
13、下,开发了一套全新的集可视性,交互性于一体的计算机图形学基本图元生成系统,本系统的主界面如图1.1所示。图1.1 系统的主界面该系统根据计算机图形学的基本理论,运用各种动态演示的方法,将直线的生成、多边形填充、二维图形的基本生成和变换、三维图形的基本几何变换以及Bezier曲线变换的生成过程以及变化过程的显示在学习者面前。本系统的主要特点如下:(l)充分体现了VC+编程语言界面友好的特点,在程序界面中增加了控制工具栏和绘图辅助栏,所有图标都设定了提示和状态栏提示帮助,极大的方便了学习者的使用。(2)摆脱了以往的静态文字说明的教学方式,将图形的实现过程以动态的方式一步步演示出来,给学生一种耳目一
14、新的感觉。文字结合图形生成的效果大大地激发了学生的学习兴趣,让学生对图形生成的算法原理有了更直接和更真实的认识和了解。(3)采用了VC+工程中的单文档界面,增加了对程序演示的操作菜单,学生可以通过选择不同的按钮生成不同的图形或者选择放大图形、缩小图形、平移等菜单来控制程序的运行,实现了学生与程序的交互,极大的提高了教学质量。(4)具有良好的扩展性,可以在短时间内添加新的图形算法函数,使程序更加全面。1.5系统开发环境(1) 硬件系统:笔记本(2) 操作系统:Windows XP或Win7 旗舰版操作系统(3) 开发环境:VC+6.02 系统的功能分析与总体设计2.1系统的功能需求分析2.1.1
15、系统开发的内容计算机图形学基本图元生成系统研究的内容主要有:实现直线的生成、三角形生成、矩形的生成以及椭圆和曲线的生成、Bezier曲线变换的生成过程,还可以改变线型和线宽及颜色。2.1.2系统需要实现的功能基本图形功能:指在屏幕中置点,绘制直线、三角形、椭圆、矩形、曲线以及文本,还有可以改变线型线宽和颜色等。文件功能:能够新建、打开、写入、读出、关闭、删除和退出程序。图形变换功能:拷贝、粘贴、平移、删除。图形的存储与输入和输出:以各种方式加以存储。放大缩小功能:能够通过菜单栏或工具栏实现图形的等比缩放的功能。2.2 总体设计计算机图形学基本图元生成系统流程图如图2.1所示:图2.1 系统总体
16、设计结构图3 二维图形的基本生成3.1 概述本系统在对计算机图形学的算法可视化的时候,分别对二维图形和三维图形运用了不同的方法来实现,因此本系统将把二维图形和三维图形的生成分开来讨论,本章主要探讨二维图形的生成方法,在下一章将探讨三维图形的生成方法。二维图形包括直线、三角形、椭圆、曲线、矩形、填充等,其中每种图形又包括不同的算法,比如,直线的常见算法有DDA算法、Bresenham算法、中点算法等。在数学中,所有的基本图形都是以点为最小单位按一定的规律组合而成的集合。为了将图形在计算机上显示出来,无意就是找出这种排列的规律,然后在显示器所给定的有限个像素组成的矩阵中确定逼近于该图形的最佳像素组
17、,并且按一定的顺序对这些像素进行写操作。图形学生成算法的可视化就是在解读图形显示原理的基础上,通过创建“虚拟栅格”来模仿计算机的“象素点”,结合图形生成的算法,计算出图形在虚拟栅格中的最佳逼近“象素点”,然后以画圆来代替这些“象素点”的方式显示图形。下面将对基本二维图形的生成原理逐一介绍和分析。3.2二维图形的生成原理分析3.2.1直线直线作为最简单的图形,是生成其它复杂图形的基础。直线是点的集合,在几何学中直线被定义为两个点之间的最短距离。也就是说一条直线是指所有在它上面的点的集合。直线可以向一个方向及其相反的方向无限延长,这不是计算机图形学中所需要的,在图形学中研究的对象是直线段。下面我们
18、来研究直线上只存在于两个端点,和之间的任意点。例如,线段的起点坐标,终点坐标,这两个点就确定了这条线段,并用线段上的任意一点均满足: 画一条直线实际上是根据一系列计算出来并与该线靠近的像素绘制的,当我们要在屏幕上显示一条直线时,只能在显示器所给定的有限个像素组成的矩阵中确定最佳逼近于该直线的一组像素,并且按扫描线顺序对这些像素进行写操作。这就是通常所说的用显示器绘制直线,或直线的扫描转换。直线的最常见的扫描转换方式有数值微分法(DDA算法),中点法和Bresenham算法。它们的算法原理在计算机图形学的很多书上都介绍的很清楚。3.2.2椭圆中心在原点、轴对齐的椭圆的非参数化方程为: (3.1)
19、式3.1可用隐式方程表示为:由于椭圆的对称性,仅考虑在第一象限的椭圆弧即可。对隐函数求导可得,由于可知椭圆在第一象限内单调递减,在区间内切线的斜率从0递减到。为了使生成的椭圆具有封闭性,以弧上斜率为-1的点作为分界,把椭圆弧分成上下两部分。上半部分满足即,的变化量大于的变化量,由从点开始递增步长来确定的值,下半部分满足即,的变化量大于的变化量,由从点开始递增步长来确定的值。由于这两部分是相互独立的,可用两个处理器(或线程)并行处理,而不用考虑同步问题,从而能最大化的提高并行效率,见图3.1。图3.1 第一象限的椭圆弧对于上半部分,假设已知点为则下一点在其右方点或右下方点中选择离椭圆弧最近的点,
20、而为右方点到椭圆弧的距离, 为右下方点到椭圆弧的距离,通过做差:可判断出所要选择的点,即:选择右方的点,选择右下方的点.根据所得到的利用上述思想推下一点即可得到与的递推关系式:根据递推关系式和已知点就可得到所有上半部分的点。对于下半部分,假设已知点为,则下一点在其上方点或左上方点中选择离椭圆弧最近的点,而为上方点到椭圆弧的距离, 为左上方点到椭圆弧的距离,通过做差:可判断出所要选择的点,即:选择上方的点,选择左上方的点。根据所得到的利用上述思想推下一点即可得到与的递推关系式:根据递推关系式和已知点(a,0)就可得到所有下半部分的点.通过上下部分拟合得到所有椭圆上的点。椭圆的扫描转换算法主要有D
21、DA算法,中点算法,Bresnham算法以及正负步法和双步法。3.2.3曲线贝赛尔(Bezier)曲线是有多项式调和函数推导出来的,通常n+1个顶点定义一个n次多项式。Bezier曲线的参数方程表示如下: (3.5)在式(3.5)中,表示特征多边形n+1个顶点的位置向量,是伯恩斯坦(Bernstein)多项式,称为基函数,也就是贝赛尔多边形的各顶点位置向量之间的调和函数。该函数的表达式为:Bezier曲线的缺点:(1) 特征多边形顶点个数决定了Bezier曲线阶次,并且当n较大时,特征多边形对曲线的控制将会减弱;(2) Bezier曲线不能作局部修改,即改变某一控制点的位置对整条曲线都有影响。
22、曲线生成代码如下所示:void CTestView:DrawBezier()/绘制Bezier曲线CDC *pDC=GetDC();CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255);/曲线颜色为蓝色pOldPen=pDC-SelectObject(&NewPen);pDC-MoveTo(P0);for(double t=0.0;t=1.0;t+=0.01)double x=0,y=0;for(int i=0;iLineTo(Round(x),Round(y);pDC-SelectObject(pOldPen);NewPe
23、n.DeleteObject();ReleaseDC(pDC);/释放DCdouble CTestView:Cni(const int &n, const int &i)/Bernstein第一项组合return double(Fac(n)/(Fac(i)*Fac(n-i);long CTestView:Fac(int m)/阶乘函数long f;if(m=0|m=1)f=1;elsef=m*Fac(m-1);return f;void CTestView:DrawCtrlPolygon()/绘制控制多边形CDC *pDC=GetDC();CBrush NewBrush,*pOldBrush;
24、pOldBrush=(CBrush*)pDC-SelectStockObject(GRAY_BRUSH);/灰色实心圆绘制控制点for(int i=0;iMoveTo(Pi);pDC-Ellipse(Pi.x-2,Pi.y-2,Pi.x+2,Pi.y+2);elsepDC-LineTo(Pi);pDC-Ellipse(Pi.x-2,Pi.y-2,Pi.x+2,Pi.y+2);pDC-SelectObject(pOldBrush);ReleaseDC(pDC);void CTestView:OnLButtonDown(UINT nFlags, CPoint point)/获得屏幕控制点坐标 /
25、TODO: Add your message handler code here and/or call defaultif(bFlag)PCtrlPointNum.x=point.x;PCtrlPointNum.y=point.y;if(CtrlPointNumm_hWnd; CDC* pDC=GetDC();CRect rect;/定义客户区GetClientRect(&rect);/获得客户区的大小pDC-SetMapMode(MM_ANISOTROPIC);/pDC自定义坐标系pDC-SetWindowExt(rect.Width(),rect.Height();/设置窗口范围pDC-
26、SetViewportExt(rect.Width(),-rect.Height();/x轴水平向右,y轴垂直向上pDC-SetViewportOrg(rect.Width()/2,rect.Height()/2);/屏幕中心为原点CDC MemDC;/内存DCCBitmap NewBitmap,*pOldBitmap;/内存中承载图像的临时位图MemDC.CreateCompatibleDC(pDC);/建立与屏幕pDC兼容的MemDC NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height();/创建兼容位图 pOldBi
27、tmap=MemDC.SelectObject(&NewBitmap); /将兼容位图选入MemDC MemDC.FillSolidRect(&rect,pDC-GetBkColor();/按原来背景填充客户区,否则是黑色 MemDC.SetMapMode(MM_ANISOTROPIC);/MemDC自定义坐标系MemDC.SetWindowExt(rect.Width(),rect.Height();MemDC.SetViewportExt(rect.Width(),-rect.Height();MemDC.SetViewportOrg(rect.Width()/2,rect.Height(
28、)/2);DrawCtrlPolygon(&MemDC);/绘制控制多边形SignCtrPoint(&MemDC);/标注控制点编号DrawObject(&MemDC);/绘制Bezier曲面pDC-BitBlt(-rect.Width()/2,-rect.Height()/2,rect.Width(),rect.Height(),&MemDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);/将内存位图拷贝到屏幕MemDC.SelectObject(pOldBitmap);/恢复位图NewBitmap.DeleteObject();/删除位图Release
29、DC(pDC);/释放DCvoid CDrawBizerCurve:ReadPoint()/读入控制多边形16个顶点坐标P300.x=20; P300.y=0; P300.z=200;/P00P301.x=0; P301.y=100;P301.z=150;/P01P302.x=-130;P302.y=100;P302.z=50; /P02P303.x=-250;P303.y=50; P303.z=0; /P03P310.x=100; P310.y=100;P310.z=150;/P10P311.x=30; P311.y=100;P311.z=100;/p11P312.x=-40; P312.y
30、=100;P312.z=50; /p12P313.x=-110;P313.y=100;P313.z=0; /p13P320.x=280; P320.y=90; P320.z=140;/P20P321.x=110; P321.y=120;P321.z=80; /P21P322.x=30; P322.y=130;P322.z=30; /P22P323.x=-100;P323.y=150;P323.z=-50;/P23P330.x=350; P330.y=30; P330.z=150;/P30P331.x=200; P331.y=150;P331.z=50; /P31P332.x=50; P332.
31、y=200;P332.z=0; /P32P333.x=0; P333.y=100;P333.z=-70;/P33void CDrawBizerCurve:ObliqueProjection()/斜等测投影for(int i=0;i4;i+)for(int j=0;jSelectObject(&NewPen);for(int i=0;iMoveTo(Round(P2i0.x),Round(P2i0.y);for(int j=1;jLineTo(Round(P2ij.x),Round(P2ij.y);for(int j=0;jMoveTo(Round(P20j.x),Round(P20j.y);for(int i=1;iLineTo(Round(P2ij.x),Round(P2ij.y);pDC-SelectObject(pOldPen);NewPen.DeleteObject();void CDrawBizerCurve:DrawObject(CDC *pDC)/绘制双三次Bezier曲面double x,y,u,v,u1,u2,u3,u4,v1,v2,v3,v4;double M44;M00=-1;M01=3; M02=-3;M03=1;M10=3; M11=-6;M12=3; M13=0;M20=-3;M21=3; M22=0; M23=0;M30=1; M3
限制150内