崔小杰图形学课程设计

合集下载

计算机图形学教案

计算机图形学教案

计算机图形学教案一、课程简介计算机图形学是一门涉及计算机图形、图像处理和计算机视觉等领域的重要课程。

本课程将介绍计算机图形学的基本概念、原理和应用,帮助学生掌握计算机图形学的基础知识,并提升他们在图形学领域的技能。

二、课程结构1. 计算机图形学基础- 介绍计算机图形学的历史发展和基本概念- 讨论计算机图形学的应用领域和未来发展趋势- 熟悉图像处理、图形学渲染和动画等基本技术2. 图形系统建模- 学习三维图形对象的建模和表示方法- 掌握光栅化和矢量化图形处理技术- 讨论图形系统的设计和实现3. 计算机视觉- 理解视觉系统的基本原理和功能- 学习计算机视觉的算法和应用- 探讨计算机视觉在人工智能领域的应用4. 图形学编程实践- 深入学习图形学编程语言和库- 完成实际项目,提升图形学编程能力- 探索图形学在多领域的应用案例三、教学目标1. 帮助学生全面了解计算机图形学的基本知识和技术2. 培养学生分析和解决计算机图形学问题的能力3. 提升学生在图形学领域的实际操作和应用能力4. 激发学生对计算机图形学研究的兴趣和热情四、教学方法1. 理论讲解:通过课堂讲解、案例分析等方式,向学生介绍计算机图形学的基本概念和原理2. 实践操作:组织学生参与实验、项目等实际操作,巩固理论知识并提升实践能力3. 课堂互动:鼓励学生提问、讨论,促进师生间的互动和交流4. 作业考核:布置不同形式的作业,检测学生对知识的掌握情况,促进学习效果的提升五、教材参考1. 《计算机图形学导论》2. 《OpenGL图形与游戏开发实践》3. 《计算机视觉:算法与应用》4. 《经典图形学算法实例详解》六、学习评价1. 课堂表现:出勤情况、课堂参与度等2. 作业考核:课后作业、实验报告等3. 期末考核:闭卷考试、项目实践等4. 综合评价:综合考虑以上因素,对学生进行综合评定七、总结计算机图形学作为一门新兴的学科,正逐渐成为信息技术领域的热门专业之一。

实验报告格式9区域填充

实验报告格式9区域填充

学号
天津城建大学
计算机图形学实验报告
实验九区域填充
学生姓名
专业、班级
指导教师任丽敏
成绩
计算机与信息工程学院
2013 年月日
天津城建大学
设计性实验任务书
计算机与信息工程学院专业班姓名学号:
课程名称:计算机图形学
设计题目:多边形填充
完成期限:自2013 年11月8 日至2013 年11 月18 日
设计依据、要求及主要内容(可另加附页):
1设计依据:
本课程设计是依据教材<<计算机计算机图形学>>一书的第5章图形算法为设计依据, 用扫描线填充算法制作多边形填充的程序。

2设计要求:
用扫描线填充多边形
基本要求:
(1)数据输入项为:多边形的顶点数、各顶点x,y坐标。

对于扫描线填充算法要输入扫描线间距。

(2)填充区域输出在PictureBox控件中。

附加要求:(1)填充区中可内嵌多个多边形。

(2)对于扫描线填充算法使用一定距离的字符填充。

指导教师:任丽敏
实验目的:题目:
设计思想:原程序:运行结果:体会:。

安徽师范大学自动化本科专业《计算机图形学》实验课程大纲本科教学大纲

安徽师范大学自动化本科专业《计算机图形学》实验课程大纲本科教学大纲

实验类课程大纲
课程名称:计算机图形学实验
一、课程概况
所属专业: 自动化开课单位:物理与电子信息学院
课程类型: 专业实验课程课程代码: 0845470
开课学期: 5 学分: 2.5
学时:8 核心课程: 否
拟使用教材:
物理与电子信息学院编写,《计算机图形学实验讲义》。

国内(外)现有教材:
蔡士杰等译,《计算机图形学》,电子工业出版社,2012年
学习参考资料
[1] 孙家广等著,《计算机图形学》,清华大学出版社,1999年
[2] 李军,徐波等译,《OPENGL 编程指南》,机械工业出版社,2010年
二、课程描述(300字以内)
本门课程是电子信息类、自动化类等专业基础课,为学习后续课程准备必要的计算机图形学知识。

通过本课程的系列实验,使学生进一步熟悉计算机图形学的基本原理和基本概念,学会图形程序的设计方法。

掌握现代opengl程序的编写理念和编写方法,如可编程渲染流水线、纹理映射、着色器等。

三、课程目标
掌握计算机图形学基础知识,掌握扎实的图形程序编制技能,初步具备解决工程实际问题的能力。

具有综合运用计算机图形学的基础理论和技术手段,分析并解决图形及显示技术问题的能力。

具有创新意识,具备对新图形界面显示技术、新图形编程开发技术进行研究、开发和设计的初步能力。

图形学课程设计内容

图形学课程设计内容

目录一、选题背景 (1)1.1 背景及目的 (1)1.2 题目概述 (1)二、算法设计 (1)2.1 数据结构 (1)2.2 功能实现 (3)三、程序及功能说明 (3)3.1 鼠标控制正方体的旋转 (3)四、结果分析 (5)五、心得体会 (5)六、附件 (5)6.1参考文献 (5)6.2源程序 (6)计算机与通信学院课程设计评分表 (9)一、选题背景1.1 背景及目的计算机图形学是近三十年来发展迅速、应用广泛的新兴学科。

