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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

计算机图形学课程设计报告.docx

1、计算机图形学课程设计报告计算机图形学课程设计报告题 目:用画笔交互绘制任意封闭区域,并可选不同的颜色填充姓 名: 学 号: 班 级: 专 业: 计算机科学与技术 指导教师: 完成时间: 2014年6月8日目 录系统功能设计: 3详细设计: 3关键代码: 4 中点画圆法: 4 绘制多边形: 5 扫描线种子填充代码: 5清屏代码: 9实验结果: 9画笔、RGB值均为零: 9画笔宽度设置为2且RGB值不同: 10遇到问题与解决方法: 11总结与展望: 11系统功能设计: 用画笔交互绘制任意封闭区域,由于圆和多边形的画法不同,所以需要制定两个按钮用来画圆和多边形,再添加一个按钮来实现填充功能。为比较扫

2、描线种子填充和扫描线填充的差异,本次课程设计用种子算法填充圆形,用扫描线填充任意多边形,要求实现可选不同颜色填充,则需要用四个编辑框,三个编辑框来控制RGB的值,另外一个控制画笔宽度,从而调用用户输入的画笔宽度值及RGB值实现交互控制画笔宽度和封闭区域颜色的填充。详细设计: 创建单文本对话框,编辑菜单栏“图形学”,创建子菜单“课程设计”,选中“课程设计”创建对话框,添加按钮,编辑框,静态文本后修改属性,进入编辑界面。 添加类向导,OnLButtonDown和OnLButtonup,通过OnLButtonDown函数获取鼠标按下时的X坐标和Y坐标,并把坐标赋值给数组x,y,通过OnLButton

3、Up函数获取鼠标弹起是的坐标赋值给xe,ye,为画圆和画多边形的做准备。 双击画圆按钮,用中点画圆算法编写相关画圆代码。用中点画圆法通过比较两点间d的值来取相近点,然后用打点的方法连接所有点,具体参考书上代码 双击多边形按钮,用画线连接编写相关画多边形代码。用数组存储获取的鼠标点的坐标,然后点以一个变量,比较鼠标点的最大最小值,从而确定边界,然后确定扫描线算法动态链接各个点。 双击填充按钮,用扫描线种子填充算法编写填充代码。在获取鼠标点之后,获取存储在数组中的数据,然后以该点为圆心和种子节点,用种子填充算法开始进行相关进站出站操作,然后对相关像素点进行染色,从而实现圆的颜色填充。多边形的填充是

4、通过调用windows中的画笔,在多边形的各个边都确定了以后,对原像素进行画笔像素覆盖,而实现各种颜色的填充。双击清屏按钮,用清除函数实现清屏功能。对于数组中的值以及鼠标点击后的赋予变量的值都进行重新赋值为零的操作,实现已实现的数据代码置零操作。 RGB的文本框用UpdataData(true)实现。对于各个文本框进行变量绑定,在程序中通过调用绑定的各个文本框变量实现文本框RGB值的更新,实现颜色的变换操作。关键代码: 中点画圆法: void Cyuan:OnButton1() / TODO: Add your control notification handler code here CD

