教案首页
课程名称 授课日期
计算机图形学 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