收藏 分享(赏)

计算机图形学课程设计__图形绘制变换.doc

上传人:精品资料 文档编号:8302826 上传时间:2019-06-19 格式:DOC 页数:26 大小:959KB
下载 相关 举报
计算机图形学课程设计__图形绘制变换.doc_第1页
第1页 / 共26页
计算机图形学课程设计__图形绘制变换.doc_第2页
第2页 / 共26页
计算机图形学课程设计__图形绘制变换.doc_第3页
第3页 / 共26页
计算机图形学课程设计__图形绘制变换.doc_第4页
第4页 / 共26页
计算机图形学课程设计__图形绘制变换.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

1、1计算机图形学 实验报告课程名称 : 计算机图形学 实验名称 : 图形绘制与变换 学 院 : 电子信息工程学院 专 业 : 计算机科学与技术 班 级 : 11 计科本 01 班 学 号 : 111102020103 姓 名 : 张慧 指导教师 : 王征风 二零一四年2目录一、引言 -3二、设计需求 -42.1 设计目标 -42.2 设计环境 -42.2.1 VC+6.0-42.2.2 MFC-42.3 设计题目及要求 -52.4 总体流程图 -5三、课程设计原理 -53.1 实现的算法 -53.1.2 Bresenham 算法画直线 -63.1.3 中心点算法画圆和椭圆 -63.2 图形变换的