它主要研究用计算机及图形设备输入、表示、修改、变换和输出图形的原理、算法和系统。

它的主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。

1.2 题目概述本题:画出一个正方体,并将它旋转起来。

主要应实现以下4点基本要求:1.用C/C++或VB实现;2.友好性:界面要友好;3.可读性:源程序代码清晰、有层次;4.用鼠标可以决定立方体旋转速度的快慢。

题目难点在于实现可视化界面的交互、以及图像的旋转过程。

分析题目可以得出程序可以大致分为两个方面的工作内容:1.画出一个正方体。

2.使正方体旋转起来。

通过在互联网上查找资料,我决定使用OPENGL图形库来解决C/C++编写图形界面困难的问题。

二、算法设计2.1 数据结构2.1.1 opengl 及 windows 坐标系OPENGL的三维坐标系如图1所示:XOY平面为屏幕所在WINDOWS的窗体坐标如图2所示:图1 OPENGL 三维坐标系 图2WINDOWS 窗体二维坐标系2.1.2 大体设计方案综上所述,在本程序中。

首先使用相关的WINDOWS API 创建窗口,其次实现程序的相应功能:使用OPENGL 相应库函数画出正方体。

使之旋转起来。

在窗体中响应鼠标事件,控制正方体的旋转。

程序流程图如图3所示:图3 程序流程图程序的大体内容以及机构已经构造成型,功能部分还需要进一步的细化。

显然在消息循环中的内容还远不止这些,还需加入响应以下事件:当窗口大小发生变化时,重置窗口。

计算机图形学课程设计

计算机图形学课程设计

《计算机图形学》课程设计报告学院:专业:班级:姓名:学号:指导教师:年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。

CE15-剪格子

CE15-剪格子

课程设计情况概述课程设计题目:CE15-剪格子课题任务分工:目录课程设计情况概述 (I)第1章课题介绍 (1)1.1 课程设计的目的 (1)1.2 课程设计的要求 (1)1.2.1 输入与输出的要求 (1)1.2.2 程序所要实现的功能 (1)第2章总体设计 (2)2.1 DFS(Depth-First-Search)深度优先搜索算法 (2)2.1.1 算法详解 (2)2.1.2 图的深度遍历原则 (2)2.2 布尔型变量bool (4)2.3 程序流程图 (4)第3章详细设计及程序实现 (5)3.1功能实现的思路 (5)3.2 pre函数的设计 (5)3.3 search函数的设计(深度优先搜索) (5)第4章问题与解决 (7)第5章程序测试 (8)第6章总结 (10)参考文献 (12)答辩记录及评分 (13)第1章课题介绍1.1 课程设计的目的课程设计题目:剪格子;要求设计一个程序,对给定的m x n的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。

如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。

如果无法分割,则输出0。

1.2 课程设计的要求1.2.1 输入与输出的要求(1)输入给定的m x n的格子大小时,要用阿拉伯数字表示m及n;(2)输出时,如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目,用阿拉伯数字表示。

如果无法分割,则输出阿拉伯数字0。

1.2.2 程序所要实现的功能(1)对给定的m x n的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。

如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。

如果无法分割,则输出0。

第2章总体设计2.1 DFS(Depth-First-Search)深度优先搜索算法深度优先搜索(Depth-First-Search)是搜索算法的一种。

是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。

计算机图形学课程设计线框模型(DOC)

计算机图形学课程设计线框模型(DOC)

计算机图形学课程设计立方体线框模型学院:资环学院班级:地科 2 班学号:************姓名:***立方体线框模型一、设计目的1.掌握矩阵乘法的编程实现;2.熟悉二维变换;3.掌握三维立体图形的绘制;4.掌握三维绕轴旋转几何变换矩阵;5.掌握使用点表构造立方体线框模型的方法;6.掌握立方体线框模型二维正交投影图的绘制方法;7.熟悉立方体线框模型二维正交投影图的旋转方法。

二、设计要求1、设计、定义包含齐次坐标的三维点类CP3;2、设计三维几何变换类实现立方体的旋转功能,定义表面类;3.设计三维坐标系0xyz的原点为立方体体心绘制立方体线框模型;4.设计双缓冲技术,先在MemDC中绘图,然后用BitBlt将图形复制到p DC中,同时禁止背景刷新;5.生成正多边形、绘制几何变换图形;6.使用定时器动态更新图形,让图形看起来是在转动。

三、设计原理立方体线框模型的顶点坐标为三维坐标,需要构造三维点类CP3来存储顶点坐标。

同时构造直线类Cline来绘制立方体线框模型的边线。

立方体线框模型围绕体心的旋转来使用旋转变换矩阵实现的。

立方体线框模型的正交投影其各个表面四边形。

四、设计方法1.三维变换。

定义了规范齐次坐标以后,三维图形的几何变换可以表达为图形顶点集合的规范化齐次坐标矩阵与某一变换矩阵相乘的形式。

用规范化齐次坐标表示的三维变换矩阵式一个4X4方阵。

立方体旋转变换的基本方法是把旋转变换矩阵作用到变换前的立方体顶点的规范化齐次坐标矩阵上,得到变换后新的立方体顶点的规范化齐次坐标矩阵。

