1、 目录第一章 图形显示基础知识 .11.1 图形显示的坐标 .11.2 像素 .11.3 图像生成器 .11.4 彩色表 .2第二章 C 语言及 WIN-TC .32.1语言的简介 .32.2 WIN-TC 简介 .32.3 WIN-TC 基本操作 .3第三章 基本图形函数 .83.1 画线 .83.2 画圆 .93.3 画圆弧 .103.4 画椭圆 .103.5 画矩形 .113.6 画多边形函数 .113.7 画点函数 .123.8 画图坐标位置函数 .12第四章 其他图形函数 .134.1 设置颜色函数 .134.2 设置线型函数 .154.3 封闭图形的填充 .164.4 任意封闭图形
2、的填充 .224.5 图视口操作函数 .234.6 图形方式下的西文输出 .244.7 图形方式下的汉字输出 .27第五章 绘图综合举例 .31第六章 动画技术 .386.1 块动画法 .386.2 简单动画方法 .406.3 其它动画法 .426.4 动画实例 .43- 1 -第一章 图形显示基础知识1.1 图形显示的坐标显示器的屏幕如同一张坐标纸,在其上显示图形如同在坐标纸上画图一样。图形上任一点的位置均有确定的坐标,可用 X,Y 坐标值来表示。默认定义屏幕的左上角为原点,正X 轴向右延伸,正 Y 轴向下延伸,如同一个倒置的直角坐标系。其 X 和 Y 轴均大于、等于0 的整数值,最大值则由
3、显示器的类型和显示器方式来确定。这种显示坐标称为屏幕显示的物理坐标或绝对坐标,它和图视窗口(图视口)坐标不同,图视窗口是指在物理坐标区间又开辟一个或多个区间,在这些区间又可定义一个相对坐标,以后画图均可在此区间进行,以相对坐标来定义位置。当定义了一个左上角坐标为(200,50),右下角坐标为(400,150)的一个区域为图视口,则以后处理图形时,就以此图视窗口为相对坐标系,即用其左上角为坐标原点(0,0),右下角坐标为(200,100)的坐标系来定位图形上各点位置。关于这方面内容请看图视口设置函数。1.2 像素在近处看电视时,会发现屏幕上显示的画面均由一些圆点组成(其亮度、颜色不同)。这些点称
4、为像素(或称象点),像素是组成图形的最小单位。显示器显示的图形也由像素组成,不过像素的大小可以通过设置不同的显示方式来改变。像素在屏幕上的位置则可由其所在的 X、Y 坐标来决定。例如 X、Y 最大坐标是(639,199),即满屏显示的像素个数为 639 199。不同位置像素的坐标,其最大的 X、Y 值(即列和行值)由程序设置的显示方式来决定。满屏显示像素多少,则决定了显示的分辨率高低。可以看出,像素越小(或个数越多),则显示的分辨率越高。比如:VGA 适配器, 它的最高分辨率为 1024x768, 其中 1024为整个屏幕从左到右所有象素的个数, 768 为整个屏幕从上到下所有象素的个数。屏幕
5、的左上角坐标为(0, 0), 右下角坐标为(1023, 767), 水平方向从左到右为 x 轴正向, 垂直方向从上到下为 y 轴正向。TURBO.C 的图形函数都是相对于图形屏幕坐标, 即象素来说的。1.3 图像生成器它的作用是把计算机送来的画线、画短形,画填充区域或写字符等基本画图命令扫描转换成相应的点阵(称位图) ,存放在显示存储器中,即存放着需要在荧光屏上显示出来的图形的映像,这个点阵的每一点与屏幕像素一一对应,点阵中每个元素就是像素的值,通常用 112 位二进制数值来表示灰度或色彩。由若干位数据来对应屏幕上一点的光栅图形显示技术称为位映射(Bit Mapping)技术,因为图像生成系统
6、把图画显示在显示存储器中,即在显示存储器中生成显示画面的位映射图(简称位图) 。图像生成系统可以直接将图像输入设备如摄像机,扫描仪等输入的图像直接或间接(经由主存储器)存入显示存储器中。- 2 -图像生成器的逻辑结构从概念上说由两部分组成:显示处理器和工作存储器。显示处理器可选用通用处理器或专用处理器。工作存储器存放着图形处理器把几何图形转换成位图信息必须的全部解释程序,完成扫描转换的各种算法。一些性能较好的显示器将常用的画线、画图、填充、光栅操作等直接用硬件来执行,因此图形显示和处理速度大大提高。1.4 彩色表彩色表用来定义像素的颜色。我们知道,作为一个彩色显示器,它能够显示很多种颜色(或灰
7、度),但当我们用显示存储器来完全地存储它们对应的信息时,显示存储器的容量就要很大很大。另一方面实际对一幅具体的图画而言其不同颜色数目并不大(几百至几千种),但将所有场合的不同图画作为整体看,其颜色变化数目就相当大(几十万甚至更多)。为了平衡显示存储器不能过大而又尽量满足实际的需要,产生了彩色表(Color Table 或 Color Look up Table),又称为调色板。彩色表实际上只是可显示颜色总数的一个不大的子集。彩色表是一个小容量高速随机读写存储器,内容可由软件装入、保存或修改,这不仅方便了颜色的使用,而且还可以具有许多附加功能。采用彩色表时,显示存储器的像素值不再是直接送到监视器
8、中的颜色值,而仅是颜色的一个索引(Color Index),它们是彩色表的地址,从彩色表对应地址项中读出 R、G、B 三种颜色分量(即颜色号的定义值),然后送监视器。例如,像素值用 8bit 表示,则彩色像素值应共有 28=256 项,即256 个彩色表的地址,设彩色表的字长为 12bit(R、G、B 各 4bit),这意味着最多可定义212=4096 种不同颜色,但彩色表地址只有 256 项,每屏图形中不同颜色最多仅允许 256 种。实际高性能图形显示器中像素值由 1224bit 组成,而彩色表 R、G、B 各用 8bit 来定义,能表示的颜色总数可高达 16777216 种。例如,显示存储
9、器中的像素值是 69,此时从显示存储器中调出的颜色编号 69 作为彩色表的地址,从彩色表中读出 R、G、B 三个分量的值,送往 CRT。- 3 -第二章 C 语言及 WIN-TC2.1语言的简介语言是在 70 年代初问世的。一九七八年由美国电话电报公司(AT /* 和 gd = VGA,gm = VGAHI 是同样效果 */registerbgidriver(EGAVGA_driver);/* 注册 BGI 驱动后可以不需要.BGI 文件的支持运行 */initgraph(int main(void)initgr(); /* BGI 初始化 */*此部分添加你自己的代码,例如line(25,
10、25, 220, 220);circle(100, 100, 50);等等*/getch(); /* 暂停一下,看看前面绘图代码的运行结果 */- 5 -closegr(); /* 恢复 TEXT 屏幕模式 */return 0;1图形系统的初始化不同的显示适配器有不同的图形分辨率。即使同一显示适配器, 在不同模式下也有不同分辨率。因此, 在屏幕作图之前, 必须根据显示适配器种类将显示器设置成为某种图形模式, 在未设置图形模式之前, 微机系统默认屏幕为文本模式(80 列, 25 行字符模式), 此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数: initgraph(int
11、 far *gdriver, int far *gmode, char *path);可简化为:initgraph(其中 gdriver 和 gmode 分别表示图形驱动器和模式, path 是指图形驱动程序所在的目录路径。图形驱动程序由 Turbo C 出版商提供, 文件扩展名为.BGI。 根据不同的图形适配器有不同的图形驱动程序。例如对于 EGA、VGA 图形适配器就调用驱动程序 EGAVGA.BGI。 有时编程者并不知道所用的图形显示适配器种类, 或者需要将编写的程序用于不同图形驱动器,所以 Turbo C 提供了一种更简单的方法, 即用 gdriver= DETECT 语句后再跟ini
12、tgraph()函数就行了,采用这种方法后先对图形显示器自动检测, 然后再用图形初始化函数进行初始化设置,程序如下所示。一般把它组成一个调用函数,放于主程序(main)之前,然后再在主程序(main)内调用该函数 initgr()。void initgr(void) /* BGI 初始化 */int gd = DETECT, gm = 0; /* 和 gd = VGA,gm = VGAHI 是同样效果 */registerbgidriver(EGAVGA_driver);/* 注册 BGI 驱动后可以不需要.BGI 文件的支持运行 */initgraph(2.退出图形程序编译模式WIN-TC
13、编译器编译的模板文件有两种一种为“标准文档模板”、另一种是“BIG 图形模板”,WIN-TC 默认为标准文档模板,所以运行了图形程序后结束需要调用 closegr();函数,恢复到 TEXT 屏幕模式。 2.3.2 运行程序对 C 程序的编译有如下几种方法:1.选择菜单栏上的“运行”“编译连接” 。通过调用该命令,对程序进行编译,或单击工具条上的快捷按钮 。2.选择菜单栏上的“运行”“编译连接并运行” ,或单击工具条上的快捷按钮 。通过调用该命令,对程序进行编译并运行程序。3.选择“运行”“使用带参数运行”。- 6 -函数可以带参数,它也可以带运行参数,它的参数的获取方式,就是前面所说的程序运
14、行参数。2.3.3 保存文件1.保持新建文件的具体操作步骤如下:选择“文件”“文件另存为” ,弹出“文件另存为”对话框,在“文件名”文本框中输入文件名, “保持类型”为“*.c” ,单击“保存”按钮,完成操作。2.保持已有文件的具体操作步骤如下:选择“文件”“保存文件” ,或单击工具条上的保存文件按钮。2.3.4 汉字的输出对于使用少量的汉字图形程序,完全没有必要带巨大的汉字库来运行,只要内存允许,你可以把汉字字模直接定义为数组的信息存储在 EXE 文件里。通过 WIN-TC 提供的功能,可以把单个字模信息直接取出来,然后在源代码中粘贴。该工具的强大在于不仅可以生成1212、1616 宋体这些
15、存在于 DOS 字库的字模,而且可以生成 1616 楷体、黑体甚至自定义字体的字模,而且可以提供 6 种字模大小供您选择并即时预览效果!对使用少量汉字的图形编程能够提供极大方便。具体操作如下:1. 选择“超级工具集”“点阵字模工具” ,弹出“点阵字模工具”对话框,如图 2.3 所示;2. 在选项“您需要提取的字模是”的文本框中输入需要提取的汉字,一次只能输入一个汉字,比如:上;3. 在“字体选择”区内选择该字的字体,分别为:“宋体” 、 “楷体_GB2312” 、 “隶书” 、“黑体” 、 “自定义”五种类型;4. 在“字体大小”区内选择该字的大小,分别为:12 点阵、16 点阵、24 点阵、
16、32 点阵、48 点阵、64 点阵六种类型;5. 单击“重新计算字模”按钮,在“输出字模数组”区中出现该字的代码,把它粘贴到程序中,作为一个独立函数,在主程序 main()中调用,代码如下:char shang16S=/* 以下是 上 的 16 点阵宋体 字模,32 byte */0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0xF8,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x04,0x7F,0xFE,0x00,0x00
17、,;6. 单击“显示使用说明”按钮,在“输出字模数组”区中出现一段文字说明和输出函数的代码,把代码粘贴到程序中,以下是其输出函数的代码: void drawmat(char *mat,int matsize,int x,int y,int color)int i,j,k,n;- 7 -n=(matsize-1)/8+1;for(j=0;jk) /*测试为 1 的位则显示*/putpixel(x+i*8+k,y+j,color);char *mat 为字模指针,int matsize 为字的点阵大小,int x,int y 参数分别为汉字在屏幕中显示的 x, y 坐标,int color 为文字
18、颜色。举例如下:例 2 .1 汉字输出#include “Conio.h“#include “graphics.h“#define closegr closegraphvoid initgr(void) int gd = DETECT, gm = 0;registerbgidriver(EGAVGA_driver);initgraph(void drawmat(char *mat,int matsize,int x,int y,int color)/*依次:字模指针、点阵大小、起始坐标(x,y)、颜色*/int i,j,k,n;n=(matsize-1)/8+1;for(j=0;jk) /*测
19、试为 1 的位则显示*/putpixel(x+i*8+k,y+j,color);char san16S=/* 以下是 三 的 16 点阵宋体 字模,32 byte */0x00,0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFE,0x00,0x00,0x00,0x00,;char dong16S=/* 以下是 东 的 16 点阵宋体 字模,32 byte */0x02,0x00,
20、0x02,0x00,0x7F,0xFC,0x04,0x00,0x08,0x80,0x08,0x80,0x10,0x80,0x1F,0xF8,0x00,0x80,0x08,0xA0,0x0C,0x90,0x18,0x88,0x10,0x8C,0x22,0x84,0x01,0x80,0x00,0x80,;int main(void)initgr(); /* BGI 初始化 */drawmat(san16,16,220,125,RED);- 8 -drawmat(dong16,16,250,125,RED);getch(); /* 暂停一下,看看前面绘图代码的运行结果 */closegr(); /* 恢复 TEXT 屏幕模式 */