毕业设计C语言论文

更新时间:2024-04-29 05:29:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

柳州职业技术学院

毕业设计(论文)任务书

题目:用C语言实现图形学设计

院(系):电子电气工程系 专 业:电子与通信技术 年 级: 2003 学生姓名:苏华显 学 号:2003159123 指导老师: 职 称:

完成日期2005年12月10日

一、 设计所要达到的目的:

通过设计C语言画图程序,使学生能对C语言有更进一步的了解,掌握基本程序的设计方法和简单的图形编程基础,提高编程能力,培养学生的逻辑能力和自学能力,为以后从事实际工作打下基础。 二、设计任务与要求:

1、用TurboC编写画图程序。

2、实现用键盘或鼠标操作,有绘画点,直线等功能,并且能改变线条或点的颜色。

3、写出程序流程,并编写程序。 4、进行程序的调试。 5、写出设计说明书。

三、毕业设计说明书要求如下:

1、说明书用16K或稿纸(15*20规格)单面制作。 2、装订顺序:

(1)毕业设计(论文)任务书封面 (2)摘要

(3)目录 (4)正文

(5)参考文献资料 (6)附图,附录

(7)毕业设计(论文)任务书封底(评审意见) 3、文字要求:字体工整、字迹清楚、语言流畅、无错别字 4、图纸、图表要求:

(1)图纸、图表布局合理,图画整洁,线条粗细均匀,尺寸标注规范,文字注释准确

(2)图纸按国家规定标准绘制 5、文字稿要求用电脑进行制作

- 2 -

摘 要

C 语言发展如此迅速, 而且成为最受欢迎的语言之一, 主要因为它具有强大的功能,而且简单易学的优点备受青睐。本文利用C语言实现计算机绘图设计,主要讲述了画图函数的应用。 程序用Turboc2.0集成开发环境进行编程与调试,Turboc2.0是美国Borland 公司的产品,Borland公司是一家专门从事软件开发、 研制的大公司,该工具具有查错功能, 并可以在Tiny模式下直接生成.COM (数据、代码、堆栈处在同一 64K 内存中) 文件。还可对数学协处理器 (支持8087/80287/80387等)进行仿真,工具界面简洁易懂,十分受到C语言编程者的厚爱。

本文提出了画图程序的设计方案,详细展述程序用到的各个图形函数的说明,以及图形模式下的初始化。设计出来的程序具有实现画点画线功能,并可以改变点线的颜色,符合了本设计课题的要求,另外,还加画圆,画快点距形,画椭圆,画虚线的功能。该程序可以画出非常漂亮的画面来,程序可以用于教学、美术以及涉及到图形方案的工具。

- 3 -

目录

第一章:绪论…????????????????????????5

第二章:TC图形函数详解????????????????6

2.1 图形初始化????????????????6 2.2 独立图形运行程序的建立??????????10 2.3 屏幕颜色的设置和清屏函数?????????11 2.4 基本画图函数???????????????14 2.5 基本图形的填充??????????????19 2.6 图形窗口操作???????????????20 2.7 屏幕操作函数???????????????21

2.8图形模式下的文本输出???????????23 2.9 文本字体字形和输出方式??????????24 第三章:程序设计说明?????????????????24 3.1 程序功能简介和使用方法??????????27 3.2 程序设计说明???????????????28 参考文献:??????????????????????30 附 录:C语言绘图程序源代码??????????????31 致 谢:???????????????????????37

- 4 -

第一章: 绪论

C语言的发展过程

C语言是在70年代初问世的。一九七八年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”一书。通常简称为《K&R》,也有人称之为《K&R》标准。但是,在《K&R》中并没有定义一个完整的标准C语言,后来由美国国家标准学会在此基础上制定了一个C 语言标准,于一九八三年发表。通常称之为ANSI C。 当代最优秀的程序设计语言

早期的C语言主要是用于UNIX系统。由于C语言的强大功能和各方面的优点逐渐为人们认识,到了八十年代,C开始进入其它操作系统,并很快在各类大、中、小和微型计算机上得到了广泛的使用。成为当代最优秀的程序设计语言之一。 C语言的特点

C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。

- 5 -

第二章 TC图形函数详解

2.1 图形模式的初始化

Turbo C 提供了非常丰富的图形函数,所有图形函数的原型均在graphics. h 中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。

另外,使用图形函数时要确保有显示器图形驱动程序*BGI,同时将集成开发环境options/Linker中的Graphics lib选为on,只有这样才能保证正确使用图形函数。

不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数:

void far initgraph(int far *gdriver, int far *gmode,char *path);

其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见下表。

图形驱动程序由Turbo C出版商提供,文件扩展名为.BGI。 根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序EGAVGA.BGI

图形驱动器、模式的符号常数及数值:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

图形驱动器(gdriver) 图形模式(gmode)

───────────────────── 色调 分辨率 符号常数 数值 符号常数 数值

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

- 6 -

━━

CGA 1 CGAC0 0 C0 320*200 CGAC1 1 C1 320*200 CGAC2 2 C2 320*200 CGAC3 3 C3 320*200 CGAHI 4 2色 640*200

──────────────────────────────

MCGA 2 MCGAC0 0 C0 320*200 MCGAC1 1 C1 320*200 MCGAC2 2 C2 320*200 MCGAC3 3 C3 320*200 MCGAMED 4 2色 640*200 MCGAHI 5 2色 640*480

──────────────────────────────

EGA 3 EGALO 0 16色 640*200 EGAHI 1 16色 640*350

