第2章绘图基础 下载本文

教案首页

课程名称 授课日期

计算机图形学 2013年 3 月 日 第 周第 次课

授课教师 授课班级

2010级1班

周 次 课 题

VC++ 6.0 绘图基础

教学目的、要求

1.掌握 MFC 上机操作步骤 2.了解 CDC 类结构和 GDI 对象 3.熟练掌握基本绘图函数

课程类型 重 难

点 点

理论 基本绘图函数 VC++绘制图形

学时 2

教学方法 教学手段

理论与实践相结合的引导、启发式教学方法 多媒体与其它方式结合

教学进程(内容安排、时间分配、作业等) 1. 面向对象程序设计基础(10min) 2.

MFC 上机操作步骤(10min)

3. 基本绘图函数(75min) 4. 小结、布置作业(5min)

1

教学过程

2.1 面向对象程序设计基础

VC++语言开发的图形,与使用 Turbo C 语言开发的图形相比,优点: (1)可以显示真彩色,

(2)可以实现交互式绘图。如图 2-1 和 2-2 所示,

图 2-1 Turbo C 绘制的谢尔宾斯基海绵

图 2-2 Visual

C++ MFC 框架绘制的谢尔宾斯基海绵

2.1.1 类和对象

类是用户自己定义的一种数据类型,是封装属性和操作的基本单元。 类的属性用数据成员表示,类的操作用成员函数表示。 对象是用“类”类型定义的“变量”,称为类的实例。 1. 类的定义 【格式】 class 类名 {

public:

数据成员和成员函数的声明; private:

数据成员和成员函数的声明; protected:

数据成员和成员函数的声明; };

类的特点:

封装性和隐蔽特性。 2. 类成员函数的定义 【格式】

类型说明符 类名::成员函数名(<参数表列>) {

2

函数体;

}

::为作用域运算符,指明该成员函数是属于哪一个类的。 3. 对象的定义 【格式】

类名 对象表列(<参数表列>);

一个类被定义后,并不占用内存空间,只有当类被实例化为对象后,对象才占用内存空 间。

类是永恒的,对象是暂时的,类和对象的关系就象人类和每个人的关系一样,人类永远 存在,而每个人都有诞生和死亡。

2.1.2 构造函数和析构函数

构造函数和析构函数是负责对象的创建和撤销的特殊成员函数。构造函数的作用是创建 对象时对数据成员进行初始化,析构函数的作用是撤销对象时清理对象占用的内存空间。 构造函数的名称与类名相同,而析构函数的名称是由构造函数名称前加上取反运算符 “~”构成。

构造函数和析构函数是特殊的成员函数,二者都没有数据类型和返回值且不需要用户调

用,在创建和撤销对象时由系统自动执行。 例 1 设计一个长方形 Rect 类,调用类的成员函数计算长方形的周长和面积。

#include\ class Rect//定义长方形类{ public:

Rect(int,int);//声明带参构造函数 ~Rect();//声明析构函数 double circum();//声明周长函数 double area();//声明面积函数 private:

int length,width;//声明长方形的长度和宽度 };

Rect::Rect(int len,int w) {//定义带参构造函数

length=len; width=w;

cout<<\建立对象\ }

Rect::~Rect(){//定义析构函数

cout<<\撤销对象\ }

3

double Rect::circum(){//定义周长函数

return 2*(length+width); }

double Rect::area(){//定义面积函数

return length*width; }

void main(){//主函数

Rect r(30,20),*p=&r;//定义对象和对象指针 //用对象输出周长和面积

cout<<\周长为:\输出周长 cout<<\面积为:\输出面积 //用对象指针输出周长和面积

cout<<\周长为:\输出周长 cout<<\面积为:\输出面积 }

图 2-3 长方形的输出结果

2.1.3 对象的动态建立和释放

建立对象:new 撤销对象:delete 例如:

建立对象:Rect *p=new Rect(30,20);

用 new 动态分配指定大小的存储空间后,返回一个指向该对象的指针,即所分配的存 储空间的起始地址,可以通过指针 p 来访问该对象。 释放对象:delete p;

例 2 建立一个图 2-5 所示的桶类,其中数据成员 Scanline 为扫描线的位置,next 为指 向下一结点的指针。请动态建立两个桶结点,并依次输出其扫描线位置。 #include\ class Bucket{//定义桶类

ScanLine public:

int ScanLine;//声明扫描线位置

Bucket *next;//声明指向下一桶结点的指针 };*next void main(){

Bucket *Head=new Bucket,*CurrentB;//定义桶结点的头指针 和桶结点的当前指针

CurrentB=Head;//当前指针为桶结点的头指针,开始给第一个 结点赋值

CurrentB->ScanLine=1;//当前结点(第一个结点)的扫描线为 1 cout<<\第一个结点的扫描线位置是:\输出当前结点的扫描线置

图 2-5 桶结点类

4