ImageVerifierCode 换一换
格式:DOCX , 页数:45 ,大小:320.94KB ,
资源ID:4573354      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4573354.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(计算机图形学实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

计算机图形学实验报告.docx

1、计算机图形学实验报告深 圳 大 学 实 验 报 告实验课程名称: 计算机图形学 实验项目名称: 图形学算法演示系统 学院: 专业: 报告人: 学号: 班级: 同组人: 指导教师: 实验时间: 实验报告提交时间: 教务处制实验内容:设计开发一个具有图形界面、交互性较好的图形学算法演示系统,并进行答辩演示。具体要求如下:系统应包含如下内容: 基本图元绘制算法:DDA绘直线、Bresenham绘直线、Bresenham绘圆 多边形扫描转换算法和区域填充算法实现(扫描线算法为必做,基于求余运算的边缘填充和边标志算法为任选;基于种子的区域填充采用4连通区域的递归种子填充算法,或扫描线种子填充算法,要求种

2、子点(x,y)可交互输入)。 线段裁剪和多边形裁剪算法的动画演示实现。(两种线段裁剪算法和H-S多边形逐边裁剪算法)多边形裁剪算法的动画演示要求先画出一个封闭的多边形,再画矩形的裁剪窗口,然后选择裁剪按钮(或命令),按下“上边裁剪”按钮(或执行“上边裁剪”命令),多边形相对裁剪窗口的上边进行裁剪,显示上边裁剪后的多边形,依此进行其它各边裁剪。 用动画实现二维图形变换的各种算法,实现对指定形体的平移、旋转和缩放。(包括类似自行车行走和绕固定点旋转的自旋转物体动画。) 简单三维图形系统:凸多面体的建模、透视投影,隐藏面的消除及基本图形变换(平移、旋转、缩放) 交互式Bezier曲线的输入绘制程序实

3、现 实用算法动态图形演示:任意选择程序设计、数据结构和算法设计中的经典问题,如冒泡排序、汉诺塔、八皇后、背包问题、动态规划等等,动画策略自定 光照效应:三维图形的面着色; 分形几何:Koch雪花,L系统植物及其他有特色的图形学相关效果等。实验说明:方法、步骤编程语言: C+IDE版本: Microsoft Visual C+ 6.0实验方法:使用MFC进行编程,参照实验指导书,一步一步操作,就可以基本完成整个实验的操作了。1、建立程序框架:创建MFC单文档应用程序2、添加绘图菜单项通过更改各个菜单选项属性,设置好ID号,并标明,如图所示3、在创建的View中添加个消息函数添加对应消息WM_CR

4、EAT的消息函数OnCreate()函数添加对应鼠标消息的WM_LBUTTONDOWN的消息函数OnLButtonDown();添加对应鼠标消息的WM_MOUSEMOVE的消息函数OnMouseMove ();添加对应鼠标消息的WM_RBUTTONDOWN的消息函数OnRButtonDown();添加对应鼠标消息的WM_MOUSEWHEEL的消息函数OnMouseWheel();4、声明变量和函数5、添加各菜单项的消息映射函数主要添加的响应有,鼠标右键、鼠标右键、鼠标滑轮、鼠标移动、键盘按键响应。每个工程的建立大同小异,下面将不对工程的建立和设置进行描述和说明。主要讨论程序的算法和实现。具体的

5、设置参见程序。基本图元一、实验内容本实验程序实现的主要函数及其说明关于绘制图形的算法的函数:void DDALine(CPoint start,CPoint end,long color);/用DDA算法绘制直线void MiddleLine(CPoint start, CPoint end,long color);/用中点算法绘制直线void BresenhamLine(CPoint start, CPoint end,long color);/用Bresenham算法绘制直线void Rectangle(CPoint start,CPoint end, long color);/绘制多边形

6、void BresenhamCircle(CPoint center,CPoint t,long color);/ 用Bresenham算法绘制圆void MiddleCircle(CPoint center,CPoint t,long color);/用中点算法绘制圆void MiddleEllipse(CPoint start,CPoint end, long color);/用中点算法绘制椭圆二、程序设计说明及源代码: 1、绘制直线的算法1)、DDA算法解:这个算法代码是直接抄写实验书上面的呀,算法比较明显,通过计算x方向和y方向的增量依次画出各个点,而这个代码也写得比较精炼step的应

7、用大大减少代码量。代码如下:void CExercise1View:DDALine(CPoint start, CPoint end,long color) CClientDC dc(this); dc.SetPixel(start.x,start.y,color); dc.SetPixel(end.x,end.y,color);/dx和dy分别是x方向和y方向的增量 int dx=end.x-start.x, dy=end.y-start.y, steps,k; float xIncrement,yIncrement,x=start.x,y=start.y;/选择增量大的方向作为每次前进的方

