计算机图形学课程设计报告
计算机图形学课程设计报告——范文
《计算机图形学》课程设计报告题目名称:专业班级学号姓名指导教师年月日Solar System(太阳系)软件工程专业学生王洋指导老师李征[摘要]太阳系(Solar System)是以太阳为中心,和所有受到太阳重力约束的天体的集合体,主要包括太阳,八大行星,以及卫星.此课题模拟太阳系围绕太阳运转的模型,以太阳,八大行星和月球形成大致的体系结构,以VC6.0为平台用OpenGL基础知识实现从不同角度观测太阳系.关键词:OpenGL VC6.0 太阳系运转角度一、实验名称:Solar System(太阳系)二、实验的目的和要求:1.熟悉OpenGL基础函数2.通过程序模拟太阳系运行3.实现改变视角观测太阳系三、实验的环境:1.硬件环境:CPU Intel Pentium D ,1G内存2.软件环境:操作系统:Windows xp SP2编译软件及版本:vc6.0 OpenGL环境四、系统描述1.太阳太阳是恒星,能够自转,体积是太阳系中最大的,能够发光,处于太阳系中心位置.2.八大行星八大行星按与太阳距离从近到远分别为:水星,金星,地球,火星,木星,土星,天王星,海王星,各有各的大小,其中以木星最大,以各自不同的公转速度绕太阳运行,并自转.3.月球月球是围绕地球旋转的卫星.体积是系统中最小的,旋转周期比较快。
五. 理论基础:用windows api创建窗口,使用OpenGL绘制函数绘制球体,实现位图文件读取,并转换为纹理,使用系统时间控制球体转动,设置视点视角,通过改变视角从不同角度观测.所使用的计算机图形学理论基础:1.3D管道中的几何变换旋转矩阵行向量为该矩阵坐标系在原坐标系上的坐标,列向量为原坐标系的向量在本旋转矩阵坐标系上的坐标。
旋转是欧氏变换;旋转、放缩是线性变换;旋转、放缩、平移是仿射变换;旋转、放缩、平移、透视投影是射影变换。
线性变换在四维空间,仿射变换在三维空间,射影必须采用摄像坐标系,仿射变换是到自身的一类变换.齐次坐标系就是将一个原本是n维的向量用一个n+1维向量来表示。
计算机图形课程设计报告
计算机图形学课程设计学院: 信息工程学院专业: 计算机科学与技术学号:姓名:指导老师:时间:目录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属性,它决定计时器是否开始工作。
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 算法绘制圆心位于屏幕客户区中心的圆。
此次课程设计的课题为通过编程,实现圆和直线等基本图形的绘制。
计算机图形学课程设计
《计算机图形学》课程设计报告学院:专业:班级:姓名:学号:指导教师:年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 样条曲线控制多边形。
计算机图形学课程设计实验报告
计算机图形学课程设计实验报告SHANDONG. UNIVERsrrr OF SCIENCE ^ND TECHNOLOGY《计算机图形学》实验报告班级计算机科学与技术姓名学号实验一基本图形生成算法一、实验目的:1、掌握中点Bresenham 绘制直线的原理;2、设计中点Bresenham 算法;3、掌握八分法中点Bresenham 算法绘制圆的原理;4、设计八分法绘制圆的中点Bresenham 算法;5 、掌握绘制1/4 椭圆弧的上半部分和下半部分的中点Bresenham 算法原理;6、掌握下半部分椭圆偏差判别式的初始值计算方法;7、设计顺时针四分法绘制椭圆的中点Bresenham 算法。
二、实验过程:1、实验描述实验1:使用中点Bresenham 算法绘制斜率为0<=k<=1 的直线。
实验2:使用中点Bresenham 算法绘制圆心位于屏幕客户区中心的圆。
实验3:使用中点Bresenham 算法绘制圆心位于屏幕客户区中心的椭圆。
2、实验过程1)用MFC(exe建立一个单文档工程;2)编写对话框,生成相应对象,设置相应变量;3)在类CLineView 中声明相应函数,并在相关的cpp 文件中实现;4) 在OnDraw ()函数里调用函数实现绘制直线、圆、椭圆;5) 运行程序,输入相应值,绘制出图形。
三、源代码实验1:直线中点Bresenham 算法1.// cline.cpp : implementation file// cline dialog cline::cline(CWnd* pParent /*=NULL*/): CDialog(cline::IDD, pParent){//{{AFX_DATA_INIT(cline) m_x0 = 0;m_y0 = 0;m_x1 = 0;m_y1 = 0; //}}AFX_DATA_INIT}void cline::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(cline)DDX_Text(pDX, IDC_x0, m_x0); DDX_Text(pDX, IDC_y0, m_y0);DDX_Text(pDX, IDC_x1, m_x1); DDX_Text(pDX, IDC_y1, m_y1);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(cline, CDialog)//{{AFX_MSG_MAP(cline) //}}AFX_MSG_MAPEND_MESSAGE_MAP()2、// LineView.hclass CLineView : public CView{public:CLineDoc* GetDocument();。
计算机图形学课程设计
《计算机图形学》课程设计报告题目名称:球体背面剔除消隐算法专业计算机科学与技术班级计科15升-1班学号 1516353004姓名指导教师王玉琨2016 年 06 月 07 日目录设计内容与要求 (03)总体目标和要求 (03)内容与要求 (03)总体设计 (03)2.1 球的消隐处理基本原理 (03)2.2 具体设计实现 (04)详细设计 (04)3.1调试后正确的程序清单 (04)功能实现 (08)4.1程序运行结果 (09)4.2 功能实现及分析 (09)总结 (09)参考文献 (10)球体背面剔除消隐算法第 1章设计内容与要求1.1 总体目标和要求课程设计的目的:以图形学算法为目标,深入研究。
继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。
通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到:1) 巩固和实践计算机图形学课程中的理论和算法;2) 学习表现计算机图形学算法的技巧;3) 培养认真学习、积极探索的精神;4) 具备通过具体的平台实现图形算法的设计、编程与调试的能力;5) 完成对实验结果分析、总结及撰写技术报告的能力。
总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。
开发环境:Viusal C++ 6.01.2 内容与要求球体背面剔除消隐算法内容:(1)掌握背面剔除消隐算法原理;(2)实现矢量点积与叉积运算;(3)透视投影变换(4)曲面体经纬线划分方法功能要求:(1)绘制球体线框模型的透视投影图,使用背面剔除算法实现动态消隐;(2)通过右键菜单显示消隐效果,右键菜单有两个选项:未消隐与消隐;(3)使用键盘的上下左右控制键旋转消隐前后的球体;(4)单击左键增加视距,右击缩短视距;第2章总体设计2.1 球的消隐处理基本原理球体的曲面通常采用一组网格多边形来表示,即把曲面离散成许多小平面片,用平面逼近曲面,一般使用许多四边形来逼近曲面。
计算机图形学课程设计实验报告
《计算机图形学》实验报告班级计算机科学与技术姓名学号2014 年6 月2 日实验一基本图形生成算法一、实验目的:1、掌握中点Bresenham绘制直线的原理;2、设计中点Bresenham算法;3、掌握八分法中点Bresenham算法绘制圆的原理;4、设计八分法绘制圆的中点Bresenham算法;5、掌握绘制1/4椭圆弧的上半部分和下半部分的中点Bresenham算法原理;6、掌握下半部分椭圆偏差判别式的初始值计算方法;7、设计顺时针四分法绘制椭圆的中点Bresenham算法。
二、实验过程:1、实验描述实验1:使用中点Bresenham算法绘制斜率为0<=k<=1的直线。
实验2:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的圆。
实验3:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的椭圆。
2、实验过程1)用MFC(exe)建立一个单文档工程;2)编写对话框,生成相应对象,设置相应变量;3)在类CLineView中声明相应函数,并在相关的cpp文件中实现;4)在OnDraw()函数里调用函数实现绘制直线、圆、椭圆;5)运行程序,输入相应值,绘制出图形。
三、源代码实验1:直线中点Bresenham算法1.// cline.cpp : implementation file// cline dialogcline::cline(CWnd* pParent /*=NULL*/): CDialog(cline::IDD, pParent){//{{AFX_DATA_INIT(cline)m_x0 = 0;m_y0 = 0;m_x1 = 0;m_y1 = 0;//}}AFX_DATA_INIT}void cline::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(cline)DDX_Text(pDX, IDC_x0, m_x0);DDX_Text(pDX, IDC_y0, m_y0);DDX_Text(pDX, IDC_x1, m_x1);DDX_Text(pDX, IDC_y1, m_y1);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(cline, CDialog)//{{AFX_MSG_MAP(cline)//}}AFX_MSG_MAPEND_MESSAGE_MAP()2、// LineView.hclass CLineView : public CView{public:CLineDoc* GetDocument();..........void Mbline(double,double,double,double); //直线中点Bresenham函数.......}3、// Line.cpp//*******************直线中点Bresenham函数*********************/void CLineView::Mbline(double x0, double y0, double x1, double y1) {CClientDC dc(this);COLORREF rgb=RGB(0,0,255); //定义直线颜色为蓝色double x,y,d,k;x=x0; y=y0; k=(y1-y0)/(x1-x0); d=0.5-k;for(x=x0;x<=x1;x++){dc.SetPixel((int)x,(int)y,rgb);if(d<0){y++;d+=1-k;}elsed-=k;}}4、//LineView.cppvoid CLineView::OnDraw(CDC* pDC){CLineDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data herecline a;a.DoModal();//初始化CLineView::Mbline(a.m_x0,a.m_y0,a.m_x1,a.m_y1); }实验2:圆中点Bresenham算法1、//cricle.cpp// Ccricle dialogCcricle::Ccricle(CWnd* pParent /*=NULL*/): CDialog(Ccricle::IDD, pParent){//{{AFX_DATA_INIT(Ccricle)m_r = 0;//}}AFX_DATA_INIT}void Ccricle::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Ccricle)DDX_Text(pDX, r_EDIT, m_r);//}}AFX_DATA_MAP}2、//CcircleView.hclass CCcircleView : public CView{.......public:CCcircleDoc* GetDocument();void CirclePoint(double,double); //八分法画圆函数void Mbcircle(double); //圆中点Bresenham函数........}3、//CcircleView.cppvoid CCcircleView::OnDraw(CDC* pDC){CCcircleDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCcricle r;r.DoModal();CCcircleView::Mbcircle(r.m_r);//画圆}4、//CcircleView.cpp//*******************八分法画圆*************************************/ void CCcircleView::CirclePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);dc.SetPixel((int)(300+y),(int)(300+x),rgb);dc.SetPixel((int)(300-y),(int)(300+x),rgb);dc.SetPixel((int)(300+y),(int)(300-x),rgb);dc.SetPixel((int)(300-y),(int)(300-x),rgb);}//**************************圆中点Bresenham函数*********************/ void CCcircleView::Mbcircle(double r){double x,y,d;COLORREF rgb=RGB(0,0,255);d=1.25-r;x=0;y=r;for(x=0;x<y;x++){CirclePoint(x,y); //调用八分法画圆子函数if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}}}实验3:椭圆中点Bresenham算法1、//ellipse1.cpp// Cellipse dialogCellipse::Cellipse(CWnd* pParent /*=NULL*/) : CDialog(Cellipse::IDD, pParent){//{{AFX_DATA_INIT(Cellipse)m_a = 0;m_b = 0;//}}AFX_DATA_INIT}void Cellipse::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Cellipse)DDX_Text(pDX, IDC_EDIT1, m_a);DDX_Text(pDX, IDC_EDIT2, m_b);//}}AFX_DATA_MAP}2、//EllipseView.hclass CEllipseView : public CView{......................public:CEllipseDoc* GetDocument();void EllipsePoint(double,double); //四分法画椭圆void Mbellipse(double a, double b); //椭圆中点Bresenham函数..................}3、//Ellipse.cpp//*****************四分法画椭圆********************************/void CEllipseView::EllipsePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);}//************************椭圆中点Bresenham函数*********************/ void CEllipseView::Mbellipse(double a, double b){double x,y,d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);EllipsePoint(x,y);while(b*b*(x+1)<a*a*(y-0.5))//椭圆AC弧段{if(d1<0)d1+=b*b*(2*x+3);else{d1+=b*b*(2*x+3)+a*a*(-2*y+2);y--;}x++;EllipsePoint(x,y);}d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;//椭圆CB弧段while(y>0){if(d2<0){d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++;}elsed2+=a*a*(-2*y+3);y--;EllipsePoint(x,y);}}4、//EllipseView.cppvoid CEllipseView::OnDraw(CDC* pDC){CEllipseDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCellipse el;el.DoModal();//初始化CEllipseView::Mbellipse(el.m_a, el.m_b);//画椭圆}四、实结果验实验1:直线中点Bresenham算法实验2:圆中点Bresenham算法实验3:椭圆中点Bresenham算法实验二有效边表填充算法一、实验目的:1、设计有效边表结点和边表结点数据结构;2、设计有效边表填充算法;3、编程实现有效边表填充算法。
计算机图形学-期末课程设计
图形学课程设计报告题目:系别:班级:学号:姓名:指导老师:目录诚信说明......................................................................................................... 错误!未定义书签。
目录 .. (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的画图软件和图片处理软件的发展也日新月异,因此产生了制作一个类似的画图软件;而且通过制作该程序还能更好的学习图形学编程知识。
计算机图形学课设(含所有程序图文)
计算机图形学课程设计报告系(院):计算机科学学院专业班级:信计11102姓名:吴家兴学号:201106262指导教师:严圣华设计时间:2014.6.16 - 2014.6.26设计地点:10教机房(此处目录根据自己情况可以调整改动)一、课程设计目的 ................................................. 错误!未定义书签。
二、课程设计具体要求..................................... 错误!未定义书签。
三、需求分析与总体设计 ..................................... 错误!未定义书签。
四、详细设计与实现[含关键代码和实现界面] ... 错误!未定义书签。
五、小结......................................................................................... 错误!未定义书签。
一、课程设计目的计算机图形学课程设计是验证、巩固和补充课堂讲授的理论知识的必要环节,通过上机实验,培养学生的自学能力、动手能力、综合运用知识解决实际问题的能力。
要求学生运用计算机图形学理论与技术设计、编写、调试程序并撰写课程设计报告。
二、课程设计具体要求1.独立完成设计并撰写课程设计报告。
2.在规定时间将程序和设计报告用附件(信计111X班XXX 图形学课设报告.RAR)发送到274548837@,并上交纸质打印稿(A4纸10页左右)。
3. 课程设计报告内容包括:(1)列出设计者姓名及本人详细信息、所用开发工具;(2)程序的基本功能介绍;(3)程序实现步骤和关键算法的理论介绍;(4)关键源代码实现说明。
(不要打印全部源程序!)(5)程序运行界面截图(3幅左右)(6)课设总结和自我评价。
4.《计算机图形学》课程的知识结构体系:(1)课设为期两周:总学时为40学时,2学分(2)学生必须完成二维线画图元和二维填充图元两个大功能。
《计算机图形学》程序设计报告
计算机图形学课程设计程序设计报告题目:C1 用面向对象技术实现一个类似于Windows画板的程序,要求实现其中的主要交互绘图技术。
学院:同济大学电子与信息工程学院专业:计算机科学与技术学号:099910姓名:耿康康2011年7月程序设计报告一.设计目标和要求1、目标:实现类似于Windows画图程序的基本交互功能,利用Windows编程开发出简单的可视化界面,2、要求:可以实现直线、矩形、圆弧等基本的图元操作,可以改变图形线框的宽度和颜色,可以填充图形,带有可视化的快捷操作图标,具有图形的打开和保存等功能。
二.算法原理介绍本程序是基于Windows编程,改变了传统的DOS应用程序的设计模式。
在DOS模式下,应用程序是封闭的,从入口到出口,层层调用,环环相扣,构成了一条完整的程序链。
而Windows应用程序则采用一种“事件驱动,消息激励”机制,在这种机制下传统的程序结构形式被打破,大量的响应函数构成了程序的主体,当系统或用户触发了某个事件(如定时时间到、用户点击鼠标等),便会产生与该事件关联的消息,然后通过消息去激励相应的响应函数,从而完成既定目标或任务。
本程序是MFC中的单文档窗口应用程序,利用MFC AppWizard(exe)构建了一个名为huatu的工程。
利用了Resource Symbols定义了几个菜单的ID,使它们具有连续的ID值,这样就可以用一个共同的响应函数。
在菜单和工具栏做好之后,就进入了程序的代码设计阶段,首先要在ChuatuView类中添加成员变量并初始化,成员函数以及初始化代码在系统设计与实现中具体给出。
接着在视类的构造函数(CHuatuView::CHuatuView())初始化部分成员变量,在析构函数(CHuatuView::~CHuatuView())中释放指针变量占用的内存。
然后在视类中添加VM_CREATE消息响应函数也就是添加了消息处理函数OnCreate(),加入相应代码。
计算机图形学课程设计报告
一、设计内容与要求、设计题目算法实现时钟运动、总体目标和要求(1)目标:以图形学算法为目标,深入研究。
继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。
通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。
(2)总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。
(3)开发环境:、设计要求内容:(1)掌握动画基本原理;(2)实现平面几何变换;功能要求:(1)显示时钟三个时针,实现三根时针间的相互关系;(2)通过右键菜单切换时钟背景与时针颜色;设计方案通过使用OpenGL提供的标准库函数,综合图形学Bresenham画线和画圆的算法,OpenGL颜色模型中颜色表示模式等实现指针式时钟运动,并通过点击右键菜单实习时钟背景与时针颜色的转换。
根据Bresenham画线和画圆的算法,画出时钟的指针和表盘。
再根据OpenGL颜色模型定义当前颜色。
设置当时钟运行时交换的菜单,运行程序时可变换时钟背景与时针的颜色。
最后再设置一个恢复菜单恢复开始时表盘与指针的颜色。
二、总体设计、过程流程图1(1)圆是满足x轴对称的,这样只需要计算原来的1/2点的位置;(2)圆是满足y轴对称的,这样只需要计算原来的1/2点的位置;通过上面分析可以得到实际上我们计算椭圆生成时候,只需要计算1/4个椭圆就可以实现对于所有点的生成了。
2、中点椭圆算法内容:(1)输入椭圆的两个半径r1和r2,并且输入椭圆的圆心。
设置初始点(x0,y0)的位置为(0,r2);(2)计算区域1中央决策参数的初始值p = ry*ry - rx*rx*ry + 1/4*(rx*rx);(3)在区域1中的每个Xn为止,从n = 0 开始,直到|K|(斜率)小于-1时后结束;<1>如果p < 0 ,绘制下一个点(x+1,y),并且计算p = p + r2*r2*(3+2*x);<2>如果P >=0 ,绘制下一个点(x+1,y-1),并且计算(4)设置新的参数初始值;p = ry*ry(X0+1/2)*(X0+1/2) + rx*rx*(Y0-1) - rx*rx*ry*ry;(5)在区域2中的每个Yn 为止,从n = 0开始,直到y = 0时结束。
计算机图形学课程教学设计报告
一、设计内容与要求1.1、设计题目算法实现时钟运动1.2、总体目标和要求(1)目标:以图形学算法为目标,深入研究。
继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。
通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。
(2)总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。
(3)开发环境:Viusal C++ 6.01.3、设计要求内容:(1)掌握动画基本原理;(2)实现平面几何变换;功能要求:(1)显示时钟三个时针,实现三根时针间的相互关系;(2)通过右键菜单切换时钟背景与时针颜色;1.4设计方案通过使用OpenGL提供的标准库函数,综合图形学Bresenham画线和画圆的算法,OpenGL颜色模型中颜色表示模式等实现指针式时钟运动,并通过点击右键菜单实习时钟背景与时针颜色的转换。
根据Bresenham画线和画圆的算法,画出时钟的指针和表盘。
再根据OpenGL颜色模型定义当前颜色。
设置当时钟运行时交换的菜单,运行程序时可变换时钟背景与时针的颜色。
最后再设置一个恢复菜单恢复开始时表盘与指针的颜色。
二、总体设计2.1、过程流程图2.2、椭圆的中点生成算法1、椭圆对称性质原理:(1)圆是满足x轴对称的,这样只需要计算原来的1/2点的位置;(2)圆是满足y轴对称的,这样只需要计算原来的1/2点的位置;通过上面分析可以得到实际上我们计算椭圆生成时候,只需要计算1/4个椭圆就可以实现对于所有点的生成了。
2、中点椭圆算法内容:(1)输入椭圆的两个半径r1和r2,并且输入椭圆的圆心。
设置初始点(x0,y0)的位置为(0,r2);(2)计算区域1中央决策参数的初始值p = ry*ry - rx*rx*ry + 1/4*(rx*rx);(3)在区域1中的每个Xn为止,从n = 0 开始,直到|K|(斜率)小于-1时后结束;<1>如果p < 0 ,绘制下一个点(x+1,y),并且计算p = p + r2*r2*(3+2*x);<2>如果P >=0 ,绘制下一个点(x+1,y-1),并且计算p = p + r2*r2*(3+2*point.x) - 2*r1*r1*(y-1)(4)设置新的参数初始值;p = ry*ry(X0+1/2)*(X0+1/2) + rx*rx*(Y0-1) - rx*rx*ry*ry;(5)在区域2中的每个Yn为止,从n = 0开始,直到y = 0时结束。
计算机图形学课程设计报告1
目录1、课程设计目的 (1)2、系统功能介绍 (1)3、程序代码和分析 (2)4、总结 (4)5、参考文献 (4)6.源程序 (4)计算机图形学课程设计报告1.课程设计目的本课程主要内容包括计算机图形学的研究内容、发展与应用,图形输入输出设备,图形显示原理,图形软件标准,基本图形生成算法,图形几何变换与裁剪,自由曲线和曲面,三维实体造型,分形几何造型,分形艺术,隐藏面消除,光照模型,颜色模型,光线跟踪,纹理细节模拟,常用的计算机动画技术和软件等。
在学期期末时按课程要求进行运动,提高学生对计算机图形学知识的了解与运用技巧同时通过此次课程设计提高动手实践能力与学习分析能力这就是本次的课程设计的目的。
2.课程设计描述及要求此次课程设计的课题为利用VC++6.0和插件OPENGL制作三维模型。
本设计主要通过建立MFC工程,在工程里建立一个三维模型然后再进行旋转,飞行等运动,来建立一个动态的三维模型。
主要步骤如下:1:工程的建立2:三维模型的建立和映射3:三维模型的运动一:工程的建立1:系统配置。
先对机子安装VC++6.0.在建立工程前,本实验需要添加OPENGL 插件,故需要在Windows环境下安装GLUT步骤如下:1、将下载的压缩包解开,将得到5个文件2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\PlatformSDK\include\gl文件夹”)。
把解压得到的glut.h放到这个文件夹。
3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\lib”文件夹)。
4、把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。
(典型的位置为:C:\Windows\System32)然后建立一个OpenGL工程测试这里以VisualStudio2005为例。
计算机图形学课程设计报告
计算机图形学课程设计报告设计课题:专业班级:学号:学生:指导教师:设计时间:中南林业科技大学涉外学院理工系计算机图形学课程设计任务书指导教师:廖宁教研室主任:2018年12月06 日注:本表下发学生一份,指导教师一份,栏目不够时请另附页。
课程设计任务书装订于设计计算说明书〔或论文〕封面之后,目录页之前。
目录一.设计目的……………………………………………………………二.设计要求……………………………………………………………1.构建根底类……………………………………………………2.构建直线类……………………………………………………3.构建变换类……………………………………………………4.构建填充类……………………………………………………5.构建光照类……………………………………………………三.开发环境…………………………………………………………四.详细设计五.源程序六.程序运行效果图七.总结设计目的▪培养对图形建模、变换、投影、消隐、光照原理的理解和应用。
▪培养图形类的编程能力。
▪培养计算机图形学应用软件开发的能力。
设计要求深入研究计算机图形学的生成原理,设计算法实现具体的类。
1.构建根底类实现CP2类绘制二维点;实现CP3类绘制三维点;实现CRGB 类处理RGB颜色;实现CVector类处理矢量。
2.构建直线类实现CLine类绘制任意斜率的直线、实现CALine类绘制任意斜率的反走样直线、实现CCLine类绘制任意斜率的颜色渐变直线、实现CACLine类绘制任意斜率的反走样颜色渐变直线。
3.构建变换类实现CTransForm完成二维和三维图形变换。
4.构建填充类实现CFill类使用有效边表算法填充多边形、实现CZBuffer类进展深度缓冲消隐,并使用Gouraud和Phong明暗处理填充图形面片。
5.构建光照类实现CLight类设置点光源、实现CMaterial类设置物体材质、实现CLighting类对物体实施光照。
计算机图形学课程设计报告
源程序 // Yzg20166989View.cpp : implementation of the
CYzg20166989View class //
#include "stdafx.h" #include "Yzg20166989.h"
#include "math.h"
#include "Yzg20166989Doc.h" #include "Yzg20166989View.h"
设计目的 培养对图形建模、变换、投影、消隐、光照原理的理解和应用。 培养图形类的编程能力。 培养计算机图形学应用软件开发的能力。
设计要求 深入研究计算机图形学的生成原理,设计算法实现具体的类。 1.构建基础类 实现 CP2 类绘制二维点;实现 CP3 类绘制三维点;实现 CRGB 类处理 RGB 颜色;实现 CVector 类处理矢量。 2.构建直线类 实现 CLine 类绘制任意斜率的直线、实现 CALine 类绘制任意 斜率的反走样直线、实现 CCLine 类绘制任意斜率的颜色渐变直线、 实现 CACLine 类绘制任意斜率的反走样颜色渐变直线。 3.构建变换类 实现 CTransForm 完成二维和三维图形变换。 4.构建填充类 实现 CFill 类使用有效边表算法填充多边形、实现 CZBuffer 类进行深度缓冲消隐,并使用 Gouraud 和 Phong 明暗处理填充图形 面片。 5.构建光照类
CYzg20166989View::CYzg20166989View()
{ // TODO: add construction code here
}
CYzg20166989View::~CYzg20166989View() { }
图形学课设报告
武汉工业学院《计算机图形学》课程设计题目:绘制三次Bezier曲线,三次B样条曲线和Cantor图指导老师:刘文涛姓名:庞璐学号:070505129院(系):计算机与信息工程系专业:软件工程完成日期: 2010年1 月4 日一.课题题目介绍设计任务9:1)给定下图所示的四个控制点:P0=(228,456),P1=(294,247),P2=(452,123),P3=(705,197)。
分别绘制三次Bezier曲线和三次B样条曲线。
2)使用VC编程,在窗口中一次绘制n=0~5的所有Cantor图。
二.整体功能及设计1)主模块:Bezier,B样条,cantor集算法的实现。
2)响应模块:a.Bezier,B样条,cantor集的鼠标响应;b.Bezier,B样条,cantor集的菜单和提示对话框响应。
c. Bezier,B样条,cantor集的快捷按钮响应。
3)附加功能模块:曲线颜色的选择。
算法描述:Bezier曲线功能描述:点击相应菜单,弹出提示对话框,继而可以实现鼠标取点,绘出Bezier 曲线和B样条曲线;选择cantor集菜单在弹出的对话框中输入n的值,随即绘出cantor集图形。
三.编程实现1.属性和方法的定义:class CMy070505129View : public CView{protected: // create from serialization onlyCMy070505129View();DECLARE_DYNCREATE(CMy070505129View)// Attributesbool mousestate;//鼠标状态标志CPoint cp[4];//顶点int i;//控制多边形顶点int m;//判断函数int MaxX,MaxY;//屏幕x和y的最大坐标int n;//递归深度COLORREF ccolor;//设置颜色值public:CMy070505129Doc* GetDocument();// Operationsvoid DrawBezier();//Bezier函数void DrawByangtiao();//B样条函数void Cantor(double,double,double,double,int);//cantor函数2.头文件:#include "stdafx.h"#include "070505129.h"#include "070505129Doc.h"#include "070505129View.h"#include "Bezier.h"#include "Byangtiao.h"#include "Cantor.h"#define ROUND(x) int(x+0.5)//四舍五入3.方法实现:CMy070505129View::CMy070505129View(){//部分数据初始化mousestate=false;i=0;cp[0].x=0;cp[0].y=0;cp[1].x=0;cp[1].y=0;cp[2].x=0;cp[2].y=0;cp[3].x=0;cp[3].y=0;}void CMy070505129View::DrawBezier()//Bezier函数{CClientDC dc(this);//设备上下文double t=0.0;//Bezier算法实现while(t<1.0){doubleptx=((-(t*t*t))+3*t*t-3*t+1)*(double)cp[0].x+(3*t*t*t-6*t*t+3*t)*(double)cp[1].x+(( -(3*t*t*t))+3*t*t)*(double)cp[2].x+t*t*t*(double)cp[3].x;doublepty=((-(t*t*t))+3*t*t-3*t+1)*(double)cp[0].y+(3*t*t*t-6*t*t+3*t)*(double)cp[1].y+(( -(3*t*t*t))+3*t*t)*(double)cp[2].y+t*t*t*(double)cp[3].y;dc.SetPixel((int)(ptx+0.5),(int)(pty+0.5),ccolor);//ccolor为颜色变量t+=1/10000.0;//步长}}void CMy070505129View::DrawByangtiao()//B样条函数{CClientDC dc(this);//设备上下文double t=0.0,x,y;//局部变量t为步长,x,y为每次曲线相应的点dc.MoveTo(cp[0]);//绘制四个控制点组成的四条线for(int i=1;i<4;i++){dc.LineTo(cp[i]);}//B样条算法实现while(t<1.0){double F0=(-(t*t*t)+3*t*t-3*t+1)/6.0;double F1=(3*t*t*t-6*t*t+4)/6.0;double F2=(-3*(t*t*t)+3*t*t+3*t+1)/6.0;double F3=t*t*t/6.0;x=cp[0].x*F0+cp[1].x*F1+cp[2].x*F2+cp[3].x*F3;y=cp[0].y*F0+cp[1].y*F1+cp[2].y*F2+cp[3].y*F3;dc.SetPixel((int)(x+0.5),(int)(y+0.5),ccolor);//ccolor为颜色变量t+=1/1000.0;//步长}}void CMy070505129View::Cantor(double ax,double ay,double bx,double by,int x)//cantor函数{double cx,dx,cy,dy;//cantor中间点座标CClientDC dc(this);//设备上下文if(x==0){dc.MoveTo(ROUND(ax),ROUND(ay+MaxY/2));dc.LineTo(ROUND(bx),ROUND(by+MaxY/2));return;}//递归cx=ax+(bx-ax)/3;cy = ay ;Cantor(ax,ay,cx,cy,x-1);dx=ax+2*(bx-ax)/3;dy = by ;Cantor(dx,dy,bx,by,x-1);}void CMy070505129View::OnBezier()//菜单响应函数{// TODO: Add your command handler code heremousestate=true;//重新设制鼠标状态CBezier bezier;//定义对话框类对象bezier.DoModal();//响应m=1;//标记值,双击时调用相应的函数Invalidate();}void CMy070505129View::OnByangtiao()//菜单响应函数{// TODO: Add your command handler code heremousestate=true;//重新设制鼠标状态CByangtiao Byangtiao;//定义对话框类对象Byangtiao.DoModal();//响应m=2;//标记值,双击时调用相应的函数Invalidate();}void CMy070505129View::OnLButtonDown(UINT nFlags, CPoint point)//单击获取控制点函数{if(mousestate){//获取x坐标cp[i].x=point.x;//获取y坐标cp[i].y=point.y;//存四个控制点放入cp[4]if(i<4)i++;elsemousestate=false;}CView::OnLButtonDown(nFlags, point);}void CMy070505129View::OnBUTTONBezier()//Bezier快捷按钮函数{//重新绘制Invalidate();//重新设制鼠标状态mousestate=true;//标记值,双击时调用相应的函数m=1;}void CMy070505129View::OnBUTTONByangtiao()//B样条快捷按钮函数{// TODO: Add your command handler code hereInvalidate();//重新绘制mousestate=true;//重新设制鼠标状态m=2;//标记值,双击时调用相应的函数}void CMy070505129View::OnLButtonDblClk(UINT nFlags, CPoint point) //双击{// TODO: Add your message handler code here and/or call default//鼠标状态mousestate=false;//调用画Bezier函数if(m==1)DrawBezier();//调用画B样条函数if(m==2)DrawByangtiao();CView::OnLButtonDblClk(nFlags, point);}void CMy070505129View::Oncantor()//Cantor集菜单响应函数{// TODO: Add your command handler code here//定义对话框类对象CCantor cantor;//设备上下文CClientDC dc(this);//响应cantor.DoModal();n=cantor.m_n;//立即重绘屏幕RedrawWindow();//获取屏幕最大x,y值CRect Rect;GetClientRect(&Rect);MaxX=Rect.right;MaxY=Rect.bottom;//调用Cantor算法实现函数Cantor(0,0,MaxX,0,n);}void CMy070505129View::OnMENUITEMcolor()//颜色菜单响应函数{// TODO: Add your command handler code here//定义对颜色对话框类对象CColorDialog color;color.m_cc.rgbResult=ccolor;color.DoModal();//得到用户选择的颜色ccolor=color.GetColor();}四.使用说明点击相应菜单,弹出提示对话框,单击”ok”键,使用鼠标单击四下取点,双击绘出Bezier曲线或B样条曲线;或者单击选择单击图形按钮随即单击鼠标四下,双击绘出Bezier曲线或B样条曲线。
计算机图形课程设计报告
《计算机图形学》课程设计项目题目:圆内动态颜色填充专业:计算机科学与技术学号: **********名:**指导教师:***2014年6月目录一、项目概述二、项目需求三、项目设计四、项目效果五、算法改进六、项目总结填充算法用于内部定义区域,以改变整个区域的颜色属性,它把区域内的原像素点值改变成另一种像素点值。
算法中,读出像素点(x; y)像素点值。
此算法所采用的基本方法是首先确定(x; y)点的像素点是否在区域内尚未被访问过的那一部分之中,也就是说,如果这个像素点的值是原始值old-value,则需要把它改为填充的值new-value,然后按区域性质先后访问其相邻的像素点,当访问其中每一个近邻像素点时,都要进行递归调用。
填充算法,其基本思想是:从图形的一个内点开始,由内向外用给定的颜色画点直到边界为止。
如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。
从区域内任意一点出发,通过各方向到达区域内的任意像素。
二、项目需求计算机图形学:(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。
计算机图形学的主要研究内容就是研究如何在汁算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。
图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。
从处理技术上来看,图形主要分为两类,一类是基于线条信息表示的。
如工程图、等高线地图、曲面的线框图等,另一类是明暗图,也就是通常所说的真实感图形。
计算机图形学一个主要目的就是要利用计算机产生令人赏心悦目的真实感图形。
为此,必须建立图形所描述场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。
同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。
计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。
计算机图形学课程设计报告报告实验报告
《计算机图形学》实验报告班级计算机科学与技术姓名学号2014 年6 月2 日实验一基本图形生成算法一、实验目的:1、掌握中点Bresenham绘制直线的原理;2、设计中点Bresenham算法;3、掌握八分法中点Bresenham算法绘制圆的原理;4、设计八分法绘制圆的中点Bresenham算法;5、掌握绘制1/4椭圆弧的上半部分和下半部分的中点Bresenham算法原理;6、掌握下半部分椭圆偏差判别式的初始值计算方法;7、设计顺时针四分法绘制椭圆的中点Bresenham算法。
二、实验过程:1、实验描述实验1:使用中点Bresenham算法绘制斜率为0<=k<=1的直线。
实验2:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的圆。
实验3:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的椭圆。
2、实验过程1)用MFC(exe)建立一个单文档工程;2)编写对话框,生成相应对象,设置相应变量;3)在类CLineView中声明相应函数,并在相关的cpp文件中实现;4)在OnDraw()函数里调用函数实现绘制直线、圆、椭圆;5)运行程序,输入相应值,绘制出图形。
三、源代码实验1:直线中点Bresenham算法1.// cline.cpp : implementation file// cline dialogcline::cline(CWnd* pParent /*=NULL*/): CDialog(cline::IDD, pParent){//{{AFX_DATA_INIT(cline)m_x0 = 0;m_y0 = 0;m_x1 = 0;m_y1 = 0;//}}AFX_DATA_INIT}void cline::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(cline)DDX_Text(pDX, IDC_x0, m_x0);DDX_Text(pDX, IDC_y0, m_y0);DDX_Text(pDX, IDC_x1, m_x1);DDX_Text(pDX, IDC_y1, m_y1);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(cline, CDialog)//{{AFX_MSG_MAP(cline)//}}AFX_MSG_MAPEND_MESSAGE_MAP()2、// LineView.hclass CLineView : public CView{public:CLineDoc* GetDocument();..........void Mbline(double,double,double,double); //直线中点Bresenham函数.......}3、// Line.cpp//*******************直线中点Bresenham函数*********************/void CLineView::Mbline(double x0, double y0, double x1, double y1) {CClientDC dc(this);COLORREF rgb=RGB(0,0,255); //定义直线颜色为蓝色double x,y,d,k;x=x0; y=y0; k=(y1-y0)/(x1-x0); d=0.5-k;for(x=x0;x<=x1;x++){dc.SetPixel((int)x,(int)y,rgb);if(d<0){y++;d+=1-k;}elsed-=k;}}4、//LineView.cppvoid CLineView::OnDraw(CDC* pDC){CLineDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data herecline a;a.DoModal();//初始化CLineView::Mbline(a.m_x0,a.m_y0,a.m_x1,a.m_y1); }实验2:圆中点Bresenham算法1、//cricle.cpp// Ccricle dialogCcricle::Ccricle(CWnd* pParent /*=NULL*/): CDialog(Ccricle::IDD, pParent){//{{AFX_DATA_INIT(Ccricle)m_r = 0;//}}AFX_DATA_INIT}void Ccricle::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Ccricle)DDX_Text(pDX, r_EDIT, m_r);//}}AFX_DATA_MAP}2、//CcircleView.hclass CCcircleView : public CView{.......public:CCcircleDoc* GetDocument();void CirclePoint(double,double); //八分法画圆函数void Mbcircle(double); //圆中点Bresenham函数........}3、//CcircleView.cppvoid CCcircleView::OnDraw(CDC* pDC){CCcircleDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCcricle r;r.DoModal();CCcircleView::Mbcircle(r.m_r);//画圆}4、//CcircleView.cpp//*******************八分法画圆*************************************/ void CCcircleView::CirclePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);dc.SetPixel((int)(300+y),(int)(300+x),rgb);dc.SetPixel((int)(300-y),(int)(300+x),rgb);dc.SetPixel((int)(300+y),(int)(300-x),rgb);dc.SetPixel((int)(300-y),(int)(300-x),rgb);}//**************************圆中点Bresenham函数*********************/ void CCcircleView::Mbcircle(double r){double x,y,d;COLORREF rgb=RGB(0,0,255);d=1.25-r;x=0;y=r;for(x=0;x<y;x++){CirclePoint(x,y); //调用八分法画圆子函数if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}}}实验3:椭圆中点Bresenham算法1、//ellipse1.cpp// Cellipse dialogCellipse::Cellipse(CWnd* pParent /*=NULL*/) : CDialog(Cellipse::IDD, pParent){//{{AFX_DATA_INIT(Cellipse)m_a = 0;m_b = 0;//}}AFX_DATA_INIT}void Cellipse::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Cellipse)DDX_Text(pDX, IDC_EDIT1, m_a);DDX_Text(pDX, IDC_EDIT2, m_b);//}}AFX_DATA_MAP}2、//EllipseView.hclass CEllipseView : public CView{......................public:CEllipseDoc* GetDocument();void EllipsePoint(double,double); //四分法画椭圆void Mbellipse(double a, double b); //椭圆中点Bresenham函数..................}3、//Ellipse.cpp//*****************四分法画椭圆********************************/void CEllipseView::EllipsePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);}//************************椭圆中点Bresenham函数*********************/ void CEllipseView::Mbellipse(double a, double b){double x,y,d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);EllipsePoint(x,y);while(b*b*(x+1)<a*a*(y-0.5))//椭圆AC弧段{if(d1<0)d1+=b*b*(2*x+3);else{d1+=b*b*(2*x+3)+a*a*(-2*y+2);y--;}x++;EllipsePoint(x,y);}d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;//椭圆CB弧段while(y>0){if(d2<0){d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++;}elsed2+=a*a*(-2*y+3);y--;EllipsePoint(x,y);}}4、//EllipseView.cppvoid CEllipseView::OnDraw(CDC* pDC){CEllipseDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCellipse el;el.DoModal();//初始化CEllipseView::Mbellipse(el.m_a, el.m_b);//画椭圆}四、实结果验实验1:直线中点Bresenham算法实验2:圆中点Bresenham 算法实验3:椭圆中点Bresenham 算法实验二有效边表填充算法一、实验目的:1、设计有效边表结点和边表结点数据结构;2、设计有效边表填充算法;3、编程实现有效边表填充算法。
计算机图形学课程设计实习报告
实验零? Visual C++ 2005绘图系统地点:土木楼B401机房时间:星期三下午节次:第三大节一、实验目的:1. 了解Visual C++ 2005绘图的基本概念2. 了解Visual C++ 2005绘图环境3. 掌握用Visual C++ 2005设计绘图项目的基本步骤4. 掌握用Visual C++ 2005绘图的基本命令二、实验内容:实验内容1:创建绘图应用程序主框架实验内容2:应用程序编译运行实验内容3:设置菜单项并生成消息响应函数实验内容4:SetPixel绘图三、实验步骤:实验内容1:创建绘图应用程序主框架步骤:1.创建一个工作目录D:\MyProject2.启动Visual Studio 20053.单击“文件”->“新建”->“项目”,项目类型对话框中选择“其他语言”->“VC++”->“MFC”,模版选择“MFC应用程序”。
在工作目录D:\MyProject 下创建一个新应用项目: Sample,如下图所示。
4.单击“确定”按钮。
5.单击“下一步”按钮。
6.在“应用程序类型中”,选择“单文档”类型。
7.单击“完成”,创建了一项空的工程-绘图应用程序主框架。
实验内容2:应用程序编译运行运行版本有两类:Debug、Release, 生成Debug解决方案步骤如下:1.生成解决方案点击“生成-〉生成解决方案”, 生成了Debug版的可运行程序。
2.调试运行程序点击菜单“调试——〉开始执行(不调试)”, 执行Debug版的可运行程序。
结果如下:生成Release解决方案步骤如下:1.生成解决方案点击“生成-〉批生成”。
2.勾选“Release”,单击“生成”,生成可以独立于Visual C++ 2005外运行的.exe程序。
3.查看目录,sample.exe是Release版,单击即可以运行。
运行结果:实验内容3:设置菜单项并生成消息响应函数1.弹出菜单设计器双击“资源视图”中的“Menu”展开文件夹,双击“IDR_MAINFRAME”,弹出菜单设计器。
计算机图形学课程设计
}
returnNULL;
}
intLoadGLTextures()
{
intstatus=false;
AUX_RGBImageRec *TextureImage[1];
memset(TextureImage,0,sizeof(void*)*1);
if(TextureImage[0]=LoadBMP("sand.bmp"))
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
if(TextureImage[0])
{
if(TextureImage[0]->data)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学课程设计报告设计课题:专业班级:学号:学生姓名:指导教师:设计时间:2018.12.06中南林业科技大学涉外学院理工系计算机图形学课程设计任务书指导教师:廖宁教研室主任:2018年12月06 日注:本表下发学生一份,指导教师一份,栏目不够时请另附页。
课程设计任务书装订于设计计算说明书(或论文)封面之后,目录页之前。
目录一.设计目的……………………………………………………………二.设计要求……………………………………………………………1.构建基础类……………………………………………………2.构建直线类……………………………………………………3.构建变换类……………………………………………………4.构建填充类……………………………………………………5.构建光照类……………………………………………………三.开发环境…………………………………………………………四.详细设计五.源程序六.程序运行效果图七.总结设计目的▪培养对图形建模、变换、投影、消隐、光照原理的理解和应用。
▪培养图形类的编程能力。
▪培养计算机图形学应用软件开发的能力。
设计要求深入研究计算机图形学的生成原理,设计算法实现具体的类。
1.构建基础类实现CP2类绘制二维点;实现CP3类绘制三维点;实现CRGB 类处理RGB颜色;实现CVector类处理矢量。
2.构建直线类实现CLine类绘制任意斜率的直线、实现CALine类绘制任意斜率的反走样直线、实现CCLine类绘制任意斜率的颜色渐变直线、实现CACLine类绘制任意斜率的反走样颜色渐变直线。
3.构建变换类实现CTransForm完成二维和三维图形变换。
4.构建填充类实现CFill类使用有效边表算法填充多边形、实现CZBuffer类进行深度缓冲消隐,并使用Gouraud和Phong明暗处理填充图形面片。
5.构建光照类实现CLight类设置点光源、实现CMaterial类设置物体材质、实现CLighting类对物体实施光照。
开发环境Viusal C++ 6.0的MFC框架。
详细设计1.利用函数Ellipse画出人物的脸,并用给脸填充颜色。
再利用Ara画出人物的嘴巴。
CRect确定人物的眼睛,给眼睛填充颜色。
利用画笔画出人物的鼻子。
2.添加ddaline()成员函数,编写自定义的成员函数ddaline()程序,编写OnDraw()函数,画出人物的脚和脚趾。
3.添加星星star()成员函数,编写自定义的成员函数star()程序,确定五角星的位置、大小和颜色。
4.添加五环circle()成员函数,并利用colorcircle()函数给五环上色。
5.添加旗子flayA()、flayB()成员函数,确定旗杆的位置,用四点坐标设置旗子的范围,将星星和五环置于旗子中。
源程序// Yzg20166989View.cpp : implementation of the CYzg20166989View class//#include "stdafx.h"#include "Yzg20166989.h"#include "math.h"#include "Yzg20166989Doc.h"#include "Yzg20166989View.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////// //////////////////// CYzg20166989ViewIMPLEMENT_DYNCREATE(CYzg20166989View, CView)BEGIN_MESSAGE_MAP(CYzg20166989View, CView)//{{AFX_MSG_MAP(CYzg20166989View)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)END_MESSAGE_MAP()/////////////////////////////////////////////////////////// //////////////////// CYzg20166989View construction/destructionCYzg20166989View::CYzg20166989View(){// TODO: add construction code here}CYzg20166989View::~CYzg20166989View(){}BOOL CYzg20166989View::PreCreateWindow(CREATESTRUCT& cs) {// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////// //////////////////// CYzg20166989View drawingvoid CYzg20166989View::OnDraw(CDC* pDC){CYzg20166989Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereAfxGetMainWnd()->SetWindowText("20166989 尹志刚");graph(pDC,0,0);CRect rect(200,120,430,350);CRect rect1(250,195,275,220);CRect rect2(355,195,380,220);CBrush nBrush(RGB(0,255,255)),*pOldnBrush;pOldnBrush=pDC->SelectObject(&nBrush); pDC->Ellipse(200,120,430,350);pDC->SelectObject(pOldnBrush);CBrush Brush(RGB(0,0,0)),*pOldBrush; pOldBrush=pDC->SelectObject(&Brush); pDC->RoundRect(rect1,CPoint(200,200)); pDC->RoundRect(rect2,CPoint(200,200)); pDC->SelectObject(pOldBrush);CBrush mBrush(RGB(255,255,0)),*pOldmBrush; pOldmBrush=pDC->SelectObject(&mBrush); pDC->Arc(250,275,380,355,295,285,335,285); pDC->SelectObject(pOldmBrush);CPoint p1(305,295),p2(325,295);CPen Pen,*pOldPen;Pen.CreatePen(PS_SOLID,3,RGB(0,0,0)); pOldPen=pDC->SelectObject(&Pen);pDC->MoveTo(p1);pDC->LineTo(p2);pDC->SelectObject(pOldPen);pDC->SetTextColor(RGB(0,0,255));pDC->TextOut(225,20,"同一个世界,同一个梦想");ddaline(pDC,225,305,225,450,RGB(255,0,0));ddaline(pDC,405,305,405,450,RGB(255,0,0));ddaline(pDC,225,450,225,460,RGB(0,0,0));ddaline(pDC,225,450,215,460,RGB(0,0,0));ddaline(pDC,225,450,235,460,RGB(0,0,0));ddaline(pDC,405,450,405,460,RGB(0,0,0));ddaline(pDC,405,450,395,460,RGB(0,0,0));ddaline(pDC,405,450,415,460,RGB(0,0,0));}/////////////////////////////////////////////////////////// //////////////////// CYzg20166989View printingBOOL CYzg20166989View::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CYzg20166989View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CYzg20166989View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}/////////////////////////////////////////////////////////// //////////////////// CYzg20166989View diagnostics#ifdef _DEBUGvoid CYzg20166989View::AssertValid() const{CView::AssertValid();}void CYzg20166989View::Dump(CDumpContext& dc) const{CView::Dump(dc);}CYzg20166989Doc* CYzg20166989View::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CYzg201669 89Doc)));return (CYzg20166989Doc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////// //////////////////// CYzg20166989View message handlersvoid CYzg20166989View::ddaline(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color){int length,i;double x,y,dx,dy;length=abs(x1-x0);if(abs(y1-y0)>length)length=abs(y1-y0);dx=(x1-x0)/length;dy=(y1-y0)/length;x=x0+0.5;y=y0+0.5;for(i=1;i<=length;i++){pDC->SetPixel((int)x,(int)y,color);x=x+dx;y=y+dy;}}void CYzg20166989View::flagA(CDC *pDC, int x, int y){CBrushredBrush(RGB(0xFF,0,0)),yellowBransh(RGB(0xFF,0xff,0)),woodBrash(RGB(180,180,180)),*oldBrush;oldBrush=pDC->SelectObject(&redBrush);pDC->Rectangle(x+20,y+0,x+140,y+70);pDC->SelectObject(&woodBrash);pDC->Rectangle(x+15,y+0,x+20,y+100);pDC->SelectObject(&yellowBransh);pDC->SetPolyFillMode(WINDING);star(pDC,x+40,y+20,10);star(pDC,x+60,y+13,6);star(pDC,x+62,y+30,6);star(pDC,x+55,y+43,6);star(pDC,x+40,y+48,6);pDC->SelectObject(oldBrush);}void CYzg20166989View::flagB(CDC *pDC, int x, int y) {CBrushwoodBrash(RGB(180,180,180)),*oldBrush;pDC->Rectangle(x+85,y+0,x+205,y+70);oldBrush=pDC->SelectObject(&woodBrash);pDC->Rectangle(x+205,y+0,x+210,y+100);pDC->SelectObject(oldBrush);CPenp1(PS_SOLID,2,RGB(0x09,0x51,0xA0)),p2(PS_SOLID,2,RGB(0x05,0x05,0x05)),p3(PS_SOLID,2,RGB(0xFE,0x01,0x00)),p4(PS_SOLID,2,RGB(0xFC,0xFD,0x04)),p5(PS_SOLID,2,RGB(0x30,0xA0,0x2D));colorCircle(pDC,&p1,x+60+65,y+30,10);colorCircle(pDC,&p2,x+82+65,y+30,10);colorCircle(pDC,&p3,x+104+65,y+30,10);colorCircle(pDC,&p4,x+70+65,y+46,10);colorCircle(pDC,&p5,x+92+65,y+46,10);}void CYzg20166989View::star(CDC *pDC, int x, int y, int r) {CPoint stars[5];const double PI=3.1415926;double alpha=PI/10;double beta=2*PI/5;for(int i=0;i<5;i++) {stars[i].x=ceil(r*cos(i*beta+alpha))+x;stars[i].y=ceil(r*sin(i*beta+alpha))+y;}CPoint starx[5]={stars[0],stars[2],stars[4],stars[1],stars[3],};pDC->Polygon(starx,5);}void CYzg20166989View::colorCircle(CDC *pDC, CPen *pen, int x, int y, int r){CPen *old;old=pDC->SelectObject(pen);circle(pDC,x,y,r,FALSE);pDC->SelectObject(old);}void CYzg20166989View::circle(CDC *pDC, int x, int y, int r, BOOL fill) {if (fill==TRUE) {CBrush newBrush,*oldBrush;newBrush.CreateSolidBrush(RGB(0X33,0X33,0X33));oldBrush=pDC->SelectObject(&newBrush);pDC->Ellipse(CRect(x-r,y-r,x+r,y+r));pDC->SelectObject(oldBrush);}else{pDC->Ellipse(CRect(x-r,y-r,x+r,y+r));}}void CYzg20166989View::graph(CDC *pDC, int x, int y) {flagA(pDC,x+360,y+42);flagB(pDC,x+40,y+44);}程序运行效果图总结通过课程设计项目的设计、开发、测试、总结和验收各阶段,深入理解计算机图形学课程中的理论和算法,学习计算机图形学相关类的编程技巧,初步掌握游戏开发的前期技能。