计算机图形学实验报告课程名称 : 计算机图形学实验名称 :图形绘制与变换学院 : 电子信息工程学院专业 : 计算机科学与技术班级 : 11计科本 01班学号 :** : ****** : ***二零一四年目录一、引言--------------------------------------------------------------------- 3二、设计需求----------------------------------------------------------------- 4设计目标--------------------------------------------------------------- 4设计环境--------------------------------------------------------------- 4 VC++ -------------------------------------------------------------- 4 MFC --------------------------------------------------------------- 4设计题目及要求 -------------------------------------------------------- 5总体流程图------------------------------------------------------------ 5三、课程设计原理------------------------------------------------------------- 6实现的算法------------------------------------------------------------- 6 Bresenham算法画直线------------------------------------------------ 6中心点算法画圆和椭圆------------------------------------------------ 7图形变换的基本原理 ---------------------------------------------------- 10平移变换 ---------------------------------------------------------- 10旋转变换 --------------------------------------------------------- 10比例变换 --------------------------------------------------------- 10四、总体设计与功能实现 ------------------------------------------------------ 11主要界面设计 ---------------------------------------------------------- 11设置颜色界面 ---------------------------------------------------------- 11界面设置代码 ------------------------------------------------------ 11运行结果 ---------------------------------------------------------- 12二维线画图元实现 ------------------------------------------------------ 12画多边形功能的实现 --------------------------------------------------- 18画Bezier曲线功能的实现----------------------------------------------- 19二维图形变换的实现 --------------------------------------------------- 22三维图形的变换 ------------------------------------------------------- 25五、实验心得体会一、引言计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。
简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。
是计算机科学的一个分支领域,主要关注数字合成与操作视觉的图形内容。
计算机图形学研究的是应用计算机产生图像的所有工作,不管图像是静态的还是动态的,可交互的还是固定的,等等。
图形API是允许程序员开发包含交互式计算机图形操作的应用而不需要关注图形操作细节或任务系统细节的工具集。
计算机图形学有着广泛的应用领域,包括物理、航天、电影、电视、游戏、艺术、广告、通信、天气预报等几乎所有领域都用到了计算机图形学的知识,这些领域通过计算机图形学将几何模型生成图像,将问题可视化从而为各领域更好的服务。
?计算机图形学利用计算机产生让人赏心悦目的视觉效果,必须建立描述图形的几何模型还有光照模型,再加上视角、颜色、纹理等属性,再经过模型变换、视图变换、投影操作等,这些步骤从而实现一个完整的OpenGL程序效果。
OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。
计算机图形学通过应用OpenGL的功能,使得生成的图形效果具有高度真实感。
学习计算机图形学的重点是掌握OpenGL在图形学程序中的使用方法。
?事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。
同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。
通过21世纪是信息的时代,在日新月异的科技更新中相信计算机会发挥越来越重要的作用,计算机图形学也会在更多的领域所应用,虽然我国在这方面还比较薄弱,但相信会有越来越好的时候的。
二、设计需求设计目标以图形学算法为目标,深入研究。
继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。
通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到:巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。
设计环境VC++VC++是 Microsoft 公司推出的一个基于 Windows 系统平台、可视化的集成开发环境,它的源程序按 C++语言的要求编写,并加入了微软提供的功能强大的 MFC(Microsoft Foundation Class)类库。
MFC 中封装了大部分 Windows API 函数和 Windows 控件,它包含的功能涉及到整个 Windows 操作系统。
MFC 不仅给用户提供了 Windows 图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建和管理一个标准 Windows 应用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。
另外,它提供了大量的代码,指导用户编程时实现某些技术和功能。
因此,使用VC++提供的高度可视化的应用程序开发工具和 MFC 类库,可使应用程序开发变得简单。
MFCMFC(Microsoft Foundation Classes) ,是一个微软公司提供的类库( class libraries)以 C++类的形式封装了 Windows 的 API,,它包含了窗口等许多类的定义。
各种类的集合构成了一个应运程序的框架结构,以减少应用程序开发人员的工作量。
其中包含的类包含大量 Windows 句柄封装类和很多 Windows 的内建控件和组件的封装类。
MFC 版本封装了大约 200 个类,其中的一些可以被用户直接使用。
例如CWnd 类封装了窗口的功能,包括打印文本、绘制图形及跟踪鼠标指针的移动等;CsplitterWnd 类是从 CWnd 类派生出来的,继承了基类或称父类 CWnd 类的所有特性,但增加了自己的功能,实现拆分窗口,使窗口至少可被拆分成两个窗口,用户可以移动两个窗口之间的边框来改变窗口的大小;CtoolBar 类可以定义工具栏等。
MFC 命名的惯例是类的名字通常是由“C”打头;成员变量使用前缀“m_”,接着使用一个字母来指明数据类型,然后是变量的名称;所有的单词用大写字母开头。
设计题目及要求(1)题目:实现多边形和曲线的绘制和变换(2)要求:学会使用VC++编写实现图形的绘制变换,需包括直线、曲线、多边形的绘制和变换,及三维立体图形的相应变换.总体流程图三、课程设计原理实现的算法DDA算法画直线DDA是数字微分分析式(Digital Differential Analyzer)的缩写。
已知直线两端点(x1,y1)、(x2,y2)则斜率m为:m = (y2-y1)/(x2-x1)= Dx/Dy;直线中的每一点坐标都可以由前一点坐标变化一个增量(Dx, Dy)而得到,即表示为递归式: xi+1=xi+Dx yi+1=yi+Dy 。
递归式的初值为直线的起点(x1, y1),这样,就可以用加法来生成一条直线。
具体算法是:该算法适合所有象限,其中用了用了两个函数如:Integer= -9; Integer =8;Sign(i),根据i的正负,分别得到-1,0,+1;相应代码:1.画起点(x1,y1).2.准备画下个点。
x坐标增1,判断如果达到终点,则完成。
否则,由图中可知,下个要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点.如果线段ax+by+c=0与x=x1+1的交点的y 坐标大于M 点的y 坐标的话,下个点为U(x1+1,y1+1),否则,下个点为B(x1+1,y1),3.画点(U 或者B).4.跳回第2步.5.结束.中心点算法画圆和椭圆(1)中心点算法画圆在一个方向上取单位间隔,在另一个方向的取值由两种可能取值的中点离圆的远近而定。
实际处理中,用决策变量的符号来确定象素点的选择,因此算法效率较高。
生成圆弧的中点算法和上面讲到的生成直线段的中点算法类似。
考虑第一象限内[0,/x R ∈的八分之一圆弧段。
经过计算,得出判别式的递推公式为: 12302()50i i i i i i d x d d d x y d +++≤⎧=⎨+-+>⎩ 这两个递推公式的初值条件为: 00,0(,)(0,)5/4r x y R d R =⎧⎨=-⎩编写成员函数如下:void CMy2_9View::MidPointEllipse(CDC *pDC, double a, double b, int color) {double x,y,d,xP,yP,squarea,squareb;squarea=a*a;squareb=b*b;xP=(int)+(double)squarea/sqrt((double)(squarea+squareb)));yP=(int)+(double)squareb/sqrt((double)(squarea+squareb)));x=0;y=b;d=4*(squareb-squarea*b)+squarea;pDC->SetPixel(x,y,color);while(x<=xP){if(d<=0) d+=4*squareb*(2*x+3);else{d+=4*squareb*(2*x+3)-8*squarea*(y-1);y--;}x++;pDC->SetPixel(x,y,color);}x=a;y=0;d=4*(squarea-a*squareb)+squareb;pDC->SetPixel(x,y,color) ;while(y<yP){ if(d<=0) d+=4*squarea*(2*y+3);else{d+=4*squarea*(2*y+3)-8*squareb*(x-1);x--; }y++;pDC->SetPixel(x,y,color);}}编写OnDraw函数如下:void CMy2_9View::OnDraw(CDC* pDC){CMy2_9Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);MidPointEllipse(pDC,500,300,RGB(0,0,0));}(2)中心点算法画椭圆我们先考虑圆心在原点的椭圆的生成,对于中心不是原点的椭圆,可以通过坐标的平移变换获得相应位置的椭圆。