──────────────────────────────

EGA64 4 EGA64LO 0 16色 640*200 EGA64HI 1 4色 640*350

──────────────────────────────

EGAMON 5 EGAMONHI 0 2色 640*350

──────────────────────────────

IBM8514 6 IBM8514LO 0 256色 640*480 IBM8514HI 1 256色 1024*768

──────────────────────────────

HERC 7 HERCMONOHI 0 2色 720*348

- 7 -

──────────────────────────────

ATT400 8 ATT400C0 0 C0 320*200 ATT400C1 1 C1 320*200 ATT400C2 2 C2 320*200 ATT400C3 3 C3 320*200 ATT400MED 4 2色 320*200 ATT400HI 5 2色 320*200

──────────────────────────────

VGA 9 VGALO 0 16色 640*200 VGAMED 1 16色 640*350 VGAHI 2 16色 640*480

──────────────────────────────

PC3270 10 PC3270HI 0 2色 720*350

──────────────────────────────

DETECT 0 用于硬件测试

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

使用图形初始化函数设置VGA高分辨率图形模式: #include int main() {

int gdriver, gmode; gdriver=VGA;

gmode=VGAHI;initgraph(&gdriver, &gmode, \bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/ getch();

closegraph(); return 0; }

有时编程者并不知道所用的图形显示器适配器种类,或者需要将

- 8 -

编写的程序用于不同图形驱动器,Turbo C 提供了一个自动检测显示器硬件的函数,其调用格式为:

void far detectgraph(int *gdriver, *gmode); 其中gdriver和gmode的意义与上面相同。 自动进行硬件测试后进行图形初始化:

#include int main() {

int gdriver, gmode;

detectgraph(&gdriver, &gmode); /*自动测试硬件*/ printf(\gdriver,gmode); /*输出测试结果*/ getch();

initgraph(&gdriver, &gmode, \/* 根据测试结果初始化图形*/ bar3d(10, 10, 130, 250, 20, 1); getch();

closegraph(); return 0; }

上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置,但Turbo C提供了一种更简单的方法, 即用gdriver=DETECT 语句后再跟initgraph()函数就行了。 采用这种方法后,上例可改为:

#include int main() {

int gdriver=DETECT, gmode;

initgraph(&gdriver, &gmode, \bar3d(50, 50, 150, 30, 50, 1); getch();

closegraph(); return 0;

- 9 -

}

另外,Turbo C 提供了退出图形状态的函数closegraph(),其调用格式为:

void far closegraph(void);

调用该函数后可退出图形状态而进入文本方式( Turbo C 默认方式),并释放用于保存图形驱动程序和字体的系统内存。

2.2独立图形运行程序的建立

Turbo C对于用initgraph()函数直接进行的图形初始化程序,在编译和链接时并没有将相应的驱动程序(*.BGI) 装入到执行程序,当程序进行到intitgraph()语句时,再从该函数中第三个形式参数char *path中所规定的路径中去找相应的驱动程序。若没有驱动程序,则在C:\\TC中去找,如C:\\TC中仍没有或TC不存在,将会出现错误:

BGI Error: Graphics not initialized (use 'initgraph') 因此,为了使用方便,应该建立一个不需要驱动程序就能独立运行的可执行图形程序,Turbo C中规定用下述步骤(这里以EGA、VGA显示器为例):

I. 在C:\\TC子目录下输入命令:BGIOBJ EGAVGA

此命令将驱动程序EGAVGA.BGI转换成EGAVGA.OBJ的目标文件。 II. 在C:\\TC子目录下输入命令:TLIB LIB\\GRAPHICS.LIB+EGAVGA 此命令的意思是将EGAVGA.OBJ的目标模块装到GRAPHICS.LIB库文件中。

III. 在程序中initgraph()函数调用之前加上一句:

registerbgidriver(EGAVGA_driver):

该函数告诉连接程序在连接时把EGAVGA的驱动程序装入到用户的执行程序中。

经过上面处理,编译链接后的执行程序可在任何目录或其它兼容机上运行。假设已作了前两个步骤,若再向例6中加registerbgidriver()函数则变成:

- 10 -

#include #include int main() {

int gdriver=DETECT,gmode;

registerbgidriver(EGAVGA_driver); /*建立独立图形运行程序 */

initgraph(gdriver, gmode,\bar3d(50,50,250,150,20,1); getch();

closegraph(); return 0; }

上例编译链接后产生的执行程序可独立运行。

如不初始化成EGA或CGA分辨率,而想初始化为CGA分辨率, 则只需要将上述步骤中有EGAVGA的地方用CGA代替即可。

2.3 屏幕颜色的设置和清屏函数

对于图形模式的屏幕颜色设置,同样分为背景色的设置和 景色的设置.在Turbo C中分别用下面两个函数: 设置背景色: void far setbkcolor(int color); 设置作图色: void far setcolor(int color);

其中color 为图形方式下颜色的规定数值,对EGA,VGA显示器适配器,有关颜色的符号常数及数值见下表所示。

有关屏幕颜色的符号常数表

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

- 11 -

━━

符号常数 数值 含义 符号常数 数值 含义

──────────────────────────────

BLACK 0 黑色 DARKGRAY 8 深灰 BLUE 1 兰色 LIGHTBLUE 9 深兰 GREEN 2 绿色 LIGHTGREEN 10 淡绿 CYAN 3 青色 LIGHTCYAN 11 淡青 RED 4 红色 LIGHTRED 12 淡红

