计算机图形学教案 联系客服

发布时间 : 星期日 文章计算机图形学教案更新完毕开始阅读eb365b80312b3169a551a4ba

补充上机实验章节:VC6快速入门

教学学时:2课时 教学目的与要求:

让学生初步掌握VC6编译器的集成开发环境和使用,熟悉VC框架结构,熟悉单文档/视结构的框架,熟悉类向导的使用,要求学习完毕后学生能快速的进行VC环境下的编程,能编写简单的对话框程序,能将菜单映射到函数,实现简单的VC框架编程。 定位:

不是VC专业教程,不讲VC具体知识,比如里面的字符,循环,消息映射,虚函数,多态,继承,重载等等概念。

是对具体编程步骤的一个简单指导,快速实质性学习VC的一个速成指南,一个快速上机操作的例子。具体用到哪些知识必要时候做些解释。

主要针对图形学编程,但是开发方法完全可以推广到其它方面编程,是对以前学习高级程序语言设计的提高与应用。 主要内容:

第一部分:创建简单的对话框应用程序 第二部分:创建简单的单文档视图文档结构 第三部分:在第二步的基础上创建一个对话框

教学重点:类向导的使用,从菜单到函数的映射,对话框类的使用和添加,

VC编程规范。

思考题:

1、什么是面向对象的编程语言?特点有哪些?

2、总结一下类向导的功能,思考一下如果使用类向导这个工具的逆过程,是不是可以一下子看清楚复杂程序的结构。 3、什么是继承,注意父类public同protect和private类型变量或成员函数被继承到子类的不同。

第二章 直线扫描转换算法

教学学时:8课时 教学目的与要求:

让学生初步掌握生成直线的几种算法,逐点绘制直线方法,dda绘制直线方法,Bresenham绘制直线方法,掌握算法的理论原理,学会从理论上的算法转换到编译程序中的代码实现这个思维过程,能够分析基本算法的优缺点,掌握算法的改良后适合计算机实现的算法,了解计算机计算和理论计算的差异。最后了解直线的线宽,其他线型的算法实现,了解VC语言中提供的简单绘制二维基本图形的各种函数。

教学重点:逐点绘制直线基本方法和改进,dda绘制直线基本方法和改进,

Bresenham绘制直线基本方法和改进,实现线宽线型的算法。

教学内容:

2.1 光栅图形学 2.2 逐点画线算法 2.3 DDA画线算法 2.4 BRESENHAM画线算法 2.5 关于线宽线型

2.6 Visual C++中基本绘图函数

2.1 光栅图形学

计算机图形学已成为计算机技术中发展最快的领域,计算机图形软件也相应得到快速发展。计算机绘图显示有屏幕显示、打印机打印图样和绘图机输出图样等方式,其中用屏幕显示图样是计算机绘图的重要内容。

计算机上常见的显示器为光栅图形显示器,光栅图形显示器可以看作像素的矩阵。像素是组成图形的基本元素,一般称为“点”。通过点亮一些像素,灭掉另一些像素,即在屏幕上产生图形。在光栅显示器上显示任何一种图形必须在显示器的相 应像素点上画上所需颜色,即具有一种或多种颜色的像素集合构成图形。确定最佳接近图形的像素集合,并用指定属性写像素的过程称为图形的扫描转换或光栅化。对于一维图形,在不考虑线宽时,用一个像素宽的直、曲线来显示图形。二维图形的光栅化必须确定区域对应的像素集,并用指定的属性或图案进行显示,即区域 填充。

图形光栅化和光栅化图形的处理就是光栅图形学的研究内容。 光栅图形学算法特点:

1.要充分考虑屏幕像素,光栅的特性,如何逼近真实图形,如何减小这个误差,如何提高图形处理速度是图形学算法的追求。

2.编写计算机图形学算法,最好还要具备计算方法的基础知识,了解计算机是如何求解方程,了解求解过程与实际人思维的不同,也就是把人思维的计算方法翻译到机器,这就是计算方法研究的内容。 光栅图形学的研究内容: ? ? ? ? ? ? ?

2.2 逐点画线算法

逐点比较法算法的基本思想是:在绘制直线的过程中,每绘制一个点就与原直线进行比较,根据比较的结果决定下一步的走向,这样一步一步逼近直线,逐点比较法的执行过程如下:

2.3 DDA画线算法

数值微分法(Digital Differential Analyzer)是一种基于直线微分方程来生成直线的方法。回顾一下数值微分的几何意义,一阶数值微分反应的是变化率,表达瞬时变化趋势和快慢的量。 简单的DDA绘制直线算法 对称的DDA绘制直线算法

2.4 BRESENHAM画线算法

直线段的扫描转换算法 圆弧的扫描转换算法

多边形的扫描转换与区域填充 字符 裁剪 反走样 消隐

Bresenham算法是计算机图形学领域中使用最广泛的直线扫描转换算法。该算法最初是为数字绘图仪设计的。由于它也适用于光栅图形显示器,所以后来被广泛用于直线的扫描转换与其他一些应用。为了讨论方便,学习的开始也假定直线的斜率在0、l之间。其他情况可类似处理。过各行、 各列像素中心构造一组虚拟网格线, 按直线从起点到终点的顺序计算直线与各垂直网格线的交点, 然后确定该列像素中与该交点最近的像素。

2.5 关于线宽线型

前面我们编程实现的画图算法都是一个像素宽度的连续的直线(逐点画线法画出来的线粗细步均匀),实际使用中我们经常还需要用到各种宽度不同的线,实线,还有虚线来表达不同的含义。常用商业软件都提供了类似的功能,比如word,autocad等等软件。

要产生具有宽度的线,可以顺着扫描所生成的单像素线条轨迹, 移动一把具有一定宽度的“刷子”来获得,“刷子”的形状可以是一条线段或一个正方形。也可以采用区域填充的办法间接地产生有宽度的线(如AutoCAD系统即是)。

垂直线刷子 水平线刷子 方形刷子

在绘图应用中常用到不同线型的线条,以便区分各种不同的意义。如采用实线表示立体线框图中可见的轮廓线,用虚线表示不可见的轮廓线, 用点划线表示中心线等等。

线型可以用一个布尔值的序列来存放。例如,用一个 32 位整数可以存放 32 个布尔值。用这样的整数存放线型定义时,线型必须以 32 个像素为周期进行重复。可按下述语句写像素:

if(位串[i2])drawpixel(x, y,color);

其中i为循环变量,在扫描转换算法的内循环中,每处理一个像素就递增 1,然后除以 32 取余。

在我们选用的教材上(P32),使用了一种最灵活的方式画虚线,通过定义实线和虚线的距离来选择绘图像素点。

这种方法有个缺点,那就是直线段的总长度可能不是实线部分加上虚线部分距离的整数倍,可能会造成绘制虚线二头端点为空的情况。还有个缺点,那就是大量的除法计算效果不太好。