2.正交投影。

立方体的三维坐标系Oxyz是x轴向右,y轴向上,z轴指向观察者。

绘制立方体在xOy面上的正交投影时,直接去z坐标为0。

3.双缓冲。

用双缓冲以及定时器控制图形转动。

立方体线框模型的顶点坐标为三维坐标,需要构造三维点类CP3来存储顶点坐标。

同时构造直线类Cline来绘制立方体线框模型的边线。

立方体线框模型围绕体心的旋转来使用旋转变换矩阵实现的。

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

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

计算机图形学课程设计报告设计课题:专业班级:学号:学生:指导教师:设计时间:中南林业科技大学涉外学院理工系计算机图形学课程设计任务书指导教师:廖宁教研室主任: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类对物体实施光照。

计算机图形学课程设计

计算机图形学课程设计

河南理工大学万方科技学院课程设计报告课程名称:计算机图形学设计题目:直线快速裁剪算法组成员:专业班级:08—计算机科学与技术—01指导老师:2011-6-12目录第一章前言 (1)第二章设计内容与要求 (1)2.1 总体目标和要求 (1)2.2 内容与要求 (2)第三章总体设计 (2)3.1 矩形裁剪窗口的设计 (2)3.2 个编辑文本框的设计 (2)3.3 四个按钮的设计 (2)3.4 四个标签的设计 (3)3.5 直线段的生成算法的设计 (3)3.6直线段裁剪 (3)第四章详细设计 (4)4.1 矩形裁剪窗口的设计 (4)4.2 个编辑文本框的设计 (5)4.3 四个按钮的设计 (5)4.4 四个标签的设计 (5)4.5 直线段的生成算法的设计 (5)4.6直线段裁剪 (8)第五章功能实现 (12)5.1直线的生成 (12)5.2直线的裁剪 (13)5.3矩形窗口的大小变换 (14)第六章总结 (15)参考文献: (15)附录源代码: (16)第一章前言计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。

简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。

计算机图形学的研究内容非常广泛,像图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。

经过40 多年的发展, 计算机图形学已成为计算机科学中, 最为活跃的分支之一, 并得到广泛的应用。

其中最重要的莫过于计算机辅助设计与制造(Computer Aided Design / Computer Aided Manufacture),例如AUTOCAD 2008,Maya8.5,3ds Max 9都是这方面最领先的图形学软件。

计算机图形学课程设计报告--直线和圆中点Bresenham算法

计算机图形学课程设计报告--直线和圆中点Bresenham算法

计算机图形学课程设计报告课题名称直线和圆中点Bresenham算法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 算法绘制圆心位于屏幕客户区中心的圆。

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

要求用Bresenham 算法实现圆和直线等基本图形的绘制,并给出代码和结果截图。

3.系统开发环境 开发工具:VC 6.0操作系统:Microsoft Windows XP 4. 直线的Bresenham 算法原理 4.1中点Bresenham 算法给定直线的两个端点00111P X Y P X Y (,)和(,),可得到直线方程F(x,y)=y-kx-b=0且这时直线将平面分为三个区域:对于直线上的点,F(x,y)=0;对于直线上方的点,F(x,y)>0;对于直线下方的点,F(x,y)<0。

计算机图形学课程设计

计算机图形学课程设计

程序原代码: 程序原代码:
/*显示一个立方体*/ #include <dos.h> #include <math.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <graphics.h> #define PI 3.1415926 /*定义按键*/ #define ESC 0x11b /*以下 4 个键,依次是上 下 左 右*/ #define X_axis_clkwise 0x4800 #define X_axis_Cntclkwise 0x5000 #define Y_axis_clkwise 0x4b00 #define Y_axis_Cntclkwise 0x4d00 /*以下 2 个键,依次是 A, D*/ #define Z_axis_clkwise 0x1e61 #define Z_axis_Cntclkwise 0x2064 #define Distance_forward 0x1177 #define Distance_Backward 0x1f73 /*以下 6 个键,依次是 U, J, I, K, O, L*/ #define X_Delta_Plus 0x1675 #define X_Delta_Minus 0x246a #define Y_Delta_Plus 0x1769 #define Y_Delta_Minus 0x256b #define Z_Delta_Plus 0x186f #define Z_Delta_Minus 0x266c /*绕 X 轴旋转矩阵*/ float X_Rotate_Matrix[4][4] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }; /*绕 Y 轴旋转矩阵*/ float Y_Rotate_Matrix[4][4] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }; /*绕 Z 轴旋转矩阵*/

图形学课程设计报告书

图形学课程设计报告书

课程设计报告学生姓名:刘名凤学号:0809290102 学院:理学院班级: 信计081题目: 奥运五环指导教师:常志文职称: 教授邓冠男职称助教 2011 年 5 月 31 日目录目录 .................................................................................................................. - 2 -一、选题背景 .......................................................................................................... - 1 -1.1奥运五环设计的问题 ........................................................................ - 1 -1.2 奥运五环设计指导思想 .................................................................... - 1 -二、算法设计 .......................................................................................................... - 1 -2.1 设计原理 ............................................................................................ - 1 -2.2 算法设计的方案 ................................................................................ - 2 -2.2.1圆环求交算法 .................................................................................... - 2 -2.2.2 三维旋转变换算法 ........................................................................... - 2 -三、程序及功能说明 .............................................................................................. - 2 -3.1 程序说明 ............................................................................................ - 2 -四、结果分析 .......................................................................................................... - 5 -4.1、显示结果 ............................................................................................ - 5 -五、总结 .................................................................................................................. - 6 -六、课程设计心得体会 .......................................................................................... - 7 -参考文献 .................................................................................................................. - 8 -源程序 (1)一、选题背景1.1奥运五环设计的问题计算机图形学是计算机科学最活跃的分支之一,它伴随着计算机技术的发展而发展。