MAGENTA 5 洋红 LIGHTMAGENTA 13 淡洋红 BROWN 6 棕色 YELLOW 14 黄色 LIGHTGRAY 7 淡灰 WHITE 15 白色

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

对于CGA适配器,背景色可以为表3中16种颜色的一种,但前景色依赖于不同的调色板。共有四种调色板,每种调色板上有四种颜色可供选择。不同调色板所对应的原色见下表。

CGA调色板与颜色值表:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

调色板 颜色值

──────────────────────────────

符号常数 数值 0 1 2 3

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

C0 0 背景 绿 红 黄 C1 1 背景 青 洋红 白 C2 2 背景 淡绿 淡红 黄 C33 3 背景 淡青 淡洋 红白

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

清除图形屏幕内容使用清屏函数,其调用格式如下:

- 12 -

voide far cleardevice(void); 有关颜色设置、清屏函数的使用请看例8:

#include #include int main() {

int gdriver, gmode, i; gdriver=DETECT;

initgraph(&gdriver, &gmode, \图形初始化*/

setbkcolor(0); /*设置图形背景*/ cleardevice();

for(i=0; i<=15; i++) {

setcolor(i); /*设置不同作图色*/

circle(320, 240, 20+i*10); /*画半径不同的圆*/ delay(100); /*延迟100毫秒*/

}

for(i=0; i<=15; i++) {

setbkcolor(i); /*设置不同背景色*/ cleardevice();

circle(320, 240, 20+i*10); delay(100); }

closegraph(); return 0; }

另外,TURBO C也提供了几个获得现行颜色设置情况的函数。 int far getbkcolor(void); 返回现行背景颜色值。 int far getcolor(void); 返回现行作图颜色值。

- 13 -

int far getmaxcolor(void); 返回最高可用的颜色值。

2.4 基本画图函数

基本图形函数包括画点,线以及其它一些基本图形的函数 本节对这些函数作一全面的介绍。 1、画点

I. 画点函数 void far putpixel(int x, int y, int color); 该函数表示有指定的象元画一个按color 所确定颜色的点。对于颜色color的值可从表3中获得而对x, y是指图形象元的坐标。

在图形模式下,是按象元来定义坐标的。对VGA适配器,它的最高分辨率为640x480,其中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从上到下所有象元的个数。屏幕的左上角坐标为(0,0),右下角坐标为(639, 479),水平方向从左到右为x 轴正向,垂直方向从上到下为y轴正向。TURBO C的图形函数都是相对于图形屏幕坐标,即象元来说的。 关于点的另外一个函数是: int far getpixel(int x, int y); 它获得当前点(x, y)的颜色值。 II、有关坐标位置的函数

int far getmaxx(void);返回x轴的最大值。 int far getmaxy(void); 返回y轴的最大值。 int far getx(void); 返回游标在x轴的位置。 void far gety(void); 返回游标有y轴的位置。

- 14 -

void far moveto(int x, int y); 移动游标到(x, y)点,不是画点,在移动过程中亦画点。

void far moverel(int dx, int dy); 移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置,移动过程中不画点。 2、画线 I. 画线函数

TURBO C提供了一系列画线函数,下面分别叙述:

void far line(int x0, int y0, int x1, int y1); 画一条从点(x0, y0)到(x1, y1)的直线。

void far lineto(int x, int y); 画一作从现行游标到点(x, y)的直线。

void far linerel(int dx, int dy); 画一条从现行游标(x,y)到按相对增量确定的点(x+dx, y+dy)的直线。

void far circle(int x, int y, int radius); 以(x, y)为圆心,radius为半径,画一个圆。

void far arc(int x, int y, int stangle, int endangle,int radius); 以(x,y)为圆心,radius为半径,从stangle开始到endangle结束(用度表示)画一段圆弧线。

在TURBO C中规定x轴正向为0 度,逆时针方向旋转一周, 依次为90,180, 270和360度(其它有关函数也按此规定,不再重述)。 void ellipse(int x, int y, int stangle, int endangle,int xradius,int yradius);以(x, y)为中心,xradius,yradius为x轴和y轴半径,从角stangle 开始到endangle结束画一段椭圆线,当stangle=0,endangle=360时, 画出一个完整的椭圆。 void far rectangle(int x1, int y1, int x2, inty2); 以(x1, y1)为左上角,(x2, y2)为右下角画一个矩形框。

- 15 -

void far drawpoly(int numpoints, int far *polypoints); 画一个顶点数为numpoints,各顶点坐标由polypoints给出的多边形。polypoints整型数组必须至少有2 倍顶点数个无素。每一个顶点的坐标都定义为x,y,并且x在前。值得注意的是当画一个封闭的多边形时,numpoints 的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。 下面举一个用drawpoly()函数画箭头的例子。 #include #include int main()