2、基本原理 -83.2.1 平移变换 -83.2.2 旋转变换 -83.2.3 比例变换 -9四、总体设计与功能实现 -94.1 主要界面设计 -94.2 设置颜色界面 -94.2.1 界面设置代码 -94.2.2 运行结果 -104.3 二维线画图元实现 -104.4 画多边形功能的实现 -144.5 画 Bezier 曲线功能的实现 -154.6 二维图形变换的实现 -164.7 三维图形的变换 -18五、实验心得体会3一、引言计算机图形学(Computer Graphics,简称 CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内

3、容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。是计算机科学的一个分支领域,主要关注数字合成与操作视觉的图形内容。计算机图形学研究的是应用计算机产生图像的所有工作,不管图像是静态的还是动态的,可交互的还是固定的,等等。图形 API 是允许程序员开发包含交互式计算机图形操作的应用而不需要关注图形操作细节或任务系统细节的工具集。计算机图形学有着广泛的应用领域,包括物理、航天、电影、电视、游戏、艺术、广告、通信、天气预报等几乎所有领域都用到了计算机图形学的知识,这些领域通过计算机图形学将几何模型生成图像,将问题可视化从而为各领域更好的服务。 计算机图形学利

4、用计算机产生让人赏心悦目的视觉效果,必须建立描述图形的几何模型还有光照模型,再加上视角、颜色、纹理等属性,再经过模型变换、视图变换、投影操作等,这些步骤从而实现一个完整的 OpenGL 程序效果。OpenGL 是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。计算机图形学通过应用 OpenGL 的功能,使得生成的图形效果具有高度真实感。学习计算机图形学的重点是掌握 OpenGL 在图形学程序中的使用方法。 事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时,真实感图形计算的结果是以数字图像的

5、方式提供的,计算机图形学也就和图像处理有着密切的关系。通过 21 世纪是信息的时代,在日新月异的科技更新中相信计算机会发挥越来越重要的作用,计算机图形学也会在更多的领域所应用,虽然我国在这方面还比较薄弱,但相信会有越来越好的时候的。二、设计需求2.1 设计目标以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到:巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。2.2 设计环境2.2

6、.1 VC+6.0 VC+6.0 是 Microsoft 公司推出的一个基于 Windows 系统平台、可视化的 集成开发环境,它的源程序按 C+语言的要求编写,并加入了微软提供的功能 强大的 MFC(Microsoft Foundation Class)类库。MFC 中封装了大部分 Windows API 函数和 Windows 控件,它包含的功能涉及到整个 Windows 操作系统。MFC 不仅给用户提供了 Windows 图形环境下应用程序的框架, 而且还提供了创建应 用程序的组件,这样,开发人员不必从头设计创建和管理一个标准 Windows 应 用程序所需的程序,而是从一个比较高的起点

7、编程,故节省了大量的4时间。另 外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用VC+提供的高度可视化的应用程序开发工具和 MFC 类库,可使应用程序开发变 得简单。2.2.2 MFCMFC(Microsoft Foundation Classes) ,是 一 个 微 软 公 司 提 供 的 类 库 ( class libraries)以 C+类的形式封装了 Windows 的 API, , 它包含了窗口等许多类的定义。各种类的集合构成了一个应运程序的框架结构,以减少应用程序开发人员的工作 量。其中包含的类包含大量 Windows 句柄封装类和很多 Windows 的内建控

8、件和组 件的封装类。MFC 6.0 版本封装了大约 200 个类,其中的一些可以被用户直接使用。例如 CWnd 类封装了窗口的功能,包括打印文本、绘制图形及跟踪鼠标指针的移动等;CsplitterWnd 类是从 CWnd 类派生出来的,继承了基类或称父类 CWnd 类的所 有特 性,但增加了自己的功能,实现拆分窗口,使窗口至少可被拆分成两个窗口,用户 可以移动两个窗口之间的边框来改变窗口的大小;CtoolBar 类可以定义工具栏等。MFC 命名的惯例是类的名字通常是由“C”打头;成员变量使用前缀“m_” ,接着使用一个字母来指明数据类型,然后是变量的名称;所有的单词用大写字母开头。2.3 设计

9、题目及要求(1)题目:实现多边形和曲线的绘制和变换(2)要求:学会使用 VC+编写实现图形的绘制变换,需包括直线、曲线、多边形的绘制和变换,及三维立体图形的相应变换.2.4 总体流程图5三、课程设计原理3.1 实现的算法3.1.1 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 。递归式

10、的初值为直线的起点(x1, y1) ,这样,就可以用加法来生成一条直线。具体算法是:该算法适合所有象限,其中用了用了两个函数如:Integer(-8.5)= -9; Integer(8.5) =8;Sign(i),根据 i 的正负,分别得到-1,0,+1;相应代码: /DDA DrawLine if(abs(x2-x1) abs(y2-y1)length = abs(x2-x1);elselength = abs(y2-y1);Dx = (x2-x1)/length;Dy = (y2-y1)/length;x = x1+0.5*Sign(Dx);6y = x2 + 0.5*Sign(Dy);i

11、 = 1;while(i SetPixel(x,y,color);( ,i irxy) E M SE 7while(xSetPixel(x,y,color);x=a;y=0;d=4*(squarea-a*squareb)+squareb;pDC-SetPixel(x,y,color) ;while(ySetPixel(x,y,color);编写 OnDraw 函数如下:void CMy2_9View:OnDraw(CDC* pDC)CMy2_9Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);MidPointEllipse(pDC,500,300,RGB

12、(0,0,0);(2)中心点算法画椭圆我们先考虑圆心在原点的椭圆的生成,对于中心不是原点的椭圆,可以通过坐标的平移变换获得相应位置的椭圆。中心在原点。焦点在坐标轴上的标准椭圆具有 X 轴对称、Y 轴对称和原点对称特性,已知椭圆上第一象限的 P 点坐标是(x, y),则椭圆在另外三个象限的对称点分别是(x, -y)、(-x, y)和(-x, -y)。因此,只要画出第一象限的四分之一椭圆,就可以利用这三个对称性得到整个椭圆。相应代码:void MP_Ellipse(int xc , int yc , int a, int b) double sqa = a * a;double sqb = b *

13、 b;double d = sqb + sqa * (-b + 0.25);int x = 0;int y = b;EllipsePlot(xc, yc, x, y);while( sqb * (x + 1) 0)if (d SetPixel(x+x0,y+y0,color);:Sleep(time);pdc-SetPixel(-x+x0,y+y0,color);:Sleep(time);pdc-SetPixel(x+x0,-y+y0,color);:Sleep(time);pdc-SetPixel(-x+x0,-y+y0,color);:Sleep(time);pdc-SetPixel(y+

14、x0,x+y0,color);:Sleep(time);pdc-SetPixel(-y+x0,x+y0,color);:Sleep(time);pdc-SetPixel(y+x0,-x+y0,color);:Sleep(time);pdc-SetPixel(-y+x0,-x+y0,color);if(dSetPixelV(x+x0,y+y0,color);pdc-SetPixelV(x+x0,-y+y0,color);while(bb*(x+1)SetPixelV(x+x0,y+y0,color);:Sleep(time);pdc-SetPixelV(-x+x0,y+y0,color);:Sl

15、eep(time);pdc-SetPixelV(x+x0,-y+y0,color);:Sleep(time);pdc-SetPixelV(-x+x0,-y+y0,color);d2=bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb;deltax-=bb;deltay+=aa;while(y0) if(d2SetPixelV(x+x0,y+y0,color);:Sleep(time);pdc-SetPixelV(-x+x0,y+y0,color);:Sleep(time);pdc-SetPixelV(x+x0,-y+y0,color);:Sleep(time);pd

16、c-SetPixelV(-x+x0,-y+y0,color); void CGraphicsView:DDALine(CDC *pdc, int x0, int y0, int x1, int y1, int color)int xx,yy,s,s1,s2,di;float dx,dy,k,x,y;dx=x1-x0;if(dx=0) s1=1;else s1=-1;dy=y1-y0;13if(dy=0) s2=1;else s2=-1;dx=abs(dx);dy=abs(dy);if(dx=dy)s=0;di=(int)dx;k=dy/dx*s2;else s=1;di=(int)dy;k=d

17、x/dy*s1;x=x0;y=y0;for(int i=0;iSetPixel(xx,yy,color);x+=s1;y+=k;elsexx=(int)(x+0.5);yy=(int)y;:Sleep(time);pdc-SetPixel(xx,yy,color);y+=s2;x+=k;4.3.2 点击二维线画图元,课相应画出直线、圆和椭圆,结果如下:144.4 画多边形功能的实现4.4.1 部分实现代码:void CGraphicsView:OnDrawDuoBX() Vertex_Count dlg;if(dlg.DoModal()=IDOK) if(dlg.m_vertex_countM

18、AX) MessageBox(“输入顶点数过大“);return; VertexTotal=dlg.m_vertex_count;CDC *pDC=GetDC();CPen pen(PS_SOLID,2,RGB(255,255,255);CPen *pOldpen=pDC-SelectObject(pDC-MoveTo(int)(inVertexArray0.x+0.5),(int)(inVertexArray0.y+0.5);int i;for(i=1;iLineTo(int)(inVertexArrayi.x+0.5),(int)(inVertexArrayi.y+0.5);pDC-Lin

19、eTo(int)(inVertexArray0.x+0.5),(int)(inVertexArray0.y+0.5);pDC-SelectObject(pOldpen);ReleaseDC(pDC);inLength=0;outLength=0;WHAT_TO_DO=ID_DrawDuoBX;4.4.2 点击多边形,输入定点个数,可绘制出相应的多边形,结果如下:4.5 画 Bezier 曲线功能的实现4.5.1 部分实现代码:void CGraphicsView:OnBezier() 15/ TODO: Add your command handler code hereWHAT_TO_DO=

20、ID_BEZIER;CDC *p=GetDC ();p-TextOut (10, 20, “PS:鼠标左键添加曲线,鼠标右键修改曲线 .“);ReleaseDC (p);void CGraphicsView:OnBezierClear() n = -1;RedrawWindow();void CGraphicsView:DrawBezier(DPOINT *p) if (n p0.x-1) return; DPOINT *p1;p1 = new DPOINTn+1;int i, j;p10 = p0;for(i=1; i= 0 ) pointscurrent.x = point.x;point

21、scurrent.y = point.y;RedrawWindow();if(current2 = 0 ) pointscurrent2.x = point.x;pointscurrent2.y = point.y;RedrawWindow();break; default:break;CView:OnMouseMove(nFlags, point);164.5.2 点击曲线-Beizer 曲线,可实现 Beizer 曲线的绘制功能,绘制结果如下图:图 1 图 24.5.3 点击曲线-Beizer 曲线,可实现 Beizer 曲线的移动,鼠标点击其中的任一点,可实现曲线的移动,绘制结果如下图:

22、上图1移动后的曲线上图2移动后的曲线4.6 二维图形变换的实现可以实现一椭圆在界面上的随机移动,一圆在界面上饶某一点的旋转和一正方形由大变小在变大的变化,部分实现代码如下:void CGraphicsView:OnXuanzhuan() WHAT_TO_DO=ID_XUANZHUAN;time=0;OnClear();CClientDC dc(this);17CDC* pDC=int i, white=RGB(255,255,255), point 22=300,200,300,250;Matrix a (point00,point01), b (point10,point11);int mi

23、dx=(point00+point10)/2,midy=(point01+point11)/2;Matrix t1 (midx, midy,true), t2 (-midx, -midy,true); Matrix r (PI/50);Matrix temp (midx, midy,true);temp = t1*r*t2;for(i=0;iSetCheck(WHAT_TO_DO=ID_XUANZHUAN);void CGraphicsView:OnScale() WHAT_TO_DO=ID_SCALE;OnClear();CClientDC dc(this);CDC* pDC=time=0;

24、int i,white=RGB(255,255,255), point42=300,250,400,250,300,300,400,300;float sx=0.9,sy=0.85;int midx=(point00+point30)/2,midy=(point01+point31)/2;Matrix s1 (sx,sy),s2 (1/sx,1/sy);Matrix t1 (midx, midy,true), t2 (-midx, -midy,true); Matrix a (point00,point01), b (point10,point11);Matrix c (point20,poi

25、nt21), d (point30,point31);Matrix temp (midx, midy,true);temp = t1*s1*t2;DDALine (pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR);DDALine (pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR);DDALine (pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR);DDALine (pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);for

26、(i=0;iSetCheck(WHAT_TO_DO=ID_SCALE);4.7 三维图形的变换主要实现三维图形的上下左右平移,分别绕 X 轴 Y 轴 Z 轴的旋转,放大和缩小,以及正方体六个面的颜色变换,除此之外,还可以选择背景颜色的改变4.7.1 部分代码如下:void CGraphicsView:OnAoduomianti() WHAT_TO_DO=ID_AODUOMIANTI;CDrawDLG dlg1;dlg1.DoModal();void CGraphicsView:OnUpdateAoduomianti(CCmdUI* pCmdUI) pCmdUI-SetCheck(WHAT_TO

27、_DO=ID_AODUOMIANTI); void CDrawDLG:OnPaint() CPaintDC dc(this); / device context for paintingCWnd *pWnd=GetDlgItem(IDC_DRAW);19pWnd-UpdateWindow();/ CDC *PDC=pWnd-GetDC();Draw();void CDrawDLG:Draw() CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd-UpdateWindow();CDC *pDC=pWnd-GetDC();CRect rect;pWnd-GetClientRe

28、ct(rect);D v8=-fs,-fs,fs,-fs,fs,fs,fs,fs,fs,fs,-fs,fs,-fs,-fs,-fs,-fs,fs,-fs,fs,fs,-fs,fs,-fs,-fs,d8;POINT p04,p14,p24,p34,p44,p54,w8;int z8;for (int i=0; iGetDlgCtrlID();switch(nID) case IDC_SCROLLBAR1: a=pScrollBar-GetScrollPos();switch (nSBCode) case SB_LINELEFT: a-;break;case SB_LINERIGHT: a+;br

29、eak;case SB_PAGELEFT: a-=10;break;case SB_PAGERIGHT: a+=10;break;case SB_THUMBTRACK: a=nPos;break; if (a180)a=-180;pScrollBar-SetScrollPos(a);break;case IDC_SCROLLBAR2: b=pScrollBar-GetScrollPos();switch (nSBCode) case SB_LINELEFT: b-;break;case SB_LINERIGHT: b+;break;21case SB_PAGELEFT: b-=10;break

30、;case SB_PAGERIGHT: b+=10;break;case SB_THUMBTRACK: b=nPos;break; if (b180)b=-180;pScrollBar-SetScrollPos(b);break;case IDC_SCROLLBAR3: c=pScrollBar-GetScrollPos();switch (nSBCode) case SB_LINELEFT: c-;break;case SB_LINERIGHT: c+;break;case SB_PAGELEFT: c-=10;break;case SB_PAGERIGHT: c+=10;break;cas

31、e SB_THUMBTRACK: c=nPos;break; if (c180)c=-180;pScrollBar-SetScrollPos(c);break;case IDC_SCROLLBAR4: cx=pScrollBar-GetScrollPos();switch (nSBCode) case SB_LINELEFT: cx-;break;case SB_LINERIGHT: cx+;break;case SB_PAGELEFT: cx-=10;break;case SB_PAGERIGHT: cx+=10;break;case SB_THUMBTRACK: cx=nPos;break

32、;if (cx350)cx=200;pScrollBar-SetScrollPos(cx);break;case IDC_SCROLLBAR5: cy=pScrollBar-GetScrollPos();switch (nSBCode) case SB_LINELEFT: cy-;break;case SB_LINERIGHT: cy+;break;case SB_PAGELEFT: cy-=10;break;case SB_PAGERIGHT: cy+=10;break;case SB_THUMBTRACK: cy=nPos;break; if (cy300)cy=0;pScrollBar-

33、SetScrollPos(cy);break;case IDC_SCROLLBAR6: fs=pScrollBar-GetScrollPos();switch (nSBCode) case SB_LINELEFT: fs-;break;case SB_LINERIGHT: fs+;break;22case SB_PAGELEFT: fs-=0.55;break;case SB_PAGERIGHT: fs+=0.55;break;case SB_THUMBTRACK: fs=nPos;break; if (fs300)fs=50;pScrollBar-SetScrollPos(fs);break

34、;/ UpdateData(FALSE);/ Invalidate();Draw();CDialog:OnHScroll(nSBCode, nPos, pScrollBar);void CDrawDLG:OnOK() KillTimer(1);CDialog:OnOK();int CDrawDLG:Maxnum(int *p, int n) int max=p0;int x;for (int i=0; iUpdateWindow();CDC *pDC=pWnd-GetDC();CRect rect;pWnd-GetClientRect(rect);CDC dcmem;dcmem.CreateC

35、ompatibleDC(pDC);CBitmap bmp,*oldbmp;bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height();oldbmp=dcmem.SelectObject(CBrush brush6;brush0.CreateSolidBrush(COLOR1);brush1.CreateSolidBrush(COLOR2);brush2.CreateSolidBrush(COLOR3);brush3.CreateSolidBrush(COLOR4);brush4.CreateSolidBrush(COLOR5);brush

36、5.CreateSolidBrush(COLOR6);CBrush *oldbrush=dcmem.SelectObject(dcmem.FillSolidRect(rect,COLOR7);dcmem.Polygon(x,4);dcmem.SelectObject(23dcmem.Polygon(y,4);dcmem.SelectObject(dcmem.Polygon(z,4);dcmem.SelectObject(oldbrush);for (int b=0; bBitBlt(rect.left,rect.top,rect.Width(),rect.Height(),dcmem.Sele

37、ctObject(oldbmp);bmp.DeleteObject();dcmem.DeleteDC();4.7.2 运行结果如下:(1)实现多面体的上下左右平移(2)实现多面体的绕轴旋转:24(3)实现多面体的放大缩小:25(4)实现多面体及背景的颜色设置:(5)三维图形变换整体图形26五、实验心得体会在本次课程设计过程中,基本掌握了计算机图形学关于图形绘制变换的基础知识,DDA法画直线和中心点法画圆及椭圆的方法,还对图形的变换及需要用到的一系列的函数有了相应的理解,也了解的很多有关于图形学中三维图形的变换的知识。不过都只是皮毛而已,从中锻炼了自己的动手做实验的能力,但同时也让自己看清了自己

38、的水平,以便在以后的生活里多加强有关这方面的学习,从而提升自己在图形学方面的知识水平。在本次课程设计中,设计方案存在着很多的死板化的实现方法,也是很不人性化的一点,只提供了画一种曲线的方法,且画出的曲线只能移动,此为本次设计方案的不足之一;然后就是能实现曲面和多边形的绘制,却没有对应的实现绘制好图形后直接对其进行平移、选择等变换,此为设计方案不足之二。再者就是三维图形只能实现变换不能实现绘制,此为设计方案不足之三。鉴于个人能力真的有限,所以只能设计出此种级别的效果了。因为实验重要的只是思想过程,效果的不美观只能是因为学习的知识还远远不够,所以不能设计出完美的全面的图形绘制变换程序。经过此次设计,使我学到了很多东西,在没有开始做程序之前,没有任何思路,不知道该从哪里入手,可能是因为自己平时不认真听课的缘故。后来经过上网查询资料,翻阅参考书,在别人做的程序的启发下,才有了做此程序设计的眉目。在设计过程中遇到了很多的问题,在这里需要感谢王征风老师的帮助和指导,以及同学的帮助,最后一个个问题都被解决了,写出了完整的程序设计。最后也发现,其实只要努力,写出一个设计不是很困难,重要的是自己在写程序的过程中,要会学习,会查阅资料。这次的课程设计让我学习到了很多,以后我会努力提高自己在图形学方面的知识水平。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报