《计算机图形学》实验指导书.docx
- 文档编号:6899266
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:36
- 大小:226.69KB
《计算机图形学》实验指导书.docx
《《计算机图形学》实验指导书.docx》由会员分享,可在线阅读,更多相关《《计算机图形学》实验指导书.docx(36页珍藏版)》请在冰豆网上搜索。
《计算机图形学》实验指导书
计算机图形学实验指导书
目录
一、计算机图形学实验教学大纲1
二、TubroC/C++图形基础2
2.1图形显示的坐标和象素2
2.2图形显示器和适配器3
2.3显示器的工作方式3
2.4图形系统的初始化4
2.5基本图形函数5
2.6颜色控制函数7
2.7封闭图形的填色及有关画图函数10
三、利用VC单文档实现画图程序11
3.1图形设备接口(GDI)11
3.2MFC支持GDI绘图11
3.3使用图形对象要注意两点:
13
3.4具体步骤如下13
四Glut应用17
第一节初始化17
第二节为改变窗口形状做准备22
五、总体内容和要求29
六实验要求、评分标准30
七、具体实验31
7.1实验一直线生成与二次曲线拟合31
7.2实验二二维图元的几何变换33
7.3实验三二维图元裁剪33
7.4实验四三维图形几何变换、显示34
一、
计算机图形学实验教学大纲
课程名称:
计算机图形学
总学时:
45(计科)、48(信息)
实验学时:
15(计科)、16(信息)
面向专业(层次):
计算机科学与技术、信息与计算科学
应开实验项目:
4个
应开实验时间:
计算机:
三年级第一学期信息:
三年级第二学期
实验类别:
专业
本门课程实验目的与要求:
1、了解计算机图形学的基本技术。
2、掌握基本图形生成及处理的常用算法。
3、提高编制图形应用软件的能力。
本课程实验项目一览表
序
号
实验项目名称
实验学时
目的与要求
实验要求
实验类型
每组人数
备
注
必
修
选
修
其
它
验证性
设计性
综合性
1
直线生成与二次曲线拟合
6
掌握生成直线和二次曲线参数拟合的常用算法
√
√
1
2
二维线段的截剪
2
在实验一的基础上,应用二维图形裁剪的策略与原理,编程实现之。
√
√
1
3
二维图形几何变换
2
应用二维图形几何变换的原理与算法,编程实现对裁剪后的二维图形进行各种几何换操作。
√
√
1
4
三维图形几何变换、显示
5
(6)
编程实现三维几何图形的消隐及显示,并应用三维图形几何变换原理与算法对三维图形进行变换处理
√
√
1
序号
设备名称
台套数
备注
1
微型计算机
50
二、TubroC/C++图形基础
计算机图形程序设计是程序设计中较难又最吸引人的部分,为了用户设计图形程序的方便,不同版本和公司推出的C编译系统都提供了画图的库函数,用户设计图形程序时,只要在需要的地方,设置相应的参数对其调用即可.
TubroC为用户提供了一个功能很强的画图软件库,它又称为BORLAND图形接口(BGI),它包括图形库文件(graphics.lib),图形头文件(graphics.h)和许多图形显示器的驱动程序(如CGA、BGI、EGAVGA等)。
还有一些字符集的字体驱动程序(如:
goth.chr黑体字符集等)。
编写图形程序时用到的一些图形库函数均在graphics.lib中,执行这些函数时,所需的有关信息(如宏定义等)则包含在graphics.h头文件中,因此,用户在自己的画图源程序中必须包括graphics.h头文件。
由于计算机画图涉及到显示器和驱动它们工作的图形适配器(卡)等许多硬件知识和图形的一些基本概念,定义等,因而有必要简单地介绍一下:
2.1图形显示的坐标和象素
显示器的屏幕如同一张坐标纸,在其上
(0,0)
显示图形时,图形上任一点的位置均有确
X
定的坐标,即可用X、Y坐标来表示。
显
示屏的坐标系统如左图1所示,定义屏幕的
Y
左上角为为其原点,正X轴向右延伸,正
Y轴向下延伸,其X和Y值均为大于0
的整数值,其最大值则由显示器的类型和图1显示屏的的坐标系统
显示方式来确定,这种显示坐标我们称为
屏幕显示的物理坐标或绝对坐标。
图1不同位置的象素坐标
例如,在下图2所示的显示方式下,X,Y最大坐标是(639,199),即满屏显示的象素个数为640×200,图3示出了不同位置象素的坐标,最大的X,Y值(即行和列值)由程序设置的显示方式来决定,满屏显示象素多少,则决定了显示的分辨率高低,可以看出,象素越小(或个数越多)则显示的分辨率越高。
(0,0)
象素(0,0)
象素(3,3)
(639,199)
2.2图形显示器和适配器
计算机中要显示的字符和图形均以数字形式存储在存储器中,而显示器接收的应是模拟信号。
例如,常用的显示器有三条模拟红绿蓝颜色的模拟信号输入线,每条输入线的电压决定了颜色的亮度,只要能产生出可区分的电压来,它们不同的组合,便可使显示器显示出不同的颜色来。
插在PC机插槽中的图形卡(即适配器)其作用就是将要显示的字符和图形以数字形式存储在卡上的视频存储器VRAM中,再将其变成视频模拟信号送往相应适配的显示器进行显示,也即适配器在计算机主机和显示器之间起到了信息转换和视频发送作用,由于计算机配有显示器种类不同,因而适配器种类不同,图4示出了一般386、486、586等PC微机中适配器、主机、显示器之间的关系。
由于PC机配有的显示器种类不同,因此适配器也就不同,也就是说不同的适配器配不同的显示器,反过来说也行。
现就目前常用的几种适配器作以下介绍:
1、单色显示适配器(MDA)
2、彩色图形适配器(CGA)
3、增强型图形适配器(EGA)
4、视频图形陈列适配器(VGA)
5、TVGA、PVGA、XGA和CVGA
图3适配器、主机、显示器的关系
2.3显示器的工作方式
显示器有两种工作方式,即文件方式或称字符显示方式和图形显示方式,它们的主要差别是显示存储器(VRAM)中存有的信息不同。
字符方式时,VRAM存放要显示字符的ASCAII码,用它作为地址,取出字符发生器ROM(固定存储器)中存放的相应字符的图像(又称字模),变成视频信号在显示器屏幕上进行显示,而当选择图形方式时,则要显示的图形的图像直接存在VRAM中,VRAM中某地址单元存放的数就表示了相应屏幕上某行和列上的象素及颜色。
2.4图形系统的初始化
在编制图形程序时,进入图形方式前,首先要在程序中对使用的图形系统进行系统进行初始化,即要用什么类型的图形显示适配器的驱动程序,采用什么模式的图形方式(也就是相应程序的入口地址),以及该适配器驱动程序的寻找路径名,所用系统的显示适配器一定要支持所选用的显示模式,否则将出错,TubroC提供了一个图形系统初始化函数initgraph可完成这些功能。
1、图形系统的初始化函数
它的说明原型是:
voidfarinitgraph(intfar*driver,intfar*mode,charfarpathfordriver)
当我们使用的存储模式为tiny(微型)、small(小型)或medium(中型)时,不需要使用far(远)指针,因而可以将初始化函数调用格式写成如下形式:
initgraph(&graphdriver,&graphmode,””)
其中,驱动程序目录路径为空时,表示就在当前目录下,参数graphdriver是一个枚举变量,它属于显示器驱动程序的枚举类型:
enumgraphics_driver{DETECT,CGA,MCGA,EGA,
EGA64EGAMONO,IBM8514,HERCMON0,ATT400,VGA,PC3270}
一旦执行了初始化,显示器即被设置成相应模式的图形方式,下面是某画图程序的开始部分,它包括对图形的初始化:
#include“graphics.h”
voidmain(void)
{
intgraphdriver=DETECT;
intgraphmode;
initgraph(&graphdriver,&graphmode,””);
……
}
上面的初始化过程中,将由DETECT检测所用适配器类型,并将当前目录下相应的驱动程序装入,并采用最高分辨率显示模式作为graphmode的值,如检测到CGA适配器时,则graphmode等于4或为CGAHI,若检测到VGA适配器,则graphmode等于2或为VGAHI。
若已知所用的图形适配器为VGA时,想采用640×480的高分辨率来显示模式VGAHI,则初始化部分可写成:
intgraphdriver=VGA;
intgraphmode=VGAHI;
initgraph(&graphdriver,&graphmode,””);
……
2、图形系统的检测函数
当graphdriver=DETECT时,实际上initgraph函数又调用了图形系统检测函数detectgraph,它完成对适配器的检查并得到显示器类型号和相应的最高分辨率模式,若所设适配器不是规定的那些类型,则返回-2,表示适配器不存在,该函数的原型说明如下:
voidfardetectgraph(intfar*graphdriver,intfar*graphmode)
当想检测所用的适配器类型,但并不想用其最高分辨率显示模式,而想由自己进行控制使用时,可采用这个函数来实现,例如:
detectgraph(&graphdriver,&graphmode);
switch(graphdriver)
{
caseCGA:
graphmode=1//设置成低分辨模式
break;
caseEGA:
graphmode=0;//设置成低分辨模式
break;
caseVGA:
graphmode=1;//设置成中分辨模式
break;
case–2:
printf(“\nGrpahicsadapterisnotinstalled”);
exit
(1);
default:
printf(“\nGraphicsadapternotisCGA,EGA,orVGA”);
}
initgraph(&graphdriver,&graphmode,””);
……
3、清屏和恢复显示方式的函数
a、清屏函数
画图前一般需要清屏,使得屏幕如同一张白纸,好画最新最美的图画,因而必须使用清屏函数,它的说明原型是:
voidfarcleardevice(void);
该函数的作用范围是整个屏幕。
b、恢复显示方式函数
当画图程序结束,回到文本方式时,要关闭图形系统,回到文本方式,该函数的说明原型是:
voidfarclosegraph(void);
由于进入C环境进行编程时,即进入了图形方式,因而为了在画图程序结束后恢复原来的最初状况,一般要调用此函数,使其恢复到文本方式。
2.5基本图形函数
图形是由点、线、面组成,TubroC提供了一些函数,以完成这些操作,而所谓面则可由对一封闭图形填上相应颜色来实现。
1、画点函数
该函数的说明原型是:
voidfarputpixel(intx,inty,intcolor);
它表示在指定的x、y位置画一个点,点的显示颜色由设置的color值决定。
该函数的相对函数是取象素值函数,它的说明原型如下:
voidfargetpixel(intx,inty);
下面是一个画点的程序:
#include“graphics.h”
#include“stdio.h”
voidmain(void)
{
intgraphdriver=CGA;
intx,graphmode=CGAC0;
initgraph(&graphdriver,&graphmode,””);
cleardevice();
for(x=20;x<=300;x+=16)
{
putpixel(x,20,1);
putpixel(x+4,20,2);
}
getch();
closegraph();
}
2、有关画图坐标位置的函数
在屏幕上画线时,如同在纸上画线一样,画笔要放在开始画图的位置,并经常要抬笔移动,以便到另一位置再画。
我们也可想象在屏幕上画图时,有一无形的画笔,可以控制它的定位、移动(不画),也可知道它能移动的最大位置限制等,完成这些功能的函数是:
a、移动画笔到指定的(x,y)位置,移动过程不画:
voidfarmoveto(intx,inty);
b、画笔从现行(x,y)位置处移到一位置增量(x+dx,y+dy)处,移动过程不画:
voidfarmoverel(intdx,intdy);
c、得到当前画笔所在位置
intfargetx(void)//得到当前画笔的x位置
intfargety(void)//得到当前画笔的y位置
3、画线函数
这类函数提供了从一个点到另一个点用设定的颜色画一条直线的功能,起始点的设定不同,因而有不同的画线函数:
a、两点之间画线函数
voidfarline(intx0,inty0,intx1,inty1);
从点(x0,y0)到点(x1,y1)画一条直线
b、从现行画笔位置到某点的画线函数
voidfarlineto(intx,inty);
从现行画笔位置到(x,y)点画一直线
c、从现行画笔位置到一增量位置的画线函数
voidfarlinerel(intdx,intdy);
从现行画笔位置(x,y)到位置增量处(x+dx,y+dy)画一直线
4、画矩形和条形图函数
画矩形函数rectangle将画出一个矩形框,而画条形函数bar将以给定的填充模式和填充颜色画出一个条形图来,而不是一个条形框,关于填充模式和颜色将在后面介绍。
a、画矩形函数
voidfarrectangle(intx1,inty1,intx2,inty2);
该函数将以(x1,y1)为左上角,(x2,y2)为右下角画一矩形框
b、画条形图函数
voidbar(intx1,inty1,intx2,inty2);
该函数将以(x1,y2)为左上角,(x2,y2)为右下角画一实形条状图,没有边框,图的颜色和填充模式可以设定,若没有设定,则使用缺省模式。
5、画椭圆、圆和扇形图函数
下面的函数用于画椭圆、圆和扇形图。
a、画椭圆函数
voidellipse(intx,inty,intstangle,intendangle,intxradius,intyradius);
该函数将以(x,y)为中心,以xradius和yradius为x轴和y轴半径,从起始角stangle开始到角endangle结束,画一椭圆线,角度以逆时针为正,水平向右的方向为0度
b、画圆函数
voidfarcircle(intx,inty,intradius);
该函数将以(x,y)为圆心,以radius半径为一个圆
c、画圆弧函数
voidfararc(intx,inty,intstangle,int,intradius);
该函数将以(x,y)为圆心,radius为半径,从stangle为起始角开始,到endangle为结束角,画一圆弧.
d、画扇形图函数
voidfarpieslice(intx,inty,int,intendangle,intradius);
该函数将以(x,y)为圆心,radius为半径,从stangle为起始角,endangle为结束角,画一扇形图,扇形图的填充模式和填充颜色可以事先设定,否则以缺省模式进行。
2.6颜色控制函数
象素的显示颜色,或者说画线,、填充面的颜色都可以用一些函数来设置,否则将采用缺省的值,显示点、线、面的颜色,称为前景色,而衬托它们的背景称为背景色。
按照CGA、EGA、VGA图形适配器的硬件结构,颜色可以通过对其内部相应的寄存器进行编程来改变,但不编程时,则取缺省值,这就是我们上面所列举程序的情况。
为了能形象地说明了颜色的设置,一般用所谓调色板来进行描述,它实际上对应一些硬件的寄存器,确有实体存在。
从C语言的角度看,调色板实际上就是一张颜色索引表,对CGA显示器,在中分辨率显示方式下,有4种显示模式,每一种模式对应有一个调色板,可用调色板号区别,每个调色板有4种颜色可以选择,颜色可以用颜色值0、1、2、3来进行选择,由于CGA有四上调色板,一旦显示模式确定后,调色板即确定,如选项CGAC0模式,则选0号调色板,但选调色板的哪种颜色则可由用户根据需要从0、1、2和3中进行选择,表一就列出了调色板与对应的颜色值。
表一
模式
调色板号
颜色值
0
1
2
3
CGAC0
0
背景色
绿
红
黄
CGAC1
1
背景色
青
洋红
白
CGAC2
2
背景色
淡绿
洋红
棕
CGAC3
3
背景色
淡青
淡
淡灰
表中所指若选调色板的颜色值为0,表示此时选择的颜色和当时的背景色一样,即前景、背景同为色。
1、颜色设置函数
TubroC提供了一个前景颜色设置函数和背景设置函数
a、前景颜色设置函数
该函数的说明原型为:
voidfarsetcolor(intcolor);
b、背景颜色设置函数
该函数的说明原型为:
voidfarsetbkcolor(intcolor);
2、调色板颜色的设置
a、调色板颜色的设置函数
voidfarsetpalette(intindex,intactual_color);
该函数用来对调色板进行颜色设置,由于CGA显示器在中分辨方式下,4个调色板对应的4个颜色值是固定的,即从硬件的角度看,是固定不变的,因而这个函数一般不用在CGA上,但若令index为0,则表示改变0号颜色,即背景色,对于index的其它值,该函数将无意义,该函数一般用在EGA、VGA显示方式上。
对EGA、VGA显示器,只有一个调色板,但这个调色板有16个调色板寄存器,它们存的内容对EGA和VGA含义不同,下面分别予以介绍:
对EGA显示器,调色板即16个调色板寄存器是一个颜色索引表,它存有16种颜色,VRAM中的每个旬素(是4位)实际上代表一个颜色索引号,由该值即上述函数的参数index可知道选中哪个调色板寄存器,而每个调色板寄存器寄存了一种颜色。
由于调色板寄存器为6位,帮可用6位二进制数表示一种颜色,因而可有2ˆ6=64种颜色可供选择,该颜色值即是上述参数actual_color。
b、改变调色板16种颜色的函数
voidfarsetallpalette(structpalettetypefar*palette);
其中结构体palettetype定义如下:
#defineMAXCOLORS15
structpalattetype{
unsignedcharsize;
singedcharcolors[MAXCOLORS+1];
}
该定义在头文件graphics.h中,size元素由适配器类型和当前模式下调色板的颜色数决定,即调色板寄存器数,colors是个数组,它实际上代表调色板寄存器,每个数组元素的值就表示相应调色板寄存器的颜色值,对VGA的VGAHI模式,size=16。
c、得到调色板颜色数和颜色值的函数
与上述两个函数对应的是如下两个函数:
voidfargetpalette(structpalettetypefar*palette);
voidfargetpalettesize(void);
前者得到调色板的颜色数(即调色板寄存器个数)和装的颜色值,后者将得出调色板颜色数,getpalette函数将把得到信息存入由palette指向的结构体中。
下面的程序演示了上面所讲的功能:
#include“graphics.h”
voidmain(void)
{
intgraphdriver=DETECT,graphmode;
structpalettetypepalette;
inti,j;
initgraph(&graphdriver,&graphmode,””);
getpalette(&palette);
setcolor
(1);
rectangle(200,200,300,320);
getch();
j=2;i=2;
do
{
printf(“color=%d”);
setpalette(1,i);
getch();
j++,i++;
if(i==6)i=20;
if(i==21)i=7;
if(i==8)i=56;
}while(j<16);
getch();
setallpalette(&palette);
closegraph();
}
2.7封闭图形的填色及有关画图函数
TurboC提供了一些画基本图形的函数,如前面介绍过的画条形图函数bar和将要介绍的一些函数,它们首先画出一个封闭的轮廓,然后再按设定的颜色和模式进行填充,设定颜色和模式有特定的函数,介绍如下:
1、填色函数
voidfarsetfilestyle(intpattern,intcolor);
该函数将用设定的color颜色和pattern模式对后面画出的轮廓图进行填充.
2、得到填充模式和颜色的函数
voidfarfillsettings(structfillsettingstypefar*);
它将得到当前的填充模式和颜色,这些信息存在结构指针变量fillinfo指出的结构中,该结构定义是:
structfillsettingtype{
intpattern;//当前填充模式
intcolor;//填充颜色
};
voidfargetfillpattern(char*upattern);
该函数将把用户自定的填充模式和颜色存入由upattern指向的内在区域中。
可对任意封闭图形填充的函数voidfarfloodfill(intx,inty,intborder);
三、利用VC单文档实现画图程序
3.1图形设备接口(GDI)
GDI图形设备接口是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出。
GDI负责Windows的所有图形输出,包括屏幕上输出像素、在打印机上输出硬拷贝以及绘制Windows用户界面。
应用程序可以使用GDI创建三种类型的图形输出:
矢量输出、光栅图形输出和文本输出。
1.矢量图形输出指的是创建线条和填充图形,包括点、直线、曲线、多边形、扇形和矩形的绘制。
2.光栅图形的输出是指光栅图形函数对以位图形式存储的数据进行操作,它包括各种位图和图标的输出。
在屏幕上表现为对若干行和列的像素的操作,在打印机上则是若干行和列的点阵的输出。
3.按图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机图形学 计算机 图形学 实验 指导书