{

int gdriver, gmode, i;

int arw[16]={200,102,300,102,300,107,330, 100,300,93,300,98,200,98,200,102}; gdriver=DETECT;

initgraph(&gdriver, &gmode, \setbkcolor(BLUE); cleardevice();

setcolor(12); /*设置作图颜色*/ drawpoly(8, arw); /*画一箭头*/ getch();

closegraph(); return 0; }

II、设定线型函数

在没有对线的特性进行设定之前,TURBO C 用其默认值,即一点宽的实线,但TURBO C 也提供了可以改变线型的函数。 线型包括:宽度和形状。其中宽度只有两种选择:一点宽和三点宽。而线的形状则有五种。 下面介绍有关线型的设置函数。

void far setlinestyle(int linestyle,unsigned upattern,int thickness); 该函数用来设置线的有关信息,其中linestyle是线形状的规定,见下表。

- 16 -

有关线的形状(linestyle)

━━━━━━━━━━━━━━━━━━━━━━━━━ 符号常数 数值 含义

───────────────────────── SOLID_LINE 0 实线 DOTTED_LINE 1 点线 CENTER_LINE 2 中心线 DASHED_LINE 3 点画线

USERBIT_LINE 4 用户定义线

━━━━━━━━━━━━━━━━━━━━━━━━━ thickness是线的宽度,见下表。

有关线宽(thickness)

━━━━━━━━━━━━━━━━━━━━━━━━━ 符号常数 数值 含义

───────────────────────── NORM_WIDTH 1 一点宽 THIC_WIDTH 3 三点宽

━━━━━━━━━━━━━━━━━━━━━━━━━

对于upattern,只有linestyle选USERBIT_LINE 时才有意义 (选其它线型,uppattern取0即可)。此时uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。

void far getlinesettings(struct linesettingstypefar

*lineinfo); 该函数将有关线的信息存放到由lineinfo 指向的结构中,表中linesettingstype的结构如下: struct linesettingstype{ int linestyle; unsigned upattern;

- 17 -

int thickness; }

例如下面两句程序可以读出当前线的特性 struct linesettingstype *info;

getlinesettings(info);

void far setwritemode(int mode);该函数规定画线的方式。如果mode=0,则表示画线时将所画位置的原来信息覆盖了(这是TURBO C的默认方式)。如果mode=1, 则表示画线时用现在特性的线与所画之处原有的线进行异或(XOR)操作, 实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没有画线。 有关线型设定和画线函数的例子如下所示。 #include #include int main() {

int gdriver, gmode, i; gdriver=DETECT;

initgraph(&gdriver, &gmode, \setbkcolor(BLUE); cleardevice(); setcolor(GREEN);

circle(320, 240, 98);

setlinestyle(0, 0, 3); /*设置三点宽实线*/ setcolor(2);

rectangle(220, 140, 420, 340); setcolor(WHITE);

setlinestyle(4, 0xaaaa, 1); /*设置一点宽用户定义线*/ line(220, 240, 420, 240); line(320, 140, 320, 340);

getch();closegraph();return 0; }

- 18 -

2.5 基本图形的填充

填充就是用规定的颜色和图模填满一个封闭图形。

I、先画轮廓再填充

TURBO C提供了一些先画出基本图形轮廓, 再按规定图模和颜色填充整个封闭图形的函数。在没有改变填充方式时,TURBO C 以默认方式填充。 下面介绍这些函数。

void far bar(int x1, int y1, int x2, int y2); 确定一个以(x1,y1)为左上角,(x2,y2)为右下角的矩形窗口,再按规定图模和颜色填充。

说明:此函数不画出边框,所以填充色为边框。

void far bar3d(int x1, int y1, int x2, int y2,int depth,int topflag);当topflag为非0时, 画出一个三维的长方体. 当topflag为0时,三维图形不封顶,实际上很少这样使用。 说明: bar3d()函数中,长方体第三维的方向不随任何参数而变,即始终为45度的方向。

void far pieslice(int x,int y,int stangle,int endangle,int radius); 画一个以(x, y)为圆心,radius为半径,stangle为起始角度,endangle 为终止角度的扇形,再按规定方式填充。当stangle=0,endangle=360 时变成一个实心圆,并在圆内从圆点沿X轴正向画一条半径。

void far sector(int x, int y,int stanle,intendangle,int xradius, int yradius);画一个以(x, y)为圆心分别以xradius, yradius为x轴和y轴半径,stangle 为起始角,endangle为 /*填充长方体另外两个面*/

floodfill(250,150, LIGHTRED);

rectangle(450,400,500,450); /*画一矩形*/ floodfill(470,420, LIGHTRED); /*填充矩形*/ getch();closegraph(); }

- 19 -

2.6 图形窗口操作

象文本方式下可以设定屏幕窗口一样,图形方式下也可以在屏幕上某一区域设定窗口,只是设定的为图形窗口而已,其后的有关图形操作都将以这个窗口的左上角(0, 0)作为坐标原点,而且可为通过设置使窗口之外的区域为不可接触。

这样,所有的图形操作就被限定在窗口内进行。 void far setviewport(int xl,int yl,int x2, int y2,int clipflag); 设定一个以(xl,yl)象元点为左上角,(x2,y2)象元为右下角的图形窗口,其中x1,y1,x2,y2是相对于整个屏幕的坐标。若 clipflag为非0,则设定的图形以外部分不可接触,若clipflag为0,则图形窗口以外可以接触。

void far clearviewport(void); 清除现行图形窗口的内容。 void far getviewsettings(struct viewporttype far * viewport); 获得关于现行窗口的信息,并将其存于viewporttype定义的结构变量viewport中,其中viewporttype的结构说明如下: struct viewporttype{ int left, top, right, bottom; int cliplag; }; 注意:

a. 窗口颜色的设置与前面讲过的屏幕颜色设置相同,但屏幕背景色和窗口背景色只能是一种颜色,如果窗口背景色改变,整个屏幕的背景色也将改变这与文本窗口不同。

b 可以在同一个屏幕上设置多个窗口,但只能有一个现行窗口工作,要对其它窗口操作,通过将定义那个窗口的setviewport()函数再用一次即可。