8、向 if(fabs(dx)fabs(dy) steps = fabs(dx); else steps = fabs(dy);/计算每个方向的前进增量 xIncrement = float(dx)/float(steps); yIncrement = float(dy)/float(steps); dc.SetPixel(int)(x+0.5),(int)(y+0.5),color); for(k=0;kend.x) TempPoint=start;start=end;end=TempPoint; dc.SetPixel(start.x,start.y,color); dc.SetPixel(e

9、nd.x,end.y,color); int a,b,d1,d2,d,x,y,flag=0,temp; if(fabs(start.x-end.x)fabs(start.y-end.y) flag=1; x=start.x; y=start.y; dc.SetPixel(x,y,color); a=start.y-end.y; b=end.x-start.x; if(start.yend.y) b=-b; if(flag=0) temp=a;a=b;b=temp; d=2*a+b; d1=2*a;d2=2*(a+b); if(start.y=end.y) if(flag=1) while(xe

10、nd.x) if(d0) x+;y+;d+=d2; else x+;d+=d1; dc.SetPixel(x,y,color); else while(y0) y+;x+;d+=d2; else y+;d+=d1; dc.SetPixel(x,y,color); else if(flag=1) while(x0) x+;y-;d+=d2; else x+;d+=d1; dc.SetPixel(x,y,color); else while(yend.y) if(dend.x) TempPoint=start;start=end;end=TempPoint; dc.SetPixel(start.x

11、,start.y,color); dc.SetPixel(end.x,end.y,color); int dx=fabs(end.x-start.x),dy=fabs(end.y-start.y); int d,twoDy,twoDyMinusDx; int x,y,t=1,count; if(start.yend.y) t=-1; x=start.x;y=start.y; dc.SetPixel(x,y,color); if(dx=dy) d=2*dy-dx; twoDy=2*dy,twoDyMinusDx=2*(dy-dx); while(xend.x) x+; if(d0) d+=two

12、Dy; else y+=t;d+=twoDyMinusDx; dc.SetPixel(x,y,color); else d=2*dx-dy; twoDy=2*dx,twoDyMinusDx=2*(dx-dy); count=0; while(countdy) count+; y+=t; if(d0) d+=twoDy; else x+;d+=twoDyMinusDx; dc.SetPixel(x,y,color); 2、多边形绘制1)、三角形三角形画法很简单只是用鼠标点三个点,然后将三个点连线就可以了。这个难点在于交与方面和实现橡皮筋功能方面。2)、矩形矩形的画法也比教简单,只是选择两个点(X

13、A,YA),(XB,XY),然后组合后画出对应的4条线段就可以了。3)、多边形通过鼠标点击的点依次画出各个点间的连线就可以了,最后结束的时候只要点击鼠标右键就可以了。3、圆的绘制算法1)、中点算法解:这个算法的原理和直线的中点算法原理一样,代码完全参照课本给的程序,修改下就可以使用了,也结合了实验指导书的例程。void CExercise1View:MiddleCircle(CPoint center, CPoint t, long color) CClientDC dc(this); CPoint temp; float radius=sqrt(center.x-t.x)*(center.x

14、-t.x) + (center.y-t.y)*(center.y-t.y); int p=1-(int)radius; temp.x=(int)radius; temp.y=0; circlePlotPoint(center,temp,color); while(temp.ytemp.x) temp.y+; if(p0) p+=2*temp.y+3; else temp.x-;p+=2*(temp.y-temp.x)+5; circlePlotPoint(center,temp,color); 2)、Bresenham算法解:也是参照书上的例程,修改下,对这个算法的理解还不是很深刻。void