5、C*pDC=GetDC(); int x0=xs; int y0=ys; int r=(int)sqrt(xs-xe)*(xs-xe)+(ys-ye)*(ys-ye); int f,b,d,x,y; d=1-r;x=0;y=r; /r为圆的半径 while(y=x) for(f=-m;f=m;f+) for(b=-m;bSetPixel (x0,y0,RGB(w,n,s); pDC-SetPixel (x+x0+f,y+y0+b,RGB(w,n,s); /(x0,y0)为圆心坐标 pDC-SetPixel (-x+x0+f,y+y0+b,RGB(w,n,s); pDC-SetPixel (-x

6、+x0+f,-y+y0+b,RGB(w,n,s); pDC-SetPixel (x+x0+f,-y+y0+b,RGB(w,n,s); pDC-SetPixel (y+x0+f,x+y0+b,RGB(w,n,s); pDC-SetPixel (-y+x0+f,x+y0+b,RGB(w,n,s); pDC-SetPixel (-y+x0+f,-x+y0+b,RGB(w,n,s); pDC-SetPixel (y+x0+f,-x+y0+b,RGB(w,n,s); x=x+1; if(d0) d=d+2*x+3; else d=d+2*(x-y)+5,y-; 绘制多边形: void Cyuan:OnB

7、utton3() CDC *pDC=GetDC(); CClientDC dc(this); CPen *pOldpen; CPen pen; pen.CreatePen(PS_SOLID,m,RGB(w,n,s); pOldpen=pDC-SelectObject(&pen); SelectObject(*pDC,pen); xa=x0; ya=y0; pDC-MoveTo (x0,y0); for (int i=0;iLineTo(xi,yi); DeleteObject(pen); CDialog:OnLButtonUp(nFlags, point); 扫描线种子填充代码:void Cy

8、uan:OnButton4() CDC*pDC=GetDC(); int x0=xs; int y0=ys; long top=0; int flag,xn; push(xs,ys,top); while(top0) pop(xs,ys,top); int x0=xs; int y0=ys; pDC-SetPixel(x0,y0,RGB(w,n,s); while(pDC-GetPixel(x0+1,y0)!=RGB(0,0,0) & pDC-GetPixel(x0+1,y0)!=RGB(w,n,s) pDC-SetPixel(x0+1,y0,RGB(w,n,s); x0+; int xr=x

9、0-1; x0=xs,y0=ys; /记录右边界,准备向种子像素的左边填充 while(pDC-GetPixel(x0-1,y0)!=RGB(0,0,0) & pDC-GetPixel(x0-1,y0)!=RGB(w,n,s) pDC-SetPixel(x0-1,y0,RGB(w,n,s); x0-; int xl=x0+1; x0=xl,y0=ys+1; while(x0GetPixel(x0,y0)!=RGB(0,0,0) & pDC-GetPixel(x0,y0)!=RGB(w,n,s) & x0GetPixel(x0,y0)!=RGB(0,0,0) & pDC-GetPixel(x0,

10、y0)!=RGB(w,n,s) push(x0,y0,top); else push(x0-1,y0,top); flag=0; int xn=x0; while(pDC-GetPixel(x0,y0)!=RGB(0,0,0) & pDC-GetPixel(x0,y0)!=RGB(w,n,s) & x0=xr ) x0+; if(xn=x0) x0+; x0=xl;y0=ys-1; /准备向相邻下一行寻找新的种子像素坐标入栈 while(x0GetPixel(x0,y0)!=RGB(0,0,0) & pDC-GetPixel(x0,y0)!=RGB(w,n,s) & x0GetPixel(x0

11、,y0)!=RGB(0,0,0) & pDC-GetPixel(x0,y0)!=RGB(w,n,s) push(x0,y0,top); else push(x0-1,y0,top); flag=0; xn=x0; while(pDC-GetPixel(x0,y0)!=RGB(0,0,0) & pDC-GetPixel(x0,y0)!=RGB(w,n,s) & x0SelectObject(&pen); SelectObject(*pDC,pen); int xd100,yd100; int t,i,h,k; int xmin,xmax; xmin=x0,xmax=x0; for(i=1;ia;

12、i+) if(xixmax) xmax=xi; for(h=xmin;h=xmax;h+) k=0; for(i=0;i=a-1;i+)/求交点 if(xi+1!=xi) if(h+0.5-xi)*(h+0.5-xi+1)0) ydk=yi+(yi+1-yi)*(h-xi)/(xi+1-xi); xdi=h; k+; /交点排序 for(i=0;ik-1;i+) m=i; for(int j=i+1;j=k-1;j+) if(ydjydm) m=j; if(m!=j) t=ydi; ydi=ydm; ydm=t; for(i=0;iMoveTo(h,ydi); pDC-LineTo(h,ydi

13、+1); DeleteObject(pen);清屏代码: void Cyuan:OnButton2() Invalidate(); xs=0; ys=0; xe=0; ye=0; a=0; for(int i=0;ia;i+) xi=0; yi=0; 实验结果:画笔、RGB值均为零:填充前: 填充后: 画笔宽度设置为2且RGB值不同:填充前:填充后:遇到问题与解决方法: 问题1:按下清屏按钮再重新画多边形的时候,清屏前多边形的原坐标仍然保存在数组里。 解决方法:由于之前存放的顶点还在,必须把坐标顶点的值赋值为零即可。 问题2:在进行圆的种子填充的时候,代码输入失误导致画完圆填充的时候只能填充半

14、个圆。解决办法:在老师的帮助下终于找到了错误点,通过改正之后程序正确进行,颜色正确填充。问题3:在进行多边形填充进行画笔调用的时候,提示pDC、pen没有定义之类的错误,解决办法:通过观察,是由于CDC*pDC=GETDC()代码运行执行次序问题,而提示pen没有定义是因为粗心少写了一行代码。总结与展望: 总结:通过自己的努力,虽然还不是很完美,但是做出了开始预期的效果挺有成就感的,实现了动态画多边形,画圆并选择颜色进行填充的这些功能。在画圆和多边形的时候实现了种子填充和扫描线调用画笔填充,通过自己动手明白了两者之间的相同和不同之处。展望:通过这次课程设计了解了很多关于图形学的知识。同时对于编程中遇到的问题也熟悉了相关的解决办法,从中锻炼了自己的动手做实验的能力,但同时也让自己看清了自己的水平,在以后的生活里会多加强有关这方面的学习,从而提升自己在图形学方面的知识水平。

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

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