计算机图形学-期末课程设计

合集下载

计算机图形课程设计报告

计算机图形课程设计报告

计算机图形学课程设计学院: 信息工程学院专业: 计算机科学与技术学号:姓名:指导老师:时间:目录1、课程设计目的 (2)2、课程设计描述及要求 (2)3、系统开发环境 (2)4、五角星算法原理 (2)5、动态改变五角星的原理 (3)6、核心代码 (3)7、程序运行结果 (3)8、总结 (5)9、参考资料 (5)10、附录 (7)一、设计任务及要求:设计任务:动态绘制一个五角星,并可动态改动五角星的五个角的长度。

要求:此次课程设计的课题为通过编程,五角星的绘制。

并要求可动态改动五角星的五个角的长度,并给出代码和结果截图。

计算机图形学课程设计报告1、课程设计目的本学期系统学习了计算机图形学的概论原理,在学期期末按课程要求进行实验。

通过实验,进一步理解和掌握中点算法、Bresenham算法和二阶差分算法,并掌握以上算法生成圆和直线等图形的基本过程,并正此过程中深化,并提高学生对计算机图形学的了解与运用技巧,同时通过此次课程设计提高动手实践能力与学习分析能力。

2、课程设计描述及要求●画五角星的算法掌握画五角星的原理,设计五角星的算法,相关函数实现画出五角星。

●动态改变五角星通过一定的方法动态改变五角星各个角的大小,使五角星能够达到动态的效果。

3.系统开发环境开发工具:VB 6.0操作系统:Microsoft Windows XP/Windows 20074、五角星的算法原理通过画圆在圆上取5点连接起来既可以得到五角星。

先画个圆,在这个圆上取一点,然后每360/5=72°取一个点,共计5个点,把这5个点连接即可。

5、动态改变五角星的原理最主要是使用Timer控件。

Timer控件可以有规律地间隔一段时间执行一次代码。

Interval 属性是Timer控件最重要的一个属性,它以千分之一秒为单位指定Timer事件之间的间隔,理论上可以认为最少可设置为1毫秒触发一次Timer事件,另外一个重要属性是Enabled属性,它决定计时器是否开始工作。

计算机图形学课程设计

计算机图形学课程设计

计算机图形学课程设计一、课程目标知识目标:1. 让学生掌握计算机图形学的基本概念、基本原理和基本算法,如二维图形的表示、变换、裁剪和三维图形的建模、光照模型等。

2. 使学生了解计算机图形学在实际应用中的发展现状和前景,如虚拟现实、计算机辅助设计等。

3. 帮助学生建立计算机图形学与相关学科(如数学、物理、艺术等)的联系,提高跨学科素养。

技能目标:1. 培养学生运用计算机图形学知识解决实际问题的能力,如使用相关软件进行二维绘图、三维建模等。

2. 提高学生的编程能力,使其能够使用至少一种计算机图形学编程库(如OpenGL、DirectX等)实现基本图形绘制和动画效果。

3. 培养学生的团队协作能力和沟通表达能力,通过小组项目实践,共同完成具有一定难度的计算机图形学任务。

情感态度价值观目标:1. 激发学生对计算机图形学的兴趣,培养其主动探究、创新实践的精神。

2. 培养学生具有良好的审美观,能够从美学的角度评价和优化计算机生成的图形。

3. 强化学生的版权意识,尊重他人知识产权,遵循学术道德,树立正确的价值观。

本课程针对高中年级学生,结合学科特点和教学要求,将目标分解为具体的学习成果,以便于后续的教学设计和评估。

通过本课程的学习,期望学生能够掌握计算机图形学的基础知识,提高实际操作技能,培养良好的情感态度价值观。

二、教学内容1. 计算机图形学基本概念与历史:介绍计算机图形学的定义、发展历程、应用领域及发展趋势。

- 教材章节:第一章 计算机图形学概述- 内容安排:1课时2. 二维图形的表示与处理:讲解二维图形的数学表示、几何变换、裁剪算法等。

- 教材章节:第二章 二维图形处理- 内容安排:4课时3. 三维图形的建模与渲染:介绍三维图形的建模方法、光照模型、纹理映射等。