15、CExercise1View:BresenhamCircle(CPoint center, CPoint t, long color) CClientDC dc(this); CPoint temp; int R=(int)sqrt(center.x-t.x)*(center.x-t.x) + (center.y-t.y)*(center.y-t.y); int d=3-2*R; temp.x=0; temp.y=R; circlePlotPoint(center,temp,color); while(temp.xtemp.y) circlePlotPoint(center,temp,colo

16、r); if(d0) d = d + 4*temp.x + 6; else d = d + 4*(temp.x-temp.y) +10; temp.y-; temp.x+; if(temp.x=temp.y) circlePlotPoint(center,temp,color);4、椭圆绘制算法解:首先将椭圆分成两个区域,以切线斜率为-1作为分界。由及算出分界点, 初值为,从(0,b)开始画到(x,y)到(a,0)切线斜率, 当,当, 切线斜率, 当,当, 代码如下:void CExercise1View:MiddleEllipse(CPoint start, CPoint end, long

17、 color) CClientDC dc(this); CPoint t,k; CPoint temp; temp=start; int a=fabs(start.x-end.x),b=fabs(start.y-end.y); if(a=0 | b=0) return; int aa=a*a,bb=b*b; k.x=(int)(float)aa/sqrt(float)(aa+bb)+0.5); k.y=(int)(float)aa/sqrt(float)(aa+bb)+0.5); t.x=0; t.y=b; int d=4*(bb-aa*b)+aa; ellipsePlotPoint(temp

18、,t,color); while(t.x=k.x) if(d0) if(d=0) d += 4*aa*(3-2*t.y); else d += 4*(2*bb*(t.x+1) + aa*(3-2*t.y); t.x+; t.y-; ellipsePlotPoint(temp,t,color); 区域填充一、实验内容本实验程序实现的主要函数及其说明关于绘制图形的算法的函数:void LineFill();/用扫描线算法填充多边形void SideNotFill();/用边取反算法填充多边形void SeedFill(CPoint temp); /用种子填充算法填充区域void LineSeedF

19、ill(CPoint seed); /用扫描线种子填充算法填充区域二、程序设计说明及源代码: 1、多边形填充算法1)、扫描线填充算法用到的数据结构:桶ET和边的活性边表AEL算法的描述如下:for(y=ymin;iNodeCount; memset(pdoc-PolygonNodeJudge,0,100*sizeof(pdoc-PolygonNodeJudge0); moreLeft=pdoc-PolygonNode0.x;/判断第0个点是内点还是外点if(pdoc-PolygonNoden-1.ypdoc-PolygonNode0.y & pdoc-PolygonNode1.yPolygon

20、Node0.y ) |(pdoc-PolygonNoden-1.yPolygonNode0.y & pdoc-PolygonNode1.ypdoc-PolygonNode0.y) pdoc-PolygonNodeJudge0=1; /判断最后一个点是内点还是外点 if(pdoc-PolygonNode0.ypdoc-PolygonNoden-1.y & pdoc-PolygonNoden-2.yPolygonNoden-1.y ) | (pdoc-PolygonNode0.yPolygonNoden-1.y & pdoc-PolygonNoden-2.ypdoc-PolygonNoden-1.

21、y) pdoc-PolygonNodeJudgen-1=1; /对其他点进行判断是内点还是外点 for(i=1;iPolygonNodei-1.ypdoc-PolygonNodei.y & pdoc-PolygonNodei+1.yPolygonNodei.y ) | (pdoc-PolygonNodei-1.yPolygonNodei.y & pdoc-PolygonNodei+1.ypdoc-PolygonNodei.y) pdoc-PolygonNodeJudgei=1; /找出多边形中“最右”的那个点的y值 for(i=1;iNodeCount;i+) if(pdoc-PolygonN

22、odei.x moreLeft) moreLeft=pdoc-PolygonNodei.x; moreLeft=moreLeft+10m_rect.right?m_rect.right:moreLeft+10; if(pdoc-PolygonNode0.y != pdoc-PolygonNodepdoc-NodeCount-1.y)LineDDA2(pdoc-PolygonNodeJudge0,pdoc-PolygonNode0,pdoc-PolygonNodepdoc-NodeCount-1,pdoc-PenColor); for(i=1;iNodeCount;i+) if(pdoc-Pol

23、ygonNodei.y != pdoc-PolygonNodei-1.y)LineDDA2(pdoc-PolygonNodeJudgei,pdoc-PolygonNodei,pdoc-PolygonNodei-1,pdoc-PenColor); 2、区域填充算法1)、扫描线种子填充算法扫描线种子填充算法的基本思想是:从给定的种子开始,填充当前扫描线上种子点所在的区间,然后确定与这一区间相邻的上下两条扫描线上需要填充的区间,从这些区间上各取一个点并依次保存下来,作为下次填充的种子点,反复进行,到填充完这个区间为止。这个算法是参考课本的扫描线种子填充算法,经过补充和修改而成的。核心代码如下:void CLabView:LineSeedFill(CPoint seed) CClientDC dc(this); CLabDoc *pdoc = GetDocument(); CPoint stack1024,t; long slen=0,savex,xright,xleft,flag; unsigned long color=dc.GetPixel(seed);/如果填充的区域的颜色与要填充的颜色一样,则要退出 if(color = pdoc-FillColor) return; stackslen+=seed; /将种子放进栈中 w

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1