c. 前面讲过图形屏幕操作的函数均适合于对窗口的操作。

- 20 -

2.7 屏幕操作函数

除了清屏函数以外,关于屏幕操作还有以下函数: void far setactivepage(int pagenum);

void far setvisualpage(int pagenum);

这两个函数只用于EGA,VGA 以及HERCULES图形适配器。 setctivepage()函数是为图形输出选择激活页。

所谓激活页是指后续图形的输出被写到函数选定的pagenum页面,该页面并不一定可见。

setvisualpage()函数才使pagenum所指定的页面变成可见页。页面从0开始(Turbo C默认页)。

如果先用setactivepage() 函数在不同页面上画出一幅幅图像,再用setvisualpage() 函数交替显示,就可以实现一些动画的效果。

void far getimage(int xl,int yl, int x2,int y2,void far *mapbuf);

void far putimge(int x,int,y,void * mapbuf, int op); unsined far imagesize(int xl,int yl,int x2,int y2); 这三个函数用于将屏幕上的图像复制到内存,然后再将内存中的图像送回到屏幕上。首先通过函数imagesize() 测试要保存左上角为(xl,yl),右上角为(x2,y2)的图形屏幕区域内的全部内容需多少个字节,然后再给mapbuf分配一个所测数字节内存空间的指针。通过调用getimage()函数就可将该区域内的图像保存在内存中,需要时可用putimage()函数将该图像输出到左上角为点(x, y)的位置上,其中getimage()函数中的参数op规定如何释放内存中图像。 关于这个参数的定义参见下表。 putimage()函数中的op值

━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号常数 数值 含 义

────────────────────────── COPY_PUT 0 复制

- 21 -

XOR_PUT 1 与屏幕图像异或的复制 OR_PUT 2 与屏幕图像或后复制 AND_PUT 3 与屏幕图像与后复制 NOT_PUT 4 复制反像的图形

━━━━━━━━━━━━━━━━━━━━━━━━━━ 对于imagesize()函数,只能返回字节数小于64K字节的图像区域,否则将会出错,出错时返回-1。

本节介绍的函数在图像动画处理、菜单设计技巧中非常有用。 下面程序模拟两个小球动态碰撞过程。

#include #include #include int main() {

int i, gdriver, gmode, size; void *buf;

gdriver=DETECT;

initgraph(&gdriver, &gmode, \setbkcolor(BLUE); cleardevice();

setcolor(LIGHTRED); setlinestyle(0,0,1); setfillstyle(1, 10); circle(100, 200, 30); floodfill(100, 200, 12);

size=imagesize(69, 169, 131, 231); buf=malloc(size); if(!buf) return -1;

getimage(69, 169, 131, 231,buf); putimage(500, 269, buf, COPY_PUT); for(i=0; i<185; i++){

putimage(70+i, 170, buf, COPY_PUT); putimage(500-i, 170, buf, COPY_PUT); }

for(i=0;i<185; i++){

- 22 -

putimage(255-i, 170, buf, COPY_PUT); putimage(315+i, 170, buf, COPY_PUT); }

getch();

closegraph(); }

2.8 图形模式下的文本输出

在图形模式下,只能用标准输出函数,如printf(),puts(),putchar()函数输出文本到屏幕。除此之外,其它输出函数(如窗口输出函数)不能使用,即是可以输出的标准函数,也只以前景色为白色,按80列,25行的文本方式输出。

Turbo C2.0也提供了一些专门用于在图形显示模式下的文本输出函数。下面将分别进行介绍。

一、 文本输出函数

void far outtext(char far *textstring); 该函数输出字符串指针textstring所指的文本在现行位置。

void far outtextxy(int x, int y, char far *textstring);该函数输出字符串指针textstring所指的文本在规定的(x, y)位置。其中x和y为象元坐标。 说明:

这两个函数都是输出字符串,但经常会遇到输出数值或其它类型的数据,此时就必须使用格式化输出函数sprintf()。

sprintf()函数的调用格式为: int sprintf(char *str, char *format, variable-list); 它与printf()函数不同之处是将按格式化规定的内容写入str 指向的字符串中,返回值等于写入的字符个数。 例如:

sprintf(s, \这里s应是字符串指针或数组,mark为整型变量。

- 23 -

2.9 文本字体、字型和输出方式的设置

有关图形方式下的文本输出函数,可以通过setcolor()函数设置输出文本的颜色。另外,也可以改变文本字体大小以及选择是水平方向输出还是垂直方向输出。

void far settexjustify(int horiz, int vert); 该函数用于定位输出字符串。

对使用outtextxy(int x, int y, char far *str textstring)函数所输出的字符串,其中哪个点对应于定位坐标(x,y)在TurboC2.0中是有规定的。如果把一个字符串看成一个长方形的图形,在水平方向显示时,字符串长方形按垂直方向可分为顶部,中部和底部三个位置,水平方向可分为左,中,右三个位置,两者结合就有9个位置。

settextjustify()函数的第一个参数horiz 指出水平方向三个位置中的一个,第二个参数vert指出垂直方向三个位置中的一个,二者就确定了其中一个位置。当规定了这个位置后,用outtextxy() 函数输出字符串时, 字符串长方形的这个规定位置就对准函数中的(x,y)位置。而对用uttext()函数输出字符串时,这个规定的位置就位于现行游标的位置。

有关参数horiz和vert的取值参见下表。 参数horiz和vert的取值

━━━━━━━━━━━━━━━━━━━━━━━━ 符号常数 数值 用于

──────────────────────── LEFT_TEXT 0 水平 RIGHT_TEXT 2 水平 BOTTOM_TEXT 0 垂直 TOP_TEXT 2 垂直

CENTER_TEXT 1 水平或垂直

━━━━━━━━━━━━━━━━━━━━━━━━

void far settextstyle(int font, int direction,int charsize); 该函数用来设置输出字符的字形(由font确定)、输出方向(由direction确定)和字符大小(由charsize确定)等特性。

- 24 -

Turbo C2.0对函数中各个参数的规定见下列各表所示: font的取值

━━━━━━━━━━━━━━━━━━━━━━━━ 符号常数 数值 含义

──────────────────────── DEFAULT_FONT 0 8*8点阵字(缺省值) TRIPLEX_FONT 1 三倍笔划字体 SMALL_FONT 2 小号笔划字体

SANSSERIF_FONT 3 无衬线笔划字体 GOTHIC_FONT 4 黑体笔划字

━━━━━━━━━━━━━━━━━━━━━━━━ direction的取值

━━━━━━━━━━━━━━━━━━━━━━━━ 符号常数 数值 含义

──────────────────────── HORIZ_DIR 0 从左到右 VERT_DIR 1 从底到顶

━━━━━━━━━━━━━━━━━━━━━━━━ charsize的取值

━━━━━━━━━━━━━━━━━━━━━━━━ 符号常数或数值 含义

──────────────────────── 1 8*8点阵 2 16*16点阵 3 24*24点阵 4 32*32点阵 5 40*40点阵 6 48*48点阵 7 56*56点阵 8 64*64点阵 9 72*72点阵 10 80*80点阵

USER_CHAR_SIZE=0 用户定义的字符大小

━━━━━━━━━━━━━━━━━━━━━━━━

有关图形屏幕下文本输出和字体字型设置函数的用法请看下例: #include #include

- 25 -

int main() {

int i, gdriver, gmode; char s[30];

gdriver=DETECT;

initgraph(&gdriver, &gmode, \setbkcolor(BLUE); cleardevice();

setviewport(100, 100, 540, 380, 1); /*定义一个图形窗口*/

setfillstyle(1, 2); /*绿色以实填充*/ setcolor(YELLOW);

rectangle(0, 0, 439, 279); floodfill(50, 50, 14); setcolor(12);

settextstyle(1, 0, 8);

/*三重笔划字体, 水平放大8倍*/ outtextxy(20, 20, \setcolor(15);

settextstyle(3, 0, 5);

/*无衬笔划字体, 水平放大5倍*/

outtextxy(120, 120, \setcolor(14);

settextstyle(2, 0, 8); i=620;

sprintf(s, \/*将数字转化为字符串*/ outtextxy(30, 200, s); /*指定位置输出字符串*/ setcolor(1);

settextstyle(4, 0, 3); outtextxy(70, 240, s); getch();

closegraph(); return 0; }

- 26 -

第三章 程序设计说明

3.1 程序功能简介和使用方法

功能:编出来的该程序实现画虚线,实线,画圆,画椭圆,画立体形,画矩形,画直线等图形功能。

使用方法:由于为了方便左手的操作,本程序采用了流行的游戏反恐精英CS的左右上下移动。W向上画线;S向下画线;A向左画线;D向右画线;F1和F2是改变画图颜色;按键Z、X、C、V、B、N、Q等都是功能键,下面为它们分别详细说明:Z键主要是清除屏幕上所有的图形,这时按下z键,整个屏幕都变成蓝色背景,因本程序不设有固定的图形操作窗口,因此整个屏幕都做为画图窗口。X键主要是画一个立体形并填充。C键画圆,以50为半径,以X,Y轴为圆点画圆,本程序不设有以任意长为半径画圆。 V键主要是清除屏幕上的局部图形,该键能够清除上半屏幕90%的图形。B键是帮助,按B键会有相应的操作帮助文字在显示屏中显示出来,如要返回画图操作,须要清除帮助文字,清除按B键。N键画椭圆,同样,跟画圆一样,本程序不设有以任意半径为画椭圆,这时,只有以X轴,Y轴为圆心,以半径为60、40画椭圆。Q键画矩形。

空格键SPACE与回车键ENTER尤为重要,他们主要应用于画线应用,下面也为它们如何使用进行详细的说明,首先,按下ENTER键,则是画点,按下SPACE键关闭画笔;按下SPACE键然后再按下ENTER键,则打开画笔,这是画出的图形为虚线,再按下ENTER键后,虚线变为实线,如果画直线为虚线状态,那么按下Q键画出来的矩形也是虚线的边框。利用本程序可以画出很漂亮的图形出来。

注:在画图的情况下要确保在小写的状态下,也就是说要确保键盘上的CapsLock灭的状态下才能移动光标。否则移动按键将不起作用。打开程序后,要首先按F1或F2来改变作图颜色,不然将可能不能实现显示图像。

- 27 -

3.2 程序设计说明

首先从头文件开始,因为程序用到了图形函数,所以调用了graphics.h头文件图形函数,头文件下来的,define主要定义了一些按键,W、S、A、D、ESC、ENTER、F1、F2、SPACE、C、V、B、N、Q等按键,这些主要定义为键盘功能按键,这利用了键盘所具有的键盘扫描码来实现的,获得键盘码有好几种方法,设计本程序都是利用下面的程序来获得键盘扫描码,程序如下: #include #include #include main() {

int key;

gey=boiskey(0);

printf(“scancode=%d”,key); getch(); }

每输入一个键盘按键,程序就会自动获得相应的扫描码并在屏幕上显示出来,该程序能够获得键盘上的全部所有键盘扫描码。 程序接下来,用到了自己定义函数,定义一个画笔移动的函数,程序一般都是首先定义然后调用函数,本程序采用了这种方法,关于定义函数在这里不在作详细说明。

一个程序,开始都是从main()函数下执行程序的,并根据里面的所要来调用别的函数。程序里先给变量定义整形变量。gdriver=DETECT,mode,initgraph(&gdriver,&mode.””)这里是图形初始化。成开发环境Options/;Linker中的Graphics lib选为on,只有这样才能保证正确使用图形函数。使用图形模式初始化不同显示器有不同的图形分辨率。即使是同一个显示器适配器,在不同模式下也有不同的分辨率。国此,在屏幕作图之前,必须根据显示器适配器的种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时反有图形函数均不能工作。要设置屏幕为图形模式,才可以使用。关于这方面的内容,在第二章第一、二节已有详细的介绍,在此不再重要。

在图形模式下显示文字,本程序用了outtextxy(230.450,”Help-B Graduation design of SU HUA XIAN”)函数,在坐标X轴为230,Y轴为450的坐标点输出Help-B Graduation design of SU HUA

- 28 -

XIAN等英文字,在这里关于坐标,在屏幕内是这样定义的,在屏幕左上角坐标为(0,0)右下角坐标为(639,479),水平方向从左到右为X轴正向,垂直方向从上到下为Y轴正向。TURBOC的图形函数都是相对于图形屏幕坐标,即像元来说的。在图形模式下,对VGA适配器,它的最高分辨率为640*480,其中640为整个屏幕从左到右所有像元的个数,480为整个屏幕从上到下所有像元的个数。

关于文本的颜色以及屏幕背景颜色在第二章已有详细介绍,在此不再重复说明,程序流程执行到循环语句While(!kbhit()&&(!ifexit)).,在这里主要是开始执行到按键的操作,循环执行,并遇到switch语句,switch是一个选择结构,在语句体内寻找与该值吻合case标号,如果有与该值相等的标号,则执行该标号后开始的各语句,包托在其后的所有case和default中的语句,真到switch语句结束,为了必免执行下不相关的操作,switch采用了break语句间断语句,在case之后的语句最后加上break语句,每当执行到break语句时,立即跳出switch语句体。从而起到了选择的作用,语句内的主本以key按键作为体内语句,如果用户在键盘上按W键,那么语句将会执行case分支W的语句,在语句内又有一个选择语句,i

If(y>5) {

y=y-1;

action(x,y,lastx,lasty,buf[3],x1,y1,drawmode); lastx=x; lasty=y; }

如果y>5就是说以y轴为从上向下的正向,向上画线,按键X\\A\\D也同样的,在此不做详细介绍。在分支case的ESC,在这里主要执行了退出程序功能,如果用户按下ESC键时,首先执行了clrscr()清除语句,清除屏幕上的图形,并接下来执行printf输出语句,按任意键退出程序。

关于case语句后面的语句在第二章中已经提到,在此不再重复,程序一直以选择的语句和循环的语句执行,直到遇到closegraph();函数时退出图形操作,退出程序。该程序源代码比较简单,通过本程序可以了解到一般程序的设计过程和实现方法,知道程序的语法结构,程序不外乎人定义后,再执行出人相要的结果,程序流程也表现出了这种趋势,通过相应的函数并调用它,知道C语言的语法,实现自己写出一个程序并不难。

- 29 -

参考文献

任志宏 程超编著的《C语言经典范例50讲》 北京希望电子出版社出版

求是科技编著的《C&C++实效编程百例》 电子工业出版社出版

田淑清编著的《C语言程序设计》 高等教育出版社出版

谭浩强编著的《C语言程序设计》 清华大学出版社出版

[美]Donald编著的《计算机图形学C语言版》 清华大学出版社出版

苏小红编著的《C 语言大学实用教程》 电子工业出版社出版

- 30 -

附 录

附用C语言实现计算机绘图源代码:

#include #include #include #include #include

#define W 4471 /* scan code */ #define S 8051 #define A 7777 #define D 8292 #define ESC 283 #define ENTER 7181

#define F1 15104 /* pagedown&up is uesd to change color */ #define F2 15360

#define SPACE 14624 #define C 11875 #define V 12150 #define B 12386 #define N 12654 #define Q 4209 #define X 11640 #define Z 11386

void penmove(int xx,int yy,int lastxx,int lastyy,void (*buf)) {

putimage(xx,yy,buf,XOR_PUT);

- 31 -

putimage(lastxx,lastyy,buf,XOR_PUT); }

void action(int xx,int yy, int lastxx,int lastyy,void(*buf),int xx1,int yy1,int drawmode)

{

if(drawmode==2) {setwritemode(1); setlinestyle(DOTTED_LINE,0,1); line(xx1,yy1,xx,yy); line(xx1,yy1,lastxx,lastyy); }

else{penmove(xx,yy,lastxx,lastyy,buf);} }

int main(void) {

int gdriver=DETECT,mode,errorcode; int i,ucolor;

int ifexit,key,drawmode; void *buf[15];

int x,y,lastx,lasty,x1,y1; int r;

initgraph(&gdriver,&mode,\ errorcode=graphresult(); if(errorcode!=grOk)

{

printf(\ printf(\ getch(); exit(1);

}

cleardevice(); setfillstyle(1,2); setcolor(WHITE); settextstyle(1,0,1);

outtextxy(230,450, \ Graduation design of SU HUA XIAN \

- 32 -

getch();

textcolor(BLUE); setbkcolor(BLUE); setcolor(GREEN);

rectangle(0+5,0+5,getmaxx()-5,getmaxy()-5); line(5,450,635,450); setfillstyle(1,1); x=getmaxx()/2; y=getmaxy()/2; lastx=x; lasty=y;

for(i=0;i<=15;i++) {

putpixel(x,y,i);

buf[i]=malloc(imagesize(x,y,x+1,y+1)); getimage(x,y,x+1,y+1,buf[i]); }

putpixel(x,y,RED); setcolor(0);

drawmode=0; /* 0 is putpixel */ ucolor=0; ifexit=0;

while(!kbhit()&&(!ifexit)) {

key=bioskey(0);

switch(key) {

case W : if(y>5) { y=y-1; action(x,y,lastx,lasty,buf[3],x1,y1,drawmode); lastx=x; lasty=y; }

- 33 -

break; case S : if(y<449) { y=y+1; action(x,y,lastx,lasty,buf[3],x1,y1,drawmode); lastx=x; lasty=y; } break;

case A : if(x>5) { x=x-1; action(x,y,lastx,lasty,buf[3],x1,y1,drawmode); lastx=x; lasty=y; } break;

case D : if(x<(getmaxx()-5)) { x=x+1; action(x,y,lastx,lasty,buf[3],x1,y1,drawmode); lastx=x; lasty=y; } break;

case ESC :ifexit=1; clrscr();

printf( \ This is my graduation design using simple painting procedure\\n of the C language desige, \\n Please press any key to return to the window\

break;

case ENTER : switch (drawmode) {

- 34 -

case 0: putimage(x,y,buf[3],XOR_PUT); putpixel(x,y,ucolor); putimage(x,y,buf[3],XOR_PUT); break; case 1: putimage(x,y,buf[3],XOR_PUT); x1=x; y1=y; drawmode=2; break; case 2: setwritemode(1); setlinestyle(DOTTED_LINE,0,1); line(x1,y1,x,y); setwritemode(0); setlinestyle(SOLID_LINE,0,1); line(x1,y1,x,y); drawmode=0; putimage(x,y,buf[3],XOR_PUT); break;

} /*switch*/ break;

case F1 : if(drawmode!=2) { if(ucolor>0)ucolor--; else ucolor=15; setfillstyle(1,ucolor); bar(10,455,30,470); setcolor(ucolor); } break;

case F2 : if(drawmode!=2) { if(ucolor<15)ucolor++; else ucolor=0; setfillstyle(1,ucolor); bar(10,455,30,470); setcolor(ucolor); } break;

- 35 -

case SPACE : if(drawmode<1)drawmode++; else drawmode=0;

case C : if(key==C) circle(x,y,50);

break;

case V : if(key==V) clrscr(); break;

case B : if(key==B){ clrscr();

printf(\ Key operating instrucions\\n\

printf(\ 1.W/S/A/D is Heading up the or so ambuiation draw\\n\printf(\ 2.F1/F2 is The change draws the color\\n\ printf(\ 3.Z is All sketch of the clearance screen\\n\ printf(\ 4.X is Draw the stereoscopic sketch\\n\printf(\ 5.C is the circle\\n\

printf(\ 6.V is Partial sketch of clearance\\n\ printf(\ 7.B is Help\\n\

printf(\ 8.N is The painting is oval\\n\printf(\ 9.Q is Draw the rectangle\\n\

printf(\ 10.ESC is Withdraw the procedure and return to the window way\\n\\n\\n\\n\

printf(\ Please press V key to return to draw to operate the page\

} break;

case N : if(key==N) ellipse(x,y,0,360,60,40); break;

case Q : if (key==Q)

rectangle(x,y,y,x); break; case Z : if(key==Z)

cleardevice();

- 36 -

break; case X : if(key==X)

bar3d(100,200,400,300,60,1); break; } /*switch*/

} /*while*/ getch(); closegraph(); } /*main*/??

致 谢

经过两个多月的忙碌和工作,本次毕业已经接近尾声,作为

一个专科生的毕业设计,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有导师黎桓的督促指导,以及一起工作的同学们的支持,想要完成这个设计是难以想象的。

在这里,我要首先感谢我的导师黎桓。黎老师平时里工作繁多,但在我做毕业设计阶段,黎老师给予了我极大的关心和帮助。除了黎桓老师的专业水平外,他的治学严谨和科学研究的精神也是我永远学习的榜样,并将积极影响我今后的学习和工作。。在黎老师的帮助下,使我的课题研究能够顺利开展。在此,我向他表示最真挚的感谢。

其次还要感谢和我一起做毕业设计的同学,他们曾给予我很多的支持,为我解答了很多疑问。如果没有她们的帮助,此次设计的完成将变得非常困难。

然后还要感谢大学四年来所有的老师,为我打下专业知识的基础;同时还要感谢所有的同学们,正是因为有了你们的支持和鼓励。此次毕业设计才会顺利完成。

最后,感谢我的母校—柳州职业技术学院三年来对我的大力栽培,同时,我要感谢我的家人,朋友。他们永远是我前进的动力。

- 37 -

- 38 -

本文来源:https://www.bwwdw.com/article/q80g.html

Top