- 教材章节:第三章 三维图形处理- 内容安排:5课时4. 计算机动画与视觉效果:探讨计算机动画原理、关键帧动画、粒子系统等视觉效果技术。

- 教材章节:第四章 计算机动画与视觉效果- 内容安排:4课时5. 计算机图形学编程实践:学习计算机图形学编程库(如OpenGL、DirectX 等)的基本使用,完成二维和三维图形绘制实例。

111级计算机图形学课程设计

111级计算机图形学课程设计

计算机图形学课程设计报告课题名称 直线和圆中点Bresenham 算法小组成员林珊珊 0701 1307101118 王金韬 0701 1307101123陈文辉 0702 1307101215 周叶青 0702 1307101224院、系、部 数理系专 业 信息与计算科学 指导教师 林杰※※※※※※※※※ ※※ ※※ ※※ ※※※※※※※※※2007级学生计算机图形学课程设计目录1、课程设计目的 (2)2、课程设计描述及要求 (2)3、系统开发环境 (2)4、直线的Bresenham算法原理 (2)4.1中点Bresenham算法 (2)4.2该进的Bresenham算法 (5)5、圆的Bresenham算法原理 (7)6、程序运行结果 (9)7、总结 (11)8、参考资料 (11)9、附录 (11)计算机图形学课程设计报告1.课程设计目的本学期系统学习了计算机图形学的概论原理,在学期期末按课程要求进行实验。

通过实验,进一步理解和掌握中点算法、Bresenham 算法和二阶差分算法, 并掌握以上算法生成圆和直线等图形的基本过程,提高学生对计算机图形学的了解与运用技巧,同时通过此次课程设计提高动手实践能力与学习分析能力。

2.课程设计描述及要求 ●直线中点Bresenham 算法掌握中点Bresenham 算法绘制直线的原理,设计中点Bresenham 算法,编写Mbline()子函数,使用中点Bresenham 算法绘制斜率为0≦k ≦1的直线 ●圆中点Bresenham 算法掌握八分法中点Bresenham 算法绘制圆的原理,设计八分法绘制圆的中点Bresenham 算法,编写八分法绘制圆的CirclePoint(x,y)子函数,编写绘制整圆的Mbcircle()子函数,使用中点Bresenham 算法绘制圆心位于屏幕客户区中心的圆。

此次课程设计的课题为通过编程,实现圆和直线等基本图形的绘制。

计算机图形学的课程设计

计算机图形学的课程设计

计算机图形学课程设计设计题目:画三次Bezier曲线和三次B样条曲线班级:姓名:学号:一、总体目标和要求1 课程设计目的本课程主要内容包括计算机图形学的研究内容、发展与应用,图形输入输出设备,图形显示原理,图形软件标准,基本图形生成算法,图形几何变换与裁剪,自由曲线和曲面,三维实体造型,分形几何造型,分形艺术,隐藏面消除,光照模型,颜色模型,光线跟踪,纹理细节模拟,常用的计算机动画技术和软件等。

通过本课程设计,使自己了解计算机图形学的有关原理、算法及系统,掌握基本图形显示程序设计方法,及二维和三维图形变换程序设计方法,为进一步学习计算机辅助设计方面的技术知识打下基础。

2 目标以图形学算法为目标,深入研究。

续而策划设计实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面做出评价和改进意见。

通过完成一个完整程序,经历策划、设计、开发、总结。

达到:(1)巩固和实践计算机图形学课程中的理论和算法;(2)学习表现计算机图形学算法的技巧;(3)培养认真学习积极探索的精神。

3总体要求策划、设计并实现一个能够充分表现图形学算法的系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。

二、内容与要求1设计题目画三次Bezier曲线和三次B样条曲线。

2设计要求利用计算机图形学原理画出三次Bezier曲线和三次B样条曲线。

