计算机图形学课程设计 最新版
- 格式:doc
- 大小:400.00 KB
- 文档页数:16
计算机图形学课程设计一、课程目标知识目标:1. 让学生掌握计算机图形学的基本概念、基本原理和基本算法,如二维图形的表示、变换、裁剪和三维图形的建模、光照模型等。
2. 使学生了解计算机图形学在实际应用中的发展现状和前景,如虚拟现实、计算机辅助设计等。
3. 帮助学生建立计算机图形学与相关学科(如数学、物理、艺术等)的联系,提高跨学科素养。
技能目标:1. 培养学生运用计算机图形学知识解决实际问题的能力,如使用相关软件进行二维绘图、三维建模等。
2. 提高学生的编程能力,使其能够使用至少一种计算机图形学编程库(如OpenGL、DirectX等)实现基本图形绘制和动画效果。
3. 培养学生的团队协作能力和沟通表达能力,通过小组项目实践,共同完成具有一定难度的计算机图形学任务。
情感态度价值观目标:1. 激发学生对计算机图形学的兴趣,培养其主动探究、创新实践的精神。
2. 培养学生具有良好的审美观,能够从美学的角度评价和优化计算机生成的图形。
3. 强化学生的版权意识,尊重他人知识产权,遵循学术道德,树立正确的价值观。
本课程针对高中年级学生,结合学科特点和教学要求,将目标分解为具体的学习成果,以便于后续的教学设计和评估。
通过本课程的学习,期望学生能够掌握计算机图形学的基础知识,提高实际操作技能,培养良好的情感态度价值观。
二、教学内容1. 计算机图形学基本概念与历史:介绍计算机图形学的定义、发展历程、应用领域及发展趋势。
- 教材章节:第一章 计算机图形学概述- 内容安排:1课时2. 二维图形的表示与处理:讲解二维图形的数学表示、几何变换、裁剪算法等。
- 教材章节:第二章 二维图形处理- 内容安排:4课时3. 三维图形的建模与渲染:介绍三维图形的建模方法、光照模型、纹理映射等。
- 教材章节:第三章 三维图形处理- 内容安排:5课时4. 计算机动画与视觉效果:探讨计算机动画原理、关键帧动画、粒子系统等视觉效果技术。
- 教材章节:第四章 计算机动画与视觉效果- 内容安排:4课时5. 计算机图形学编程实践:学习计算机图形学编程库(如OpenGL、DirectX 等)的基本使用,完成二维和三维图形绘制实例。
计算机图形学(C语言)教案第一章:计算机图形学概述1.1 课程介绍介绍计算机图形学的定义、发展和应用领域。
解释图形和图像的区别。
1.2 图形学基本概念什么是点、线、面和体。
坐标系统和变换。
图形表示方法和存储结构。
1.3 图形处理流程图形输入、输出和显示。
图形裁剪和映射。
图形渲染和着色。
1.4 常见图形算法直线、圆和椭圆的算法。
填充算法和图像处理算法。
第二章:C语言基础2.1 C语言简介介绍C语言的历史和特点。
解释C语言在计算机图形学中的应用。
2.2 基本数据类型和语法整型、浮点型、字符型数据。
变量、常量和运算符。
2.3 控制语句条件语句和循环语句。
分支语句和循环控制语句。
2.4 函数和数组函数的定义和调用。
一维、二维数组和字符串。
第三章:图形库和API3.1 图形库简介什么是图形库和API。
常见的图形库和API介绍。
3.2 图形库的使用方法图形库的安装和配置。
图形库的基本函数和功能。
3.3 图形API的调用过程初始化图形环境。
创建图形对象和操作图形对象。
处理图形事件和关闭图形环境。
3.4 示例:绘制简单的图形使用图形库绘制点、线、圆等基本图形。
调整图形属性和颜色。
第四章:图形绘制和变换4.1 图形绘制基础绘制基本图形和文本。
使用图形属性调整图形外观。
4.2 图形变换坐标变换和几何变换。
矩阵和变换矩阵的运算。
4.3 图形裁剪和映射裁剪原理和算法。
映射原理和算法。
4.4 示例:绘制复杂的图形使用图形变换绘制复杂的图形。
应用图形裁剪和映射技术。
第五章:图形渲染和着色5.1 图形渲染基础什么是图形渲染和着色。
光和材质的模型。
5.2 颜色模型和转换RGB颜色模型和HSV颜色模型。
颜色转换和混合。
5.3 图形着色和光照基本着色算法和纹理映射。
点光源、聚光灯和环境光。
5.4 示例:实现简单的光照效果使用图形着色和光照技术绘制三维图形。
调整光照参数和观察光照效果。
第六章:图形界面设计6.1 图形界面设计基础界面设计原则和概念。
计算机图形学课程设计设计题目:画三次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. 按照下面的“三、课程设计报告格式”的要求,写出课程设计报告。
3. 课程设计报告在第19周之前交来。
二、 设计任务1.1)给定直线的起点坐标为P0(x0,y0)、终点坐标为P1(x1,y1),容易计算出直线斜率k 。
假设0≤k ≤1,则x 方向为主位移方向,绘制直线的递推公式为:,这称为数值微分法(Digital Differential Analyzer ,DDA ),请编程实现之。
提示:DDA 算法实质上是对直线斜率进行了四舍五入计算。
2)椭圆的扫描转换。
2.用鼠标在屏幕上绘制任意顶点数的封闭多边形并填充,填充效果如下图所示。
编程要求:⑴多边形的顶点数不受限制;⑵按下鼠标左键,拖动鼠标绘制多边形,同时按下Shift 键可以绘制水平边或垂直边; ⑶单击鼠标右键闭合多边形; ⑷使用边缘填充算法填充多边形。
⎩⎨⎧+=+=++k y y x x i i i i 1113请按照图所示,使用对话框输入直线的起点和终点坐标。
在窗口左侧区域绘制输入直线和“窗口”,在窗口右边右侧区域绘制“视区”并输出裁剪结果。
这里需要用到窗视变换的公式。
请分别用Cohen-Sutherland算法、中点分割裁剪算法和梁友栋-Barsky算法实现。
4在屏幕上使用鼠标绘制控制多边形,根据控制多边形的阶次绘制Bezier曲线和B样条曲线。
5.1)使用VC编程实现,以直角三角形为基础绘制下图所示Sierpinski三角形。
2)以屏幕范围为基础绘制下图所示Sierpinski地毯。
6.1)给定直线的起点颜色(如红色)和终点颜色(如黑色)不同,请使用中点Bresenham算法绘制任意斜率的颜色渐变直线,效果如图所示。
2)用梁友栋-Barsky算法裁剪线段P1(3,3),P2(-2,-1),裁剪窗口为wxl=0,wxr=2,wyb=0,wyt=2。
《计算机图形学》课程设计要求及安排一.实习目的《计算机图形学实习》是实践性教学环节之一,是《计算机图形学》课程的辅助教学课程。
通过实习,达到如下目的:(1)巩固和综合应用所学的计算机图形学理论知识,培养学生理论联系实际和独立思考问题的能力;(2)培养学生实际运用《计算机图形学》的知识设计计算机课题的思想和方法;(3)培养学生分析、设计和解决实际问题的能力,加强创新素质教育,激发学生的实际开发创造意识和能力;(4)培养学生调查研究、查阅技术文献、资料、手册以及编写技术文献的能力;(5)培养学生团结协作,共同完成相关课题的能力。
二.实习内容及要求要求学生在理解直线、圆、区域填充、图形裁剪等理论知识的基础上,借助于程序设计语言(如VC++、VB等)进行小型图形应用软件的开发,要求界面美观(包括菜单栏、工具栏)、功能相对完整、衔接自然、注重交互性。
主要知识点包括:(1)点、线、圆、多边形等计算机基本图元的的绘制(必做)(2)点、线、圆、多边形等计算机基本图元属性的设置(3)平移、缩放、旋转等计算机图形的几何变换(必做)(4)图形的裁剪(5)平面投影和透视投影(6)样条曲线、曲面的绘制(7)三维图形的真实感实现学生可以在实习老师的指导下,按3-5人为一小组完成一个简易图形系统的设计与开发,系统实现内容要求包括以上至少4个知识点(包括必做知识点,其它任选或自己设计),并完成实习文档;或者独立一人完成一项创新性,综合性较强的设计开发项目,并完成实习文档。
实习文档与结果要求标准化,即按规定的格式书写并提交。
三.考核方式及办法根据学生任务完成的情况、设计报告的质量及平时的学习态度等全面评定成绩。
学期成绩考核为五级记分制。
百分制与五级记分制的换算关系为:优秀(90—100分)、良好(80—89分)、中等(70—79分)、及格(60—69分)、不及格(60分以下)。
考核参考标准:以实际操作技能和分析解决问题的能力为主,实习考核内容各单项所占分数比例为:操作技能占60%,实习报告(作业或作品)占40%。
计算机图形学课程设计目录1.计算机图形学的概念与课程设计的目的 (1)2.设计图形实例与代码 (1)①直线的绘制 (1)1)直线(数值微分法绘直线) (1)2)线型设置 (1)3)直线构型金刚石 (2)4)鼠标画线 (4)②曲线的绘制 (5)1)蜗牛曲线 (5)2)正弦曲线 (6)3)抛物线 (6)4)贝齐曲线 (7)5)参数线条 (7)6)曲线造型 (11)③图型变换 (12)1)平移 (16)2)放大 (17)3)旋转 (18)④三维型体 (18)1)空间曲线 (18)2)线框图 (19)3)表面图 (19)4)消隐图 (19)⑤光照模型的设计 (22)1) 光照球3. 课程设计心得和体会一、计算机图形学的概念与课程设计的目的:计算机图形学(Computer Graphics ,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。
通过课程设计掌握使用Visual C++的MFC 框架绘制真实感图形。
二、设计图形实例与代码: 1、直线的绘制 ①数值微分法绘直线给定直线的起点坐标P0(x0,y0),终点坐标P1(x1,y1),容易计算出直线的斜率k 。
假设0≤k ≤1,则x 方向的主位移方向绘制直线的递推公式为:1X 1+=+i i Xk Y Y i i +=+1/************************************************************************/ /* 描述: 竖直微分法参数: CDC* CPoint CPoint返回值:无 */ /************************************************************************/ void CLine::DDALine(CDC *pDC, CPoint pt1, CPoint pt2) { double dx, dy, x, y, e; dx = pt2.x - pt1.x;dy = pt2.y - pt1.y;e = fabs(pt2.x - pt1.x) > fabs(pt2.y - pt1.y) ? fabs(pt2.x - pt1.x) : fabs(pt2.y - pt1.y);dx = dx / e;dy = dy / e;x= pt1.x;y = pt1.y;pDC->SetPixel(pt1, RGB(255, 120, 100));for (int i = 1; i <= e; i++){pDC->SetPixel(int(x), int(y), RGB(255, 120, 100));x = x + dx;y = y + dy;}}②线型设置通过CreatPen()用指定的样式和颜色创建一个画笔/************************************************************************//* 描述: 线型设置参数: CDC*返回值: 无*//************************************************************************/void CLine::Nm_LineSet(CDC *pDC){CPen *pOldPen;for (int i = 0; i <= 8; i++){CPen MyPen;MyPen.CreatePen(i, 1, RGB(255, 0, 0));pOldPen = pDC->SelectObject(&MyPen);pDC->MoveTo(-350, i * 40);pDC->LineTo(350, i * 40);pDC->SelectObject(pOldPen);MyPen.DeleteObject();}}③直线构型金刚石金钢石即交叉线绘图,就是在一个圆周上有若干个点,若干个点相互连接,这样就形成了一个艺术图案,本课程设计不仅完成交叉线的绘制,还通过定时器让图像动起来。
计算机图形学课程设计设计名称正四面体学号 092056132学生张译成目录1项目描述 (3)2任务配置 (3)3效果图 (3)4原理 (4)5算法 (5)6源代码 (5)7 总结 (10)项目描述本项目使用计算机图形学的知识,在屏幕是绘制一个四个面涂上不同颜色的正四面体,并且正四面体绕着其中一个顶点转动。
任务配置本程序使用Visual C++ 6.0,建立一个基于单文档的的项目。
效果图原理本程序的原理为先确定原始的正四面体的4个顶点,然后对其进行3维变换,再对其进行透视变化,然后将3维坐标转换为2维坐标,再判断每个面是否可见对其进行动态消影。
再将其画到屏幕上。
程序使用了双缓冲,并且使用定时器对坐标进行改变。
算法对坐标进行3维转换的坐标为先绕x转,再绕y转,最后绕z转,(这3个矩阵可以参考计算机图形学基础教程110面)将3个矩阵相乘可得ZH[0][0]=cos(b)*cos(c);ZH[0][1]=cos(b)*sin(c);ZH[0][2]=-sin(b);ZH[1][0]=cos(c)*sin(a)*sin(b)-cos(a)*sin(c);ZH[1][1]=sin(c)*sin(a)*sin(b)+cos(c)*cos(a);ZH[1][2]=sin(a)*cos(b);ZH[2][0]=cos(a)*sin(b)*cos(c)+sin(a)*sin(c);ZH[2][1]=cos(a)*sin(b)*sin(c)-cos(c)*sin(a);ZH[2][2]=cos(a)*cos(b);,对其进行透视变换时乘以矩阵(这个矩阵可以参考计算机图形学基础教程123面),将θ,φ都设置为45度,矩阵如下TZ[0][0]=-sqrt(2)/2;TZ[0][1]=-0.5;TZ[0][2]=-0.5;TZ[0][3]=0;TZ[1][0]=sqrt(2)/2;TZ[1][1]=-0.5;TZ[1][2]=-0.5;TZ[1][3]=0;TZ[2][0]=0;TZ[2][1]=sqrt(2)/2;TZ[2][2]=-sqrt(2)/2;TZ[2][3]=0;TZ[3][0]=0;TZ[3][1]=0;TZ[3][2]=700;TZ[3][3]=1;将3维坐标转换为2维坐标时,使用公式 x=x1/z1*d,y=y1/z1*d;对其进行动态消隐时,则在平面上取两个向量做差乘,获得其法向量,然后与视向量做数量级,并对其结果判断,大于0则画出该面,否则不画出该面。
计算机图形学课程设计
要求:程序中有必要的注释,程序中变量命名规范合理。
否则,成绩按降一档处理。
1、交互式绘图程序设计
内容:使用VC++6.0编程环境,实现一个简单的交互式绘图界面。
要求:用户通过鼠标能交互式输入一些数据,实现采用橡皮筋技术绘制相应的图形,要求能演示1-2个基本算法(Bresenham画线算法)。
选做:在状态栏上当鼠标运动时,能实时显示鼠标的当前坐标。
2、Cohen-Sutherland裁剪算法的实现
内容:使用VC++6.0环境,编程实现Cohen_Sutherland二维裁剪算法的实现。
要求:用户可以交互输入要裁剪线段的两个顶点,将裁剪后的线段和被裁剪掉的线段以不同的颜色显示在视图中。
3、Liang-Barsky裁剪算法的实现
内容:使用VC++6.0环境,编程实现Liang_Barsky二维裁剪算法的实现。
要求:用户可以交互输入要裁剪线段的两个顶点,将裁剪后的线段和被裁剪掉的线段以不同的颜色显示在视图中。
4、满足四象限的Bresenham绘制直线算法的实现
内容:使用VC++6.0环境,编程实现满足四象限的Bresenham直线段算法,并能够设置线宽和颜色属性。
要求:要求直线段端点可以由用户随机输入。
5、用OpenGL生成裁剪NURBS曲面
内容:使用VC++6.0编程环境,用OpenGL实现一个裁剪NURBS曲面的绘制。
要求:用户能交互式输入控制多面体的顶点,和剪切曲线的顶点数目和顶点坐标。
《计算机图形学》课程设计一、 设计要求1. 根据设计任务,编制程序,在机器上调试运行,并通过上机考核。
2. 按照下面的“三、课程设计报告格式”的要求,写出课程设计报告。
3. 课程设计报告在第19周之前交来。
二、 设计任务1.1)给定直线的起点坐标为P0(x0,y0)、终点坐标为P1(x1,y1),容易计算出直线斜率k 。
假设0≤k ≤1,则x 方向为主位移方向,绘制直线的递推公式为:,这称为数值微分法(Digital Differential Analyzer ,DDA ),请编程实现之。
提示:DDA 算法实质上是对直线斜率进行了四舍五入计算。
2)椭圆的扫描转换。
2.用鼠标在屏幕上绘制任意顶点数的封闭多边形并填充,填充效果如下图所示。
编程要求:⑴多边形的顶点数不受限制;⑵按下鼠标左键,拖动鼠标绘制多边形,同时按下Shift 键可以绘制水平边或垂直边; ⑶单击鼠标右键闭合多边形; ⑷使用边缘填充算法填充多边形。
⎩⎨⎧+=+=++k y y x x i i i i 1113请按照图所示,使用对话框输入直线的起点和终点坐标。
在窗口左侧区域绘制输入直线和“窗口”,在窗口右边右侧区域绘制“视区”并输出裁剪结果。
这里需要用到窗视变换的公式。
请分别用Cohen-Sutherland算法、中点分割裁剪算法和梁友栋-Barsky算法实现。
4在屏幕上使用鼠标绘制控制多边形,根据控制多边形的阶次绘制Bezier曲线和B样条曲线。
5.1)使用VC编程实现,以直角三角形为基础绘制下图所示Sierpinski三角形。
2)以屏幕范围为基础绘制下图所示Sierpinski地毯。
6.1)给定直线的起点颜色(如红色)和终点颜色(如黑色)不同,请使用中点Bresenham算法绘制任意斜率的颜色渐变直线,效果如图所示。
2)用梁友栋-Barsky算法裁剪线段P1(3,3),P2(-2,-1),裁剪窗口为wxl=0,wxr=2,wyb=0,wyt=2。
[键入文字]《计算机图形学》课程设计报告题目名称:创建旋转体专业计算机科学与技术班级学号姓名指导教师王玉昆2014年 6月 12 日创建旋转体一、设计内容与要求1.1 设计题目创建旋转体1.2 设计内容策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。
(1)一个旋转体由其外轮廓线绕其竖直中心轴旋转而成。
(2)程序要求建立一个窗口显示竖直的中心轴,并且要求实现轮廓线的编辑,具体包含功能:节点的增加、删除和节点间自动连线。
(3)程序要求建立另外一个窗口显示轮廓线绕中心轴旋转以后的三维物体,本窗口还要求实现三维物体的Phong着色和对三维物体的简单操作,具体包含:放大、缩小和旋转(4)移动光源(5)纹理映射效果(6)雾化效果(7)轮廓线使用样条技术1.3 设计目标通过课程设计,使学生具备通过具体的平台实现图形算法的设计、编程与调试的能力,完成对实验结果分析、总结及撰写技术报告的能力,达到:巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。
本系统是根据课本中的程序而开发的,基本能够实现需求中所要求的功能,通过本系统可以达到以下目标:1系统运行稳定,安全可靠。
2界面美观、友好。
3用户操作使用方便。
4生成的3D图形效果良好。
5能够正确的生成用户所要绘制的3D图形二、方案设计2.1 总体方案设计项目规划:本系统是一个基于OpenGL开发的实现能够进行人机交互的绘制3D旋转体的系统,本系统中的功能模块主要分为以下几种:矩阵运算模块:实现两个或多个矩阵的相关运算,为绘制图形提供数据结构,体现图形转化过程中的算法。
显示图形模块:用于设定图像的显示方式,绘制方法,在其中还可以设置光源位置等相关的显示信息。
键盘敲击模块:对不同的键盘敲击事件作出相应的处理,包括点线的转化,雾化效果等。
鼠标点击模块:在3D显示窗口添加的鼠标事件,对鼠标的事件作出相应的响应效果。
动作模块:根据左边用户绘制的2D图形,动态的划出右面相对应的3D图像。
找点模块:在左边的用户画图窗口进行锁定鼠标点击时靠近的点。
2.2 过程流程图三、详细设计3.1、主要功能模块设计1矩阵运算模块的设计:功能描述:程序启动后,这部分功能模块会为整个应用程序提供算法支持,具体是矩阵直接的相互运算,在2D向3D转化过程中会起到很重要的作用。
代码设计:float vv(float * v1, float * v2){return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];}void vxv(float * n, float * v1, float * v2){n[0] = v1[1] * v2[2] - v1[2] * v2[1];n[1] = v1[2] * v2[0] - v1[0] * v2[2];n[2] = v1[0] * v2[1] - v1[1] * v2[0];}void loadIdentity(Matrix m){Matrix identity = {{1.0,0.0,0.0,0.0},{0.0,1.0,0.0,0.0},{0.0,0.0,1.0,0.0},{0.0,0.0,0.0,1.0}};for(int i = 0;i < 4; i++)for(int j = 0;j < 4; j++)m[i][j] = identity[i][j];}void preMultiply(Matrix p, Matrix m){int i , j;Matrix t;for( i = 0; i < 4; i ++)for( j = 0; j < 4; j++)t[i][j] = p[i][0] * m[0][j] + p[i][1] * m[1][j] + p[i][2] * m[2][j] + p[i][3] * m[3][j];for( i = 0; i < 4; i ++)for( j = 0; j < 4; j ++)m[i][j] = t[i][j];}2显示图形模块的设计:功能描述:该模块主要为所要画的图形进行描述,是绘制图形的主要函数,通过调用这个功能模块就能画出用于显示给用户的图形。
代码设计://2D图形的display函数void display(){glClear(GL_COLOR_BUFFER_BIT);if(n == 1 && type ==GL_LINE_STRIP) {glBegin(GL_POINTS);glVertex2iv(vert[0]);glColor3f(0,0.5,0.5);glVertex2i(width-vert[0][0]-1,vert[0][1]);glEnd();}glColor3f(0,0.5,0.5);glBegin(GL_LINES);glVertex2i(width/2,0);glVertex2i(width/2,height-1);glEnd();glBegin(type);for(int i = 0;i<n;i++) glVertex2i(width-vert[i][0]-1,vert[i][1]);glEnd();glColor3f(1,1,0);glBegin(type);for(int i = 0;i<n;i++) glVertex2iv(vert[i]);glEnd();glutSwapBuffers();initQMesh();glutSetWindow(winid);glutPostRedisplay();}//3D图形的显示函数void modelDisplay(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();float M[16];for(int r = 0; r < 4; r++) for(int c = 0; c < 4; c++) M[4 * c + r] = CRM[r][c];glMultMatrixf(M);glScalef(zoom,zoom,zoom);drawQMesh();glPopMatrix();glPushMatrix();glLightfv(GL_LIGHT0,GL_AMBIENT,amb);glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);glPopMatrix();glutSwapBuffers();}3键盘敲击模块功能描述:该功能主要为两个窗体添加键盘敲击事件,在2D窗体中主要添加了反走样效果,清除所画的图,点线转化功能,对于3D窗体主要添加了投影方式的变换,雾化效果,光源移动的功能代码设计://2D绘制窗体的键盘敲击处理函数void keyboard(unsigned char key, int x,int y){switch(key){case'a': antialiasing = ! antialiasing;//反走样效果if(antialiasing){glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH);}else{glDisable(GL_BLEND);glDisable(GL_LINE_SMOOTH);}break;case'c': n = 0;break; //清除界面功能case'l': type = GL_LINE_STRIP;break; //绘制线功能case'v': type = GL_POINTS;break; //绘制点功能}glutPostRedisplay();}//3D显示窗体的键盘敲击事件处理函数:void modelKeyboard(unsigned char key, int x, int y){switch (key) {case'o':glMatrixMode(GL_PROJECTION);//正投影glLoadIdentity();glOrtho(-4,4,-4,4,6,14);glMatrixMode(GL_MODELVIEW);break;case'p':glMatrixMode(GL_PROJECTION);//侧投影,不过是默认的glLoadIdentity();gluPerspective(45.0,1.0,6.0,14.0);glMatrixMode(GL_MODELVIEW);break;case'm':lightPosition[0] = lightPosition[0] - 0.5; //光源移动break;case'n':lightPosition[1] = lightPosition[1] - 0.5;break;case'z':lightPosition[2] = lightPosition[2] - 0.5;break;case'q':glEnable(GL_FOG); // 雾化效果{glFogi(GL_FOG_MODE, GL_LINEAR);GLfloat fogColor[] = {1.9, 1.1, 2.2, 0.5};glFogfv(GL_FOG_COLOR, fogColor);glFogf(GL_FOG_START, 3.0);glFogf(GL_FOG_END, 15.0);glHint(GL_FOG_HINT, GL_DONT_CARE);}break;case'k':glDisable(GL_FOG);break;}glutPostRedisplay();}4鼠标点击模块功能描述:该功能模块主要实现了对两个窗体鼠标事件的处理,对于3D窗体实现了鼠标左键旋转,由键放大缩小的效果,2D窗体实现了左键画点,右键可以对已经存在的点改变它的位置。
代码设计://3D窗体的鼠标事件void modelMouse(int button,int state,int x,int y){switch (button){case GLUT_LEFT_BUTTON:if(state == GLUT_DOWN ){cx = x;cy = h - 1 - y;dx = dy = 0;left_button_down = true;}elseleft_button_down = false;break;case GLUT_RIGHT_BUTTON:if(state == GLUT_DOWN){cx = x;cy = h - 1 - y;right_button_down = true;}elseright_button_down = false;break;}}//2D窗体鼠标事件void mouse(int button, int state, int x ,int y){y = height - 1 - y;switch(button){case GLUT_LEFT_BUTTON:if(state == GLUT_DOWN && ! rubberbanding ){v = n++;vert[v][0] = (x < width/2) ? width/2: (x >= width) ? width - 1 : x;vert[v][1] = (y < 0) ? 0 : (y >= height) ? height -1 : y;rubberbanding = true;glutPostRedisplay();}else rubberbanding = false;break;case GLUT_RIGHT_BUTTON:if(state == GLUT_DOWN && ! rubberbanding && (v = findVertex(x,y)) != -1) {if(glutGetModifiers() == GLUT_ACTIVE_CTRL) {for (int i = v; i< n-1; i++){vert[v][0] = vert[i+1][0];vert[i][1] = vert[i+1][1];}n--;}else{vert[v][0] = (x < width/2) ? width/2 : (x >= width) ? width - 1 : x;vert[v][1] = (y < 0) ? 0 : (y >= height) ? height -1 : y;rubberbanding = true;}glutPostRedisplay();}else rubberbanding = false;break;}}5找点模块功能描述:此方法主要用于对用户所需要的点进行锁定。