图形学课程设计带报告

图形学课程设计带报告

图形学课程设计带报告一、教学目标本课程的教学目标是使学生掌握图形学的基本概念、原理和技能,能够运用图形学知识解决实际问题。

具体目标如下:知识目标:学生能够理解图形学的基本概念,如点、线、面、图等,掌握图形的表示方法和运算规律。

技能目标:学生能够熟练使用图形学相关软件,如Photoshop、Illustrator等,进行图形的创建、编辑和变换。

情感态度价值观目标:培养学生对图形学的兴趣和热情,提高学生审美能力和创新意识。

二、教学内容根据课程目标,教学内容主要包括以下几个方面:1.图形学基本概念:点、线、面、图等的基本概念和性质。

2.图形表示方法:坐标系、向量、矩阵等表示方法。

3.图形运算规律:图形的变换、组合、裁剪等运算规律。

4.图形软件使用:Photoshop、Illustrator等图形软件的基本操作和技巧。

5.图形创作实践:进行图形创作,培养学生的审美能力和创新意识。

三、教学方法为了达到课程目标,采用多种教学方法相结合的方式进行教学:1.讲授法:讲解图形学的基本概念、原理和技能。

2.案例分析法:分析经典图形创作案例,引导学生进行思考和讨论。

3.实验法:让学生动手实践,使用图形软件进行图形创作。

4.小组讨论法:分组进行讨论,促进学生之间的交流和合作。

四、教学资源为了支持教学内容和教学方法的实施,准备以下教学资源:1.教材:选择合适的图形学教材,为学生提供系统的学习资料。

2.参考书:提供相关的参考书籍,丰富学生的知识储备。

3.多媒体资料:制作PPT、视频等多媒体资料,生动形象地展示图形学知识。

4.实验设备:准备图形软件、计算机等实验设备,保证学生能够进行实践操作。

五、教学评估为了全面、客观地评估学生的学习成果,本课程采用以下评估方式:1.平时表现:通过课堂参与、提问、讨论等方式评估学生的学习态度和积极性。

2.作业:布置适量的作业,评估学生的理解和应用能力。

3.考试:进行期中和期末考试,评估学生对课程知识的掌握程度。

大学五年级计算机形学教案探索计算机形学的算法与渲染技术

大学五年级计算机形学教案探索计算机形学的算法与渲染技术

大学五年级计算机形学教案探索计算机形学的算法与渲染技术大学五年级计算机形学教案——探索计算机形学的算法与渲染技术导语:计算机形学作为计算机科学领域中的一个重要分支,主要研究计算机图形学中的算法与渲染技术。

本教案旨在帮助大学五年级的计算机专业学生全面了解计算机形学的基本概念、常用算法和渲染技术,并通过实践训练提升其计算机形学的应用能力。

一、引言计算机形学是计算机图形学中的重要研究领域,通过使用数学和计算方法,实现对图像和三维对象的处理、分析、合成和渲染。

计算机形学不仅在电影、游戏、动画等娱乐产业中具有广泛应用,也在医学、工程设计等领域中发挥重要作用。

二、计算机形学的基本概念1. 三维几何图形三维几何图形是计算机形学的基础,通过使用三维坐标系表示空间中的点、线和面,实现对三维物体的描述和处理。

学生需要掌握三维坐标系的基本表示方法和坐标变换技术。

2. 光栅化技术光栅化是将连续的几何图形转化为离散的像素点的过程。

在计算机形学中,光栅化技术广泛应用于图像的绘制和三维物体的渲染。

学生需要了解光栅化算法的原理和常用实现方法。

三、计算机形学的常用算法1. 直线段绘制算法直线段绘制是计算机形学中的基础操作之一,常用算法有DDA算法和Bresenham算法。

学生需要了解这两种算法的原理和实现过程,并进行实践操作。

2. 多边形填充算法多边形填充是计算机形学中常见的图像渲染技术,常用算法有扫描线填充算法和边界填充算法。

学生需要学习这些算法的思想和实现,能够实现对多边形区域的颜色填充。

3. 三维物体的可视化算法三维物体的可视化是计算机形学中的重要研究内容,学生需要了解三维物体的表示方法和可视化算法,如线框模型、隐藏面消除算法和光照模型等。

学生可以通过实践练习来深入理解这些算法的应用。

四、计算机形学的渲染技术1. 光照模型光照模型是计算机形学中的重要概念,用于模拟物体表面的光照效果。

学生需要学习经典的光照模型,如Lambert模型和Phong模型,并能够应用这些模型进行场景的渲染。

大学四年级计算机形学实验教学方案

大学四年级计算机形学实验教学方案

大学四年级计算机形学实验教学方案一、实验目的计算机形学是计算机科学与技术专业的重要课程之一,旨在通过实验让学生掌握计算机图形学的基本原理与应用技巧。

本实验教学方案的目的是为了培养学生对计算机形学的兴趣,提高他们的实践能力和问题解决能力。

二、实验内容1. 线性变换实验:通过实现和应用基本的线性变换方法,如平移、旋转、缩放等,让学生理解线性变换对计算机形象的影响。

2. 线段生成实验:通过代码实现线段生成算法,如DDA算法、Bresenham算法等,让学生掌握线段生成的原理和基本算法。

3. 多边形填充实验:介绍多边形填充算法,如扫描线填充算法、种子填充算法等,并让学生实现并应用这些算法。

4. 颜色与纹理实验:介绍颜色和纹理的基本概念,以及如何在计算机图形学中应用颜色和纹理。

5. 三维变换与投影实验:通过实现三维变换和投影算法,让学生理解三维图形的表示和变换,以及三维图形的投影原理。

6. 光照与阴影实验:介绍光照和阴影的基本原理,让学生了解光照对计算机图形的影响,并实现简单的光照和阴影效果。

7. 算法优化实验:通过实验和讨论,引导学生思考如何优化计算机形学算法,提高算法的性能和效率。

三、实验要求1. 学生应具备计算机图形学相关理论知识,熟悉C++或者其他编程语言。

2. 学生应主动参与实验课程,积极思考和解决问题。

3. 学生需按时完成实验报告,详细记录实验过程、结果和思考。

四、实验步骤1. 实验前准备:学生需要提前了解实验内容和要求,熟悉相关算法和编程语言。

2. 实验环境搭建:学生需要在计算机上安装相应的图形学开发环境,如OpenGL、DirectX等。

3. 实验过程:根据教师的指导,学生逐步完成实验要求,包括代码编写、算法实现和结果展示等。

4. 实验总结:学生需要撰写实验报告,总结实验过程和结果,并提出自己的思考和建议。

五、实验评估1. 实验报告评分:根据学生提交的实验报告质量和完成情况,评定学生的实验成绩。

图形学课设报告

图形学课设报告

武汉工业学院《计算机图形学》课程设计题目:绘制三次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样条曲线。

计算机图形学课程设计

计算机图形学课程设计
此外,尽管对于图形学的相关算法设计比较了解,但因为具体实现过程中,相关的代码的设计错误,以及对MFC不够了解,导致开发进度缓慢。对该问题,我一方面对代码的构建更加仔细,另一方面积极利用身边的资源进行疑难解答。最后终于排除了种种困难,基本实现了课设的要求。同时,我也应当看到此次课程设计的一些不足,例如三大模块最后并没有整合在一起,对于直线起点终点,圆的中点等信息无法由外界定义,这些问题,假以时日,定能得到改进。
}
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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《计算机图形学》课程学习报告项目题目:正投影变换专业:网络工程学号:112055126姓名:崔小杰指导教师:李丽亚2014年6月目录1.项目描述 (2)1.1任务综述 (2)1.2效果图 (2)2.原理分析 (3)3.算法设计 (5)3.1球表面坐标计算 (5)3.2保存球表面面片以及面片属性 (5)4.源代码清单 (6)5.项目总结 (11)5.1存在问题 (11)5.2项目改进 (11)5.3总结 (11)一、项目描述1.1项目综述真实感图形绘制是计算机图形学的一个重要组成部分。

它综合利用数学、物理学、计算机科学和其他学科知识在计算机图像设备上生成像彩色照片那样的真实感图形。

要用计算机图形设备绘制场景的真实感图形,就必须首先在计算机中建立该场景的模型,用这个模型来反映场景的特点和属性。

有了三维场景的模型,并给定了观察点和观察方向以后,就可以通过几何变换和投影变换在屏幕上显示该三维场景的二维图像。

为了使二维图像具有立体感,并尽可能逼真地显示出该物体在现实世界中被观察到的形象,就需要运用适当的光照模型,来模拟场景在现实世界中受到的各种光源照射时的效果,这就是真实感图形的画面绘制技术,也就是真实感图形的生成技术。

1.2效果图二、原理分析用计算机在图形设备上生成连续色调的真实感图形大致可以分为以下四步:第一步,用数学方法建立所需三维场景的几何描述,并将它们输入至计算机。

第二步,讲三维几何描述转换为二维投影图。

这可以通过对场景的投影变换来完成。

第三步,确定场景中的所有可见面,这需要使用消隐算法将被其他物体遮挡的不可见部分消去。

第四步,计算场景中可见面的颜色,严格地说,就是根据基于光学物理的光照明模型计算可见面投射到观察者眼中的光亮度大小和色彩分量,并将它转换成适合图形设备的颜色值,从而确定投影画面上每一像素的颜色,最终生成图形。

球体表面的函数方程式如下:其中,坐标(x0,y0,z0)为球心坐标,而坐标(x,y,z)为球面上的参数点坐标,r为半径,u、w分别为经度和纬度参数变量。

光照效果:为了模拟光源照射在景物表面所产生的光照效果,就需要用到光照模型,光照模型是生成真实感图形的基础。

光照模型是根据光学物理的有关定律,计算景物表面上任一点投向观察者眼中的光亮度的大小和色彩组成的公式。

从光源发出的光照射到景物表面时,会出现以下四种情形:(1)经景物表面向外反射形成反射光;(2)若景物透明,则入射光会穿透该景物,从而产生透射光;(3)若景物透明,入射光在穿透景物时会产生散射光;(4)部分入射光将被景物吸收而转换成热。

物体表面的反射光和透射光的光谱分布决定了景物表面呈现的颜色,反射光和透射光的强弱则决定了景物表面的明暗程度。

显然,反射光和透射光决定于入射光的强弱、光谱组成以及景物表面对入射光中不同波长光的吸收程度。

例如,当一束白光照射在一个吸收除红光以外所有不同波长光的不透明景物表面上时,景物呈红色。

但若用一束绿光或蓝光照射该景物,则它将呈黑色。

物体表面的反射光可分为漫反射光和镜面反射光。

漫反射光可以认为是光穿过物体表面层被部分吸收后,重新发射出来的光。

因此,漫反射光均匀地散布在各个方向,观察者不论站在哪一方位上,他所观察到的漫反射光的强度均相等。

三、算法设计1. 在屏幕左半部分绘制三维坐标系。

2. 在屏幕右半部分绘制二维坐标系。

3. 读入长方体的三维顶点齐次坐标及其面坐标,并将三维顶点齐次坐标变换为相应的屏幕二维齐次坐标,并在屏幕左半部分绘制长方体。

4. 分别给主视图、俯视图和侧视图变换矩阵的非零元素赋值。

5. 将原始图形的顶点集合齐次坐标矩阵和三视图变换矩阵相乘,结果赋予变换后的三视图顶点集合齐次坐标矩阵。

其中,主视图变换矩阵为:俯视图变换矩阵为:主视图变换矩阵为:6. 根据变换后的顶点集合齐次坐标矩阵的元素绘制三视图。

四、源代码清单group7View.h文件lass CMygroup7View : public CView{protected: // create from serialization onlyCMygroup7View();DECLARE_DYNCREATE(CMygroup7View)// Attributespublic:CMygroup7Doc* GetDocument();// Operationspublic:int ViewKind;// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CMygroup7View)public:virtual void OnDraw(CDC* pDC); // overridden to draw this viewvirtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected:virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);//}}AFX_VIRTUAL// Implementationpublic:void ClearMatrix(double A[4][4]);//清除矩阵函数void Calculate(double P[][4],double T[][4]);//两个矩阵相乘函数double Pt3D[8][4];double Pt2D[8][2];int MaxY;int MaxX;int Ft[6][5];void Transform3DTo2D(const double P3D[][4],double P2D[][2],const int n);//三维变二维void ReadPoint();//读入顶点坐标函数void ReadFace();//读入面坐标函数void KeepOriginalMatrix(double Orig[][4],double Dest[][4]);void GetMaxY();//获得屏幕的最大y值函数void GetMaxX();//获得屏幕的最大x值函数void DrawTriView(double Tri[8][4]);//绘制三视图调用函数void DrawLine(CPoint p[],int num);//绘制多边形边线函数void DrawCube();//绘制立方体函数virtual ~CMygroup7View();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:// Generated message map functionsprotected://{{AFX_MSG(CMygroup7View)afx_msg void OnDrawHView();afx_msg void OnDrawWView();afx_msg void OnDrawVView();afx_msg void OnDrawresource();//}}AFX_MSGDECLARE_MESSAGE_MAP()};#ifndef _DEBUG // debug version in group7View.cppinline CMygroup7Doc* CMygroup7View::GetDocument(){ return (CMygroup7Doc*)m_pDocument; }#endif///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_group7VIEW_H__15A74253_C6B0_462A_83DC_3F71E576EE24__INCLUDED_)group7View.cpp文件// group7View.cpp : implementation of the CMygroup7View class#include"stdafx.h"#include"group7.h"#include"group7Doc.h"#include"group7View.h"#define ROUND(a) int(a+0.5)//四舍五入#define PI 3.1415926//圆周率#include"math.h"//数学头文件#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CMygroup7ViewIMPLEMENT_DYNCREATE(CMygroup7View, CView)BEGIN_MESSAGE_MAP(CMygroup7View, CView)//{{AFX_MSG_MAP(CMygroup7View)ON_COMMAND(ID_DRAW_H_VIEW, OnDrawHView)ON_COMMAND(ID_DRAW_W_VIEW, OnDrawWView)ON_COMMAND(ID_DRAW_V_VIEW, OnDrawVView)ON_COMMAND(ID_DRAWRESOURCE, OnDrawresource)//}}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()///////////////////////////////////////////////////////////////////////////// // CMygroup7View construction/destructionCMygroup7View::CMygroup7View(){// TODO: add construction code here}CMygroup7View::~CMygroup7View(){}BOOL CMygroup7View::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////// // CMygroup7View drawingvoid CMygroup7View::OnDraw(CDC* pDC){//CMygroup7Doc* pDoc = GetDocument();//ASSERT_VALID(pDoc);GetMaxX();GetMaxY();CPen MyPen3d,MyPen2d,MyPen,*OldPen;MyPen3d.CreatePen(PS_SOLID,1,RGB(0,0,255));OldPen=pDC->SelectObject(&MyPen3d);pDC->MoveTo(MaxX/4,MaxY/2);//绘制y轴pDC->LineTo(MaxX/2-25,MaxY/2);pDC->TextOut(MaxX/2-50,MaxY/2-20,"y");pDC->MoveTo(MaxX/4,MaxY/2);//绘制z轴pDC->LineTo(MaxX/4,0);pDC->TextOut(MaxX/4-20,10,"z");pDC->MoveTo(MaxX/4,MaxY/2);//绘制x轴pDC->LineTo(MaxX/4-MaxY/2,MaxY);//夹角为135°pDC->TextOut(MaxX/4-MaxY/2+70,MaxY-30,"x");pDC->TextOut(MaxX/4-20,MaxY/2-10,"0");pDC->TextOut(20,20,"长方体");pDC->SelectObject(OldPen);MyPen3d.DeleteObject();MyPen.CreatePen(PS_SOLID,3,RGB(0,255,0));OldPen=pDC->SelectObject(&MyPen);pDC->MoveTo(MaxX/2-25,0);//绘制分割线pDC->LineTo(MaxX/2-25,MaxY);pDC->SelectObject(OldPen);MyPen.DeleteObject();if(ViewKind==1){MyPen2d.CreatePen(PS_SOLID,1,RGB(0,0,255));OldPen=pDC->SelectObject(&MyPen2d);pDC->MoveTo(MaxX/2-25,MaxY/2);//绘制x轴pDC->LineTo(3*MaxX/4,MaxY/2);pDC->TextOut(MaxX/2-15,MaxY/2-20,"x");pDC->MoveTo(3*MaxX/4,MaxY/2);//绘制z轴pDC->LineTo(3*MaxX/4,0);pDC->TextOut(3*MaxX/4-20,10,"z");pDC->MoveTo(3*MaxX/4,MaxY/2);//绘制右y轴pDC->LineTo(MaxX,MaxY/2);pDC->TextOut(MaxX-20,MaxY/2-20,"y");pDC->MoveTo(3*MaxX/4,MaxY/2);//绘制下y轴pDC->LineTo(3*MaxX/4,MaxY);pDC->TextOut(3*MaxX/4-20,MaxY-20,"y");pDC->TextOut(MaxX/2+10,20,"三视图");pDC->SelectObject(OldPen);MyPen2d.DeleteObject();}else{MyPen2d.CreatePen(PS_SOLID,1,RGB(0,0,255));OldPen=pDC->SelectObject(&MyPen2d);pDC->MoveTo(3*MaxX/4,MaxY/2);//绘制z轴pDC->LineTo(3*MaxX/4,0);pDC->TextOut(3*MaxX/4-20,10,"z");pDC->MoveTo(3*MaxX/4,MaxY/2);//绘制右y轴pDC->LineTo(MaxX,MaxY/2);pDC->TextOut(MaxX-20,MaxY/2-20,"y");pDC->TextOut(MaxX/2+10,20,"投影图");pDC->SelectObject(OldPen);MyPen2d.DeleteObject();}CMygroup7Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here}///////////////////////////////////////////////////////////////////////////// // CMygroup7View printingBOOL CMygroup7View::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CMygroup7View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: add extra initialization before printing}void CMygroup7View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}///////////////////////////////////////////////////////////////////////////// // CMygroup7View diagnostics#ifdef _DEBUGvoid CMygroup7View::AssertValid() const{CView::AssertValid();}void CMygroup7View::Dump(CDumpContext& dc) const{CView::Dump(dc);}CMygroup7Doc* CMygroup7View::GetDocument() // non-debug version is inline {ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMygroup7Doc)));return (CMygroup7Doc*)m_pDocument;}#endif//_DEBUG///////////////////////////////////////////////////////////////////////////// // CMygroup7View message handlersvoid CMygroup7View::OnDrawHView() //绘制H面{if(ViewKind!=1){ViewKind=1;RedrawWindow();}ReadPoint();ReadFace();DrawCube();double TH[4][4];//俯视图变换矩阵double Ptemp[8][4];ClearMatrix(TH);TH[0][0]=1;TH[1][2]=-1;TH[3][2]=-50;TH[3][3]=1;KeepOriginalMatrix(Pt3D,Ptemp);Calculate(Ptemp,TH);DrawTriView(Ptemp);// TODO: Add your command handler code here }void CMygroup7View::OnDrawWView() //绘制W面{if(ViewKind!=1){ViewKind=1;RedrawWindow();}ReadPoint();ReadFace();DrawCube();double TW[4][4];//俯视图变换矩阵double Ptemp[8][4];ClearMatrix(TW);TW[1][0]=-1;TW[2][2]=1;TW[3][0]=-50;TW[3][3]=1;KeepOriginalMatrix(Pt3D,Ptemp);Calculate(Ptemp,TW);DrawTriView(Ptemp);// TODO: Add your command handler code here}//绘制立方体函数void CMygroup7View::DrawCube(){CPoint p[5];//定义多边形顶点数组Transform3DTo2D(Pt3D,Pt2D,8);int TotalEdge,PointNumber;for(int face=0;face<6;face++){TotalEdge=Ft[face][0];//每个面的总边数for(int edge=1;edge<=TotalEdge;edge++)//边循环{PointNumber=Ft[face][edge];//面的顶点号p[edge]=CPoint(ROUND(MaxX/4+Pt2D[PointNumber][0]),ROUND(MaxY/2+Pt2D[PointNumber][1] ));}DrawLine(p,TotalEdge);//绘制多边形}}//绘制多边形边线函数void CMygroup7View::DrawLine(CPoint p[], int num){CClientDC dc(this);for(int i=1;i<=num;i++)if(i==1)dc.MoveTo(p[1]);elsedc.LineTo(p[i]);dc.LineTo(p[1]);}//绘制三视图调用函数void CMygroup7View::DrawTriView(double Tri[][4]){CPoint p[5];int TotalEdge,PointNumber;for(int face=0;face<6;face++){TotalEdge=Ft[face][0];//每个面的总边数for(int edge=1;edge<=TotalEdge;edge++)//边循环{PointNumber=Ft[face][edge];//面的顶点号p[edge]=CPoint(ROUND(3*MaxX/4-Tri[PointNumber][0]),ROUND(MaxY/2-Tri[PointNumber][2] ));}DrawLine(p,TotalEdge);}}//获得屏幕的最大x值函数void CMygroup7View::GetMaxX(){CRect Rect;GetClientRect(&Rect);MaxX=Rect.right;}//获得屏幕的最大y值函数void CMygroup7View::GetMaxY(){CRect Rect;GetClientRect(&Rect);MaxY=Rect.bottom;}void CMygroup7View::KeepOriginalMatrix(double Orig[][4], double Dest[][4]) {int i,j;for(i=0;i<8;i++)for(j=0;j<4;j++)Dest[i][j]=Orig[i][j];}//读入面坐标函数void CMygroup7View::ReadFace(){Ft[0][0]=4;Ft[0][1]=0;Ft[0][2]=1;Ft[0][3]=2;Ft[0][4]=3;Ft[1][0]=4;Ft[1][1]=3;Ft[1][2]=0;Ft[1][3]=4;Ft[1][4]=7;Ft[2][0]=4;Ft[2][1]=7;Ft[2][2]=4;Ft[2][3]=5;Ft[2][4]=6;Ft[3][0]=4;Ft[3][1]=6;Ft[3][2]=2;Ft[3][3]=1;Ft[3][4]=5;Ft[4][0]=4;Ft[4][1]=5;Ft[4][2]=1;Ft[4][3]=0;Ft[4][4]=4;Ft[5][0]=4;Ft[5][1]=6;Ft[5][2]=2;Ft[5][3]=3;Ft[5][4]=7;}//读入顶点坐标函数void CMygroup7View::ReadPoint(){Pt3D[0][0]=0;Pt3D[0][1]=0;Pt3D[0][2]=0;Pt3D[0][3]=1;Pt3D[1][0]=100;Pt3D[1][1]=0;Pt3D[1][2]=0;Pt3D[1][3]=1;Pt3D[2][0]=100;Pt3D[2][1]=200;Pt3D[2][2]=0;Pt3D[2][3]=1;Pt3D[3][0]=0;Pt3D[3][1]=200;Pt3D[3][2]=0;Pt3D[3][3]=1;Pt3D[4][0]=0;Pt3D[4][1]=0;Pt3D[4][2]=300;Pt3D[4][3]=1;Pt3D[5][0]=100;Pt3D[5][1]=0;Pt3D[5][2]=300;Pt3D[5][3]=1;Pt3D[6][0]=100;Pt3D[6][1]=200;Pt3D[6][2]=300;Pt3D[6][3]=1;Pt3D[7][0]=0;Pt3D[7][1]=200;Pt3D[7][2]=300;Pt3D[7][3]=1;}//三维变二维函数void CMygroup7View::Transform3DTo2D(const double P3D[][4], double P2D[][2], const int n) {for(int i=0;i<n;i++){P2D[i][0]=P3D[i][1]-P3D[i][0]/sqrt(2.0);P2D[i][1]=-P3D[i][2]+P3D[i][0]/sqrt(2.0);}}void CMygroup7View::OnDrawVView() //绘制V面{if(ViewKind!=1){ViewKind=1;RedrawWindow();}ReadPoint();ReadFace();DrawCube();double TV[4][4];//主视图变换矩阵double Ptemp[8][4];ClearMatrix(TV);TV[0][0]=1;TV[2][2]=1;TV[3][3]=1;KeepOriginalMatrix(Pt3D,Ptemp);Calculate(Ptemp,TV);DrawTriView(Ptemp);// TODO: Add your command handler code here}//两个矩阵相乘函数void CMygroup7View::Calculate(double P[][4], double T[][4]){double Ptemp[8][4];KeepOriginalMatrix(P,Ptemp);for(int i=0;i<8;i++){for(int j=0;j<4;j++){P[i][j]=Ptemp[i][0]*T[0][j]+Ptemp[i][1]*T[1][j]+Ptemp[i][2]*T[2][j]+Ptemp[i][3]*T[3 ][j];}for(int j=0;j<3;j++){P[i][j]=P[i][j]/P[i][3];}P[i][3]=1;}}void CMygroup7View::ClearMatrix(double A[][4])//清除矩阵{for(int i=0;i<4;i++){for(int j=0;j<4;j++)A[i][j]=0;}}void CMygroup7View::OnDrawresource() //绘制长方体{RedrawWindow();AfxGetMainWnd()->SetWindowText("正投影变换");ReadPoint();ReadFace();DrawCube();// TODO: Add your command handler code here}五、项目总结5.1存在问题现在的程序还存在以下问题:(1)当对窗口进行大小或者其他变动,图像会消失,没有重画。

相关文档
最新文档