三、算法描述(1)画三次Bezier曲线根据Q(t)=∑P i•B• C i n t i(1-t)n-i(∑中的n=3)并且 C i nBEZ 0,3BEZ 1,3(u)=3u(1-u)(1-u)BEZ2,3(u)=3uu(1-u)BEZ3,3(u)=3uuu三次Bezier函数可以写成P(u)=[u3 u2 u 1]×M×[a b c d] 其中M=[ -1 3 -3 1 ]3 -6 -3 0-3 3 0 01 0 0 0i=0(2)画三次B样条曲线Q i,3(t)=∑P i+l F l,3(t)= P i F0,3(t)+ P i+1 F1,3(t)+ P i+2 F2,3(t)+ P i+ 3 F3,3(t)(其中∑中的n=3)因为四个调和函数F0,3(t)、F1,3(t)、F2,3(t)和F3,3(t) 已知(参看公式7-5-3)因此只要给出四个控制点的位置矢量的坐标,当t在[0,1]范围内取离散地取100个点时(dt=0.01),分别求出每一个曲线上点,相邻点用直线段连接起来,就可以得到相应的B样条曲线。

计算机图形学课程设计

计算机图形学课程设计

《计算机图形学》课程设计报告学院:专业:班级:姓名:学号:指导教师:年11 月15 日一、课程设计报告内容说明:1 、直线:1.1 点生成直线利用for 循环,用pDC->SetPixel(int x,int y,RGB(a,b,c))像素函数画出直线。

1.2 DDA :根据直线的微分方程来产生直线,即dy/dx=△y/△x=(12y y -)/(12x x -)=k其中(1x ,1y )、(2x ,2y )是直线的两个端点坐标。

DDA 算法的原理是增量法,即使x 和y 同时以很小的步长增长,每次增长量与x 和y 的一阶导数成正比。

直线的一阶导数是与△x 和△y 成正比的函数。

可以将x 和y 各递增ε△x 和ε△y 来产生线,ε是很小的量。

从当前画线任意点的位置(i x ,i y )上分别递增两个增量ε△x 和ε△y ,就可以得到直线增长的下一个(1+i x ,1+i y )的坐标位置公式如下1+i x =ix +ε△x1+i y =i y +ε△y1.3 金刚石将圆分为20份,利用直线生成的MoveTo 和LineTo 函数,使每个点与其他点相连。

展示图形为:点生成直线、数值微分法画直线、金刚石 2、曲线2.1 直角坐标系:写出参数表达式后,利用MoveTo 和LineTo 函数,连接各点。

如:正弦曲线:参数方程如下 x_SIN=1000*t; y_SIN=1000*sin(t);极坐标系:写出参数表达式后,利用MoveTo 和LineTo 函数,连接各点。

如:四叶图:参数方程如下r_SIYE=5000*sin(2*t); x_SIYE=r_SIYE*cos(t); y_SIYE=r_SIYE*sin(t);2.2 以实际工作中应用较多的参数样条曲线为例:参数样条曲线定义:给定n+1个控制点Pi (i =0,1,2,…,n ),n 次B 样条曲线段的参数表达式为: 。

依次用线段连接控制点Pi (i =0,1,2,…,n )组成的多边形称为B 样条曲线控制多边形。

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

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

课程设计报告书设计名称:计算机图形学课程设计题目:画图程序的实现学生姓名:专业:计算机科学与技术(网络技术)班别:学号:指导老师:绘图小工具此绘图工具可以画直线、椭圆、矩形、曲线,可动态改变画笔的大小,画笔风格有连笔、单笔、填充颜色、实线、虚线1、虚线2,可根据需要选择其中一种,另外,还以根据需要调出颜色板定义颜色。

为了方便选择颜色进行绘图,特意在绘图区增加了颜料盒,操作将更加方便快捷。

1.总体界面如下:1.1“绘图”菜单界面1.2“画笔大小”菜单1.3“风格”菜单1.4“调色板”菜单及颜料盒2.各功能的实现及代码2.1首先在StdAfx.h头文件中定义全局变量extern int num; //记住“绘图”菜单选择extern int num2; //颜色填充选择extern int width; //记住“画笔大小”选择extern int fengge; //“风格”选择(连笔/单笔)extern int col,penstyle; //记住“颜料盒”与“调色板”的选择及画笔风格extern COLORREF c;//各种颜色的选择再在在StdAfx.cpp中初始化以上定义的各变量int num,num2=1,width,col=0,fengge=10,penstyle=0;COLORREF c;2.2.在Draw1View.h中定义CDDraw1View类私有变量POINT points[20];int m_Num;POINT m_pPrev; //画图的前一个终点POINT m_pOrigin; //画图起点POINT m_pPrev2;POINT m_pOrigin2; //记录获取颜料盒颜色时鼠标所在坐标int m_Drag; //鼠标状态HCURSOR m_HCursor;2.3.画图时以按下鼠标左键记住作图起点,为鼠标左键添加消息映射,函数如下:void CDraw1View::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);OnPrepareDC(&dc);dc.DPtoLP(&point);m_pPrev=point; //画图的前一个终点m_pOrigin=point; //点击鼠标左键作为拖动绘图的第一点m_Drag=1; //设置鼠标为拖动状态CView::OnLButtonDown(nFlags, point);}2.4.鼠标左键按下时已将其状态设为拖动状态,当鼠标移动时可以作画,为鼠标移动添加消息映射,函数如下:void CDraw1View::OnMouseMove(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);OnPrepareDC(&dc);dc.DPtoLP(&point);CBrush MyBrush,*OldBrush;if(m_Drag)//鼠标左键按下时已经将状态设为真{CPen NewPen,*pOldPen;if(col= =0) //选择颜料盒颜色c=dc.GetPixel(m_pOrigin2.x,m_pOrigin2.y);NewPen.CreatePen(penstyle,width,c);pOldPen=dc.SelectObject(&NewPen);if(num2= =0) //选择为图像填充颜色时,num2=0.{MyBrush.CreateSolidBrush(c);OldBrush=dc.SelectObject(&MyBrush);}dc.SetROP2(fengge);//风格(单笔:fengge=10/连笔:fengge=9) switch(num) //选择画直线(num=0)、椭圆(num=1)、矩形(num=2)、曲线(num=3) { case 0: dc.MoveTo(m_pOrigin); dc.LineTo(m_pPrev);dc.MoveTo(m_pOrigin); dc.LineTo(point);break;case 1: dc.Ellipse(m_pOrigin.x,m_pOrigin.y,m_pPrev.x,m_pPrev.y);dc.Ellipse(m_pOrigin.x,m_pOrigin.y,point.x,point.y);break;case 2: dc.Rectangle(m_pOrigin.x,m_pOrigin.y,m_pPrev.x,m_pPrev.y);dc.Rectangle(m_pOrigin.x,m_pOrigin.y,point.x,point.y);break;case 3: if(penstyle= =0) //选择画实曲线时(penstyle=0){dc.MoveTo(m_pOrigin);dc.LineTo(point);m_pOrigin=point;}else dc.SetPixel(point.x,point.y,c); //选择画虚曲线}m_pPrev=point; //把新的点设为所作图形的前一个终点dc.SelectObject(pOldPen);}CView::OnMouseMove(nFlags, point);}2.5.当作完画松开鼠标左键时要将鼠标状态设置为非拖动状态以停止作画,为鼠标左键松开添加消息映射,函数如下:void CDraw1View::OnLButtonUp(UINT nFlags, CPoint point){m_Drag=0;//设置为非拖动状态CView::OnLButtonUp(nFlags, point);2.6.当按下鼠标右键时记录此时鼠标的坐标以获取该像素点的颜色,为鼠标右键按下添加消息映射,函数如下:void CDraw1View::OnRButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);dc.DPtoLP(&point);m_pOrigin2=point;//点击鼠标右键获取此时鼠标所在位置的颜色col=0; //col=0时,所选颜色为颜料盒颜色,col=1时为调色板颜色CView::OnRButtonDown(nFlags, point);}2.7.当需要清除所画图形时,双击鼠标右键,为双击鼠标右键添加消息映射,函数如下:void CDraw1View::OnRButtonDblClk(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCDraw1Doc *pDoc=GetDocument();pDoc->UpdateAllViews(NULL);CView::OnRButtonDblClk(nFlags, point);}2.8.颜料盒代码,先画矩形后填充各种不同的颜色,函数如下:void CDraw1View::OnDraw(CDC* pDC){CDraw1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);int j=0;CBrush MyBrush,*OldBrush;MyBrush.CreateSolidBrush(RGB(205,203,203));OldBrush=pDC->SelectObject(&MyBrush);pDC->Rectangle(0,0,200,40);MyBrush.DeleteObject();for(int i=0;i<=160;){ if(j==0){ MyBrush.CreateSolidBrush(RGB(255,0,0));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==10){ MyBrush.CreateSolidBrush(RGB(0,255,0));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==20){ MyBrush.CreateSolidBrush(RGB(53,121,248));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==30){ MyBrush.CreateSolidBrush(RGB(250,0,250));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==40){ MyBrush.CreateSolidBrush(RGB(151,53,227));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==50){ MyBrush.CreateSolidBrush(RGB(223,225,14));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==60){ MyBrush.CreateSolidBrush(RGB(251,242,4));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==70){ MyBrush.CreateSolidBrush(RGB(3,3,3));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==80){ MyBrush.CreateSolidBrush(RGB(250,250,250));OldBrush=pDC->SelectObject(&MyBrush);}pDC->Rectangle(10+i,10,30+i,30);i+=20;j+=10;MyBrush.DeleteObject();}}2.9.修改画笔大小时,函数如下:void CPenWidth::OnOK(){UpdateData();CPenWidth penwidth; // CPenWidth为对话框类width=m_penwidth;CDialog::OnOK();}3.效果展示:。

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

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

计算机图形学课程设计报告组号:第七组小组成员:宋洁邵海军谷文海冯新科学院:资源环境学院专业班级:地科14 - 2指导老师:向中林2016.12.18目录1实习目的ﻩ12 课程设计题目ﻩ12.1题目要求及内容ﻩ12.1.1要求ﻩ错误!未定义书签。

2.1.2 内容分析.......................................................... 22.2实习原理ﻩ22.2.1 人机交互ﻩ22.2.2动画ﻩ52.2.3 几何变换 (5)2.2.3.1 二维几何图形变换............................. 错误!未定义书签。

2.2.3.2 三维几何图形变换:ﻩ63 主要流程图ﻩ83.1三维图形处理流程图ﻩ83.2 二维几何画板流程图ﻩ94主要源程序 (9)4.1主要源程序ﻩ94.2.1 键盘事件函数....................................... 错误!未定义书签。

4.2.2 菜单.......................................................... 124.2.2.1 创建菜单函数ﻩ124.2.2.2 光照函数 (14)4.2.2.3 几何变换事件ﻩ16164.2.2.3.1 旋转事件ﻩ4.2.2.3.2移动事件 (17)4.2.2.3.3放大事件............................................ 184.2.2.3.4缩小事件............................... 错误!未定义书签。

5问题讨论ﻩ191实习目的课程设计是信息与计算科学专业集中实践性环节之一,是学习完《计算机图形学》课程后进行的一次全面的综合练习。

其目的是:(1)要达到理论与实际应用相结合,使学生能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养良好的程序设计技能。

计算机图形学课程设计报告简单图形的绘制

计算机图形学课程设计报告简单图形的绘制

《计算机图形学》课程设计报告学生:学号:学院:班级:题目: 简单图形的绘制职称2015年7月1日目录目录 (I)一、选题背景 (1)二、算法设计 (2)2.1 绘制直线、圆、椭圆、抛物线 (2)2.1.1 绘制直线 (2)2.1.2 绘制圆 (2)2.1.3 绘制椭圆 (2)2.1.4 绘制抛物线 (2)2.2 三维几何变换 (2)三、程序及功能说明 (5)3.1 绘制直线、圆、椭圆、抛物线 (5)3.1.1 绘制直线 (5)3.1.2 绘制圆 (5)3.1.3 绘制椭圆 (6)3.1.4 绘制抛物线 (6)3.2 图形的平移 (6)3.3 图形的旋转 (7)3.4 图形的缩放 (7)四、结果分析 (8)4.1 绘制直线、圆、椭圆、抛物线 (8)4.1.1 直线 (8)4.1.2 圆 (8)4.1.3 椭圆 (9)4.1.4 抛物线 (9)4.2 图形的平移 (9)4.3 图形的旋转 (10)4.4 图形的缩放 (12)五、总结 (11)六、课程设计心得体会 (15)参考文献 (16)源程序 (17)一、选题背景二、算法设计2.1 绘制直线、圆、椭圆、抛物线2.1.1 绘制直线通过两个点的坐标来绘制直线。

计算机图形学中二维图形在显示输出之前需要扫描转换,生成直线的算法一般有DDA 算法和中点算法。

2.1.2 绘制圆通过运用圆的参数方程cos ;sin x a r y b r θθ=+=+来绘制圆的图形,其中[0,2]θπ∈,(a,b )为圆心,r 为半径,运用参数方程,只需要确定半径的长度和圆心的位置,即可绘制出圆。

2.1.3 绘制椭圆通过运用椭圆的参数方程cos ;sin x a y b θθ==来绘制椭圆的图形,其中[0,2]θπ∈,是已知的变量,a ,b 分别为长半轴,短半轴,当确定a 和b 后,通过参数方程即可得到这个椭圆的方程。

2.1.4 绘制抛物线根据点绘制抛物线图像是通过拟合完成,根据三个点的坐标,通过数据拟合,得到经过这三个点的函数关系式,从而再根据这个函数关系式绘制出抛物线上其他的点,形成一条连续的抛物线;或直接根据已知函数绘制图像是通过已知函数画出图像。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图形学课程设计报告题目:系别:班级:学号:姓名:指导老师:目录诚信说明......................................................................................................... 错误!未定义书签。

目录 .. (1)一、项目描述 (2)1.1项目的目的 (2)二、项目需求 (2)2.1需求分析 (2)2.2功能描述 (2)三、项目设计 (3)3.1直线扫描算法 (3)3.1.1 DAA扫描线算法 (3)3.1.2 中点扫描线算法 (3)3.1.3 Bresenham扫描线算法 (3)3.2圆的扫描算法 (4)3.2.1 中点画圆扫描算法 (4)3.2.2 Bresenham画圆扫描算法 (4)3.3种子填充算法 (4)3.4图形的基本几何变换算法 (4)3.4.1平移 (4)3.4.2旋转 (5)3.4.3伸缩 (5)3.5 Bezier曲线算法 (5)四、项目效果 (5)五、项目总结 (10)六、参考文献 (11)七、附录 (11)一、项目描述1.1项目的目的通过本次课程设计,使自己了解计算机图形学的有关原理、算法及系统,掌握基本图形显示程序设计方法,及二维和三维图形基本几何变换程序设计方法,为进一步学习计算机辅助设计方面的技术知识打下基础。

1.掌握图形学直线扫描算法:DDA,中点扫描线算法,Bresenham扫描线算法2.掌握图形学画圆扫描算法:中点画圆算法和Bresenham扫描算法3.掌握简单的几何图形的填充算法:种子填充和扫描线填充算法4.掌握简单图形的基本几何变换:平移,旋转和伸缩5.掌握Bezier曲线的生成算法6.熟悉并掌握vc6.0中的MFC使用方法7.掌握C/C++语言编程方法8.在学习基础上设计一个基于MFC的画图软件1.2项目内容在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的画图设计工具也越来越多,类似CAD和CDM及Photoshop的画图软件和图片处理软件的发展也日新月异,因此产生了制作一个类似的画图软件;而且通过制作该程序还能更好的学习图形学编程知识。

通过一个学期的学习,对于图形学的知识也有了些了解!为了更好的巩固和运用所学的知识,希望通过设计一个基于MFC的画图软件,达到自己想要的结果!二、项目需求2.1需求分析随着计算机科学技术的发展,近30年来,计算机图形学得到迅猛发展,人们可以通过计算机高速,有效,真实的生成图形,计算机图形学作为利用计算机生成图形的技术,已经越来越广泛地在各个领域得到了应用。

计算机图形学应用水平的提高和应用领域的拓宽,使得人们越来越重视对计算机图形学的研究和利用。

因此,通过一个学期有关图形学课程的学习之后,为了巩固所学的知识,将所学的知识运用到实践中,我决定设计一个小型画图软件,可以实现简单的画图功能和图片存储,编辑功能。

2.2功能描述通过一个学期图形学课程的学习,基于所学的知识,我设计了一个简单的画图软件,该软件主要具备以下几个功能:1、画图功能:点击画图菜单,可以选择画直线,画圆,或者填充;也可以通过菜单下面的快捷键直接实现以上功能。

2、选择算法的功能:由于课本上介绍的算法比较多,经过总结分类之后,我添加了一个算法选择的功能,可以通过单击算法,选择画图时采用不同的算法来实现相同的画图操作。

3、画图方式:考虑到交互功能,我设计了画图方式的功能,用户可以选择鼠标画图或者对话框画图,都能达到做要求的目的。

4、图像变换:基于所学的基本几何变换,我设计和该图像变换功能,可以实现图形的平移,旋转和伸缩等操作。

三、项目设计3.1直线扫描算法3.1.1 DAA扫描线算法直线DDA算法就是取直线起点(x0,y0)作为初始坐标,x每递增1,通过公式:yi+1=yi+kdx 计算出y轴坐标。

直线DDA算法也称数值微分算法。

直线DDA算法的本质,是用数值方法解微积分方程,通过同时对X,y各增加一个小增量,计算出下一步的x,y的值,以此确定该点的位置及属性。

最后画出直线。

3.1.2 中点扫描线算法假设x轴坐标为xi的与直线最近的像素已经决定为P(xi,yi),则下一个与直线最接近的像素只能是正右方的P1(xi+1,yi)或右下方的P2(xi+1,yi+1).以M(xi+1,yi+0.5)表示p1与p2的中点,用Q表示该直线与x=xi+1直线的交点。

当M在Q的下方,取P2为下一个直线上的点;当M在Q的上方,取P1为下一个直线上的点。

这是中点画线算法的基本思想。

中点画线算法得实现,关键是判断M和Q的位置关系。

直线方程采用隐式方程表示为F (x,y)=ax+by+c=0,将M坐标带入方程,判断di=F(Mi)=F(xi+1,yi+0.5)的大小。

当di>0时,则下一像素的判别式为d i+1=F(xi+2,yi+0.5)=di+a;当di<0时,则下一像素的判别式为d i+1=F(xi+2,yi+1.5)=di+a+b。

d0=F(x0+1,y0+0.5)=a+0.5b。

其中,a=y0-y1,b=x1-x0,c=x0y1-x1y0.3.1.3 Bresenham扫描线算法假设已经确定的像素为P(xi,yi),那么下一个可选择的像素点为P1(x i+1,y i)和P2(x i+1,y i+1)中的一个。

用Q表示该直线与x=xi+1直线的交点,Q点到P1(x i+1,y i)和P2(x i+1,y i+1)的距离分别为a1,a2,则有a1-a2=2k(xi+1)-2yi+2b-1.当a1>a2,下一像素点应取P2;当a1<a2,下一像素点应取P1;当a1=a2,可取两个像素点中的任意一个。

为了简化a1-a2,利用新变量di=Δx(a1-a2)=2Δy*xi-2Δx*y i+1+C,其中,C为后面的常量。

d i+1=2Δy*x i+1-2Δx*y i+1+C.故d i+1-di=2Δy-2Δx(y i+1-y i).当di>=0时,d i+1=di+(2Δy-2Δx),当di<0时,d i+1=di+2Δy。

d0=2Δy-Δx。

3.2圆的扫描算法3.2.1 中点画圆扫描算法中点画圆算法从点(0,R)至(R/2, R/2)的1/8圆周顺时针的确定最佳逼近与圆弧的像素序列。

假设已经确定的像素为P(xi,yi),那么下一个可选择的像素点为P1(xi+1,yi)和P2(xi+1,yi-1)中的一个。

构造原函数为F(x,y)=x2+y2-R2对于圆上的点(x,y),有F(x,y)=0;对于圆外的点(x,y),有F(x,y)>0;对于圆内得点(x,y),有F(x,y)<0.构造判别式di=F(Mi)=(xi+1)2+(yi-0.5)2-R2.若di<0,则取P1,下一个像素的判别式为d i+1=F(xi+2,yi—0.5)=di+2xi+3;若di>=0, 取P2,下一个像素的判别式为d i+1=F(xi+2,yi—1.5)=di+2(xi-yi)+5.d0=1.25-R。

用ei=di-0.25代替di,若ei>=0,取P1为下一像素,e的增量为2xi+3;若ei<0,取P2为下一像素,e的增量为2xi-2yi+5.3.2.2 Bresenham画圆扫描算法假设已经确定的像素为P(xi,yi),那么下一个可选择的像素点为Hi(x i+1,y i)和Di(x i+1,y i-1)中的一个。

分别计算这两点到圆周的距离,即|Б(Hi)|=|(xi+1)2+yi2-R2|,|Б(Di)|=|(xi+1)2+(yi-1)2-R2.引判别式di=Б(Hi)+Б(Di)=[(xi+1)2+yi2]-R2+[(xi+1)2+(yi-1)2]-R2.如果di<0,取Hi,则下一点(xi+1,yi)的判别式为di+1=Б(Hi+1)+Б(Di+1)=d+4xi+6;如果di>0,取Di,则下一点为(xi+1,yi-1)的判别式为di+1=Б(Hi+1)+Б(Di+1)=d+4(xi-yi)+10.初值d0=Б(H0)+Б(D0)=3-2R。

3.3种子填充算法种子填充算法可以采用递归算法。

递归的基本方法是设种子像素为(x,y)是四向连通区域内的一点,old_color为区域内的原有像素颜色,new_color是要填充的颜色,递归填充的过程是如果种子像素是区域内的原有颜色old_color,说明该种子像素在区域内,则像素置为被填充颜色new_color,同时将种子像素的上、下、左、右像素当作种子递归调用填充递归算法;否则说明该像素已被填充,不再处理。

3.4图形的基本几何变换算法3.4.1平移平移变换是将对象从一个位置(x,y)移到另一个位置(x1,y1)的变换。

tx,ty称为平移距离,tx=x1-1,ty=y1-y 。

得到平移变换公式:x1=x+tx ;y1=y+ty 。

3.4.2旋转旋转变换是以某个参考点为圆心,将对象上的各点(x ,y )围绕圆心转动一个逆时针角度θ,变为新的坐标(x1,y1)的变换,当参考点为(0,0)时,旋转变换的公式为: X1=x*cos θ-y*sin аY1=y*cos θ+x*sin а3.4.3伸缩比例变换是使对象按比例因子(sx ,sy )放大或缩小的变换。

X1=x*sx ,y1=y*sy 。

当(sx ,sy )取特定值时,比例变换可看作是将图形按x 轴或者y 轴或者原点对称。

3.5 Bezier 曲线算法Bezier 曲线是由多项式混合函数推导出来的,对于给定空间n+1个点的位置向量Pk(k=0,1,2…,n)可定义一个n 次Bezier 参数曲线,其各点坐标的插值公式是P(t)=∑=nk t n PkBENk 0)(, [0,1]Эt其中,Pk 构成该曲线的特征多边形,BENk,n(t)是n 次Bernstein 基函数。

四、项目效果画图软件主界面包括菜单栏和快捷键两部分:菜单栏主要有文件,画图,算法,画图方式和图形变换几个功能。

在文件中可以实现新建,打开,保存和另存为图片的功能。

画图中可以选择所需要的实现的图形,比如直线,圆以及填充和曲线等。

对应于画图中不同的图形,用户还可以选择不同的画图算法。

为了增强交互功能和多样性,我们还结合了不同的画图方式,常用的是鼠标画图和坐标画图。

选择坐标画图时会有对应的对话框弹出,提示用户输入相应的数据。

在图形变换中,用户可以选择图形平移和旋转。

快捷键主要包括画直线,画圆和填充以及颜色的选取的功能。

主要方便用户实现画图的功能。

主要界面如下(1)画线:坐标输入画线鼠标拖动画线(2)画圆(3)填充(4)Bezier曲线(5)几何变换平移旋转五、项目总结这学期刚开始的时候,由于课程比较少,所以空闲的时间很多。

相关文档
最新文档