C语言图形篇

C语言图形篇


2024年2月16日发(作者:)

C语言图形篇

一、Turbo C与图形接口

TC具有相当强的图形处理能力,支持CGA、EGA、VGA等图形显示器。一般的PC型显示器都可以在两种基本视频模式下工作,一种是图形方式,另一种是文本方式。文本方式即常见的命令行方式,屏幕上可以显示的最小单位是字符。常见的VGA显示适配器,可显示80列50行文本。图形方式下,屏幕上每一个可以控制的单元叫做像素(pixel),它是组成图形的基本元素,一般称为点。通常把屏幕上所包含的像素的个数叫做分辨率。分辨率越高,显示的图形越细致,质量越好。VGA显示器的分辨率为640*480,即VGA在水平方向上有640个像素,垂直方向上有480个像素。

在图形方式下,屏幕上每个像素的显示位置用点坐标系来描述。在这种坐标系中,屏幕左上角为坐标原点(0,0),水平方向为x轴,自左向右递增,垂直方向为y轴,自上向下递增,如图所示。分辨率不同,水x

maxx

(0,0)

平方向和垂直方向上的点数也不一样,即maxx、maxy数值不同。

在TC中,坐标数据可以用两种形式给出,一种是绝对坐标,另一Y

种是相对坐标。绝对坐标的参考点是坐标系的原点(0,0),x和y只能取规定范围内的正整数,其坐标值在整个屏幕范围内确定。相对坐maxy

标是相对于“当前点”的坐标,所以其坐标的参考点是当前点。在相对坐标中,x和y的取值是相对于当前点在x方向和y方向上的增量,这个增量可以是正的,也可以是负的。

二、TC图形库函数

Turbo C 3.0具有70多个图形库函数,因此其图形功能极为丰富。所有这些库函数均在头文件“graphics.h”中定义,所以,凡是在程序中要调用这些图形函数,都必须在程序文件的开头写上文件包含命令

#include

TC的图形库函数主要有6大类:图形系统管理、屏幕管理、绘图管理、图形属性控制、填充和图形方式下的文本操作。

(1)图形系统管理

在一般缺省情况下,屏幕为80列50行的文本方式,此时,所有的图形函数均不能操作,因此在使用图形函数绘图之前,必须将屏幕显示适配器设置为一种图形模式,即所谓的“图形方式初始化”。在绘图完毕后,要回到文本方式,必须关闭图形方式。

①. 图形方式初始化通过函数initgraph来完成。其调用格式为:

initgraph(*gdriver,*gmode,*path);

函数initgraph是通过从磁盘上装入一个图形驱动程序来初始化图形系统,并将系统设置为图形方式。其中3个参数的含义为:

gdriver是一个整型值,用来指定要装入的图形驱动程序,该值在头文件graphics.h中定义,常用的是DETECT、EGA和VGA。使用DETECT,由系统自动检测图形适配器的最高分辨率模式,并装入相应的图形驱动程序。

gmode是一个整型值,用来设置图形显示模式,不同的图形驱动程序有不同的图形显示模式,即使是同一个图形驱动程序下,也有几种图形显示模式。图形显示模式决定了显示的分辨率、可同时显示的颜色的多少、调色板的设置方式以及存储图形的页数。常用的几种显示模式如表所示。

图形驱动程图形显示模序(gdriver) 式(gmode)

EGA

EGALO

EGAHI

VGALO

VGA VGAMED

VGAHI

0

1

0

1

2

值 分辨率

640*200

640*350

640*200

640*350

640*480

16

16

16

16

16

颜色数

1

2

2

2

1

path是一个字符串,用来指明图形驱动程序所在的路径。如果驱动程序就在用户当前目录下,则该参数可以为空字符串,否则应给出具体的路径。一般情况下,TC安装在C盘的TC目录中,则该路径为C:TC,如果写在参数中则为“C:TC”。

例如,在程序中使用VGA图形驱动程序,图形显示模式为VGAHI,即VGA高分辨率图形模式,分辨率为640*480,则initgraph函数的调用方式如下:

int gdriver=VGA,gmode=VGAHI;

initgraph(&gdriver,&gmode,"c:TC");

也可以用整型常数代替符号常数,例如:

int gdriver=9,gmode=2;

initgraph(&gdriver,&gmode,"c:TC");

这两种方式是等效的。

另外,可使用DETECT模式,由系统自动检测,并把图形显示模式设置为检测到的驱动程序的最高分辨率。例如:

int gdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"c:TC");

②. 关闭图形方式。在运行图形程序绘图结束后,要回到文本方式,以进行其他工作,这时应关闭图形方式,关闭图形方式要调用函数closegraph。其调用格式为:

closegraph();

其作用是释放所有图形系统分配的存储区,恢复到调用initgraph之前的状态。

(2)屏幕管理

TC提供了11个函数用于对屏幕和视图区进行控制管理。常用的有以下3种。

①. 设置视图区

setviewport(x1,y1,x2,y2,c);

该函数在屏幕上定义了一个以(x1,y1)为左上角坐标,(x2,y2)为右下角坐标的视图区。c为裁减状态参数,当c=1时,超出视图区的图形部分被自动裁减掉,当c=0时,则对超出视图区的图形不作裁减处理。

视图区建立后,所有的图形输出坐标都是相对于当前视图区的,即视图区的左上角点为坐标原点(0,0),而与图形在屏幕上的位置无关。

②. 清除视图区

清除视图区函数为clearviewport,它的作用是清除当前的视图区,将当前点位置设置于屏幕的左上角(0,0)点。执行后,原先的视图区不再存在。调用格式为:

clearviewport();

③. 清屏

清屏使用函数cleardevice,它的作用是清除全屏幕,并将当前点位置设置为原点(0,0)。但是其他的图形设置保持不变,如线型、填充模式、文本格式和模式等。如果设置了视图区,则视图区的设置保持不变,包括当前点位置设置在视图区的左上角。调用格式为:

cleardevice();

(3)绘图函数

绘图函数是编写绘图程序的基础,也是任何一种图形软件的核心内容。TC的BGI(Borland Graphics Interface)提供了大量的基本绘图函数,以方便图形设计。这些绘图函数可分为直线类、圆弧类、多边形类等。

I. 直线类绘图函数

直线类绘图函数用于绘制直线,可以用两种坐标,绝对坐标和相对坐标。

①. line函数

line函数用于在指定两点之间画一条直线段:

line(int x1,int y1,int x2,int y2);

参数x1、y1、x2、y2使用绝对坐标,(x1,y1)和(x2,y2)分别为直线的两个端点坐标。用line函数画直线时,当前点的位置不变。

②. lineto函数

lineto函数用于从当前点位置到指定位置(x,y)画一条直线,并改变当前点的位置。所以在画一条直线的同时,当前点的位置也移到了指定点,即直线的终点。调用的格式为:

lineto(int x,int y);

③. linerel函数

linerel函数使用相对坐标画直线。其功能是从当前点位置开始画线到指定点位置,指定点位置的坐标不是以绝对坐标形式给出的,而是以其相对于当前点(即直线的起点)位置的坐标增量给出的。调用格式:

linerel(int dx,int dy);

假设当前点位置坐标(x,y),则“linerel(dx,dy);”等效于“lineto(x+dx,y+dy);”

④. moveto函数

moveto函数用于将当前点移动到(x,y)。调用的格式为:

moveto(int x,int y);

⑤. moverel函数

moverel函数使用相对坐标,相当于将当前点位置在x轴和y轴方向上分别移动增量dx和dy。调用的格式为:

moverel(int dx,int dy);

II. 圆弧类绘图函数

①. circle函数

圆的绘图函数是circle。该函数用于以指定圆心和半径画圆。其调用格式为:

circle(int x,int y,int r);

其中(x,y)为指定圆心的坐标,r为圆的半径。例如:“circle(320,240,100);”执行结果是以(320,240)为圆心,以100为半径画一个圆。

②. arc函数

画圆弧的函数是arc,其调用格式是:

arc(int x,int y,int angs,int ange,int x);

其中(x,y)为圆弧所在圆的圆心坐标,angs,ange分别为圆弧的起始角和终止角,单位为“度”,r为圆弧的半径。例如,调用“arc(320,240,90,180,100);”的结果是以(320,240)为圆心,100为半径,从90°~180°画了四分之一圆的圆弧。

③. ellipse函数

画椭圆的函数是ellipse。该函数用于画椭圆弧或椭圆。其调用格式为:

ellipse(int x,int y,int angs,int snge,int xr,int yr);

其中,(x,y)为椭圆的中心坐标,angs,ange为椭圆弧的起始角和终止角,单位为“度”,xr,yr分别为椭圆的水平半轴和垂直半轴。

如果angs=0,ange=360,则可以画出一个完整的椭圆。

xr>yr,则画出长轴为水平方向的椭圆或椭圆弧;

xr

xr=yr,则可以画圆或圆弧。

III. 多边形类函数

①. rectangle函数

画矩形的函数是rectangle,其调用格式为:

rectangle(int x1,int y1,int x2,int y2);

用于绘制以(x1,y1)为左上角点,以(x2,y2)为右下角点的矩形。

②. drawpoly函数

画多边形的函数为drawpoly,该函数用于画多边形(封闭的)或多边折线(不封闭的),其调用格式为:

drawpoly(int nps,int *pxy);

其中nps为要绘制的多边折线或多边形的顶点个数,pxy是数组名,该数组用于存放这些顶点的坐标,比如,有一个名为xy的整型数组中存放了4个顶点的坐标{x1,y1,x2,y2,x3,y3,

x4,y4},则调用格式为drawpoly(4,xp),如果最后一个点的坐标与第一个点的坐标相同,则可以画一个封闭多边形。

(4)图形属性控制

图形的属性控制包括颜色和线型。颜色包括背景色和前景色。背景色指的是屏幕的颜色,

即绘图时的底色。前景色指的是绘图时图形线条所用的颜色。任何绘图函数都是在当前的颜色(包括背景色和前景色)和线型状态下进行绘图的。如果在程序中没有对颜色和线型进行设置,则使用系统的缺省值。系统的缺省值是:背景色为黑色,前景色为白色,线型为实型。

如果要用到系统缺省值以外的颜色和线型,则可以利用图形颜色和线型控制函数来设置。

①. 背景色设置

设置背景色函数为setbkcolor,其功能是设置绘图时的背景颜色。调用格式为:

setbkcolor(int color);

参数color代表所取的颜色,可以为整型常数,也可以用符号常数表示,如表所示:

符号名

BLACK

BLUE

GREEN

CYAN

RED

MAGENTA

BROWN

数值

0

1

2

3

4

5

6

颜色

黑色

蓝色

绿色

青色

红色

紫红色

棕色

浅灰色

符号名

DARKGRAY

LIGHTBLUE

LIGHTGREEN

LIGHTCYAN

LIGHTRED

YELLOW

WHITE

数值

8

9

10

11

12

14

15

颜色

深灰色

浅蓝色

浅绿色

浅青色

浅红色

淡紫色

黄色

白色

LIGHTMAGENTA 13

LIGHTGRAY 7

例如,要把背景色设置成浅蓝色,可以调用:“setbkcolor(LIGHTBLUE);”或“setbkcolor(9);”。

②. 前景色设置

设置前景色函数为setcolor,其功能是设置前景色,即绘图用的颜色。调用格式为:

setcolor(int color);

其参数color的含义与setbkcolor的参数相同。

③. 线条类型设置

设置线条类型采用函数setlinestyle来实现。该函数用于设置当前绘图所用的线型和宽度,这些设置仅限于对直线类图形有效。其调用格式为:

setlinestyle(int sty,int pat,int b);

该函数所用的3个参数含义如下:

sty用来定义所画直线的类型,如表所示:

符号名

SOLID_LINE

数值

0

线型

点线

中心线

符号名 数值 线型

虚线

用户自定义类型

实线(缺省)

DASHED_LINE 3

USERBIT_LINE 4 DOTTED_LINE 1

CENTER_LINE 2

pat用于用户自定义线型。如果是使用前4种系统预定义的线型,则该参数可取0值。

b指定所画直线的粗细,以像素为单位。可取NORM_WIDTH和THICK_WIDTH两种值(对应于数值1和3),含义是1个像素宽(缺省)和3个像素宽。

当函数setlinestyle的第一个参数USERBIT_LINE(或4)时,可以由用户自己定义直线类型。此时,第3个参数的意义不变。在第2个参数中定义直线的类型,该参数是一个16位二进制码,每一位(bit)表示一个像素。某一位(bit)置1时表示直线上相应位置有显示,置0时为空。例如,1111 1111 1111 1111,16位全置1,因此是画一条实线。而1010 1010

1010 1010,隔位置1,因此是画一条点线。

在实际编写程序时,一般把16位二进制数转换为4位十六进制数,每4位二进制数转换为1位十六进制数。故上面的两个例子转换位十六进制数为FFFF和AAAA。函数的调用方法为“setlinestyle(4,0xFFFF,1);”和“setlinestyle(4,0xAAAA,1);”。用这种方法,可以根据需要定义各种线型。

(5)填充

①. setfillstyle函数

setfillstyle函数用来设置当前填充模式和填充颜色,以便用于填充一个指定的封闭区域,调用格式为:

setfillstyle(int pattern,int color);

其中,参数pattern用于指定填充模式。系统有13种预定义的填充模式,如表所示。参数color用于指定填充颜色。

EMPTY_FILL

SOLID_FILL

LINE_FILL

LTSLASH_FILL

SLASH_FILL

BKSLASH_FILL

LTBKSLASH_FILL

值 含义

0

1

2

3

4

5

6

背景颜色填充

实填充

用线“-”填充

用斜线填充(阴影线)

用粗斜线填充(粗阴影线)

用反斜线填充(阴影线)

HATCH_FILL

XHATCH_FILL

INTERLEAVE_FILL

WIDE_DOT_FILL

CLOSE_DOT_FILL

7

8

9

10

11

12

含义

网格线填充

斜网格线填充

间隔点填充

稀疏点填充

密集点填充

用户定义的模式

用粗反斜线填充(粗阴影线) USER_FILL

②. floodfill函数

floodfill函数用于对一个指定区域进行填充操作,其填充模式和颜色由setfillstyle函数指定。其调用格式为:

floodfill(int x,int y,int bcolor);

参数(x,y)指位于填充区域内任一点的坐标,该点作为填充的起始点。bcolor为填充区域的边界颜色。例如:

setcolor(RED);

circle(320,240,150);

setfillstyle(SOLID_FILL,GREEN);

floodfill(320,240,RED);

该段程序的作用是,用红色画一个圆,然后用绿色色块填充该圆。

③. fillellipse函数

fillellipse函数用于画一个填充的实椭圆,用当前颜色画出边线。其调用格式为:

fillellipse(int x,int ,int rx,int ry);

其参数(x,y)为椭圆中心坐标,rx、ry分别为椭圆的水平和垂直半轴长。同floodfill函数一样,fillellipse使用前,也必须由setfillstyle函数指定当前的填充模式和颜色。

④. sector函数

sector函数用于画一个填充的椭圆扇区,用当前颜色画出边线。其调用格式为:

sector(int x,int ,int angs,int ange,int rx,int ry);

其参数意义与ellipse函数相同,同时,使用前也必须由setfillstyle函数指定当前的填充模式和颜色。

⑤. fillpoly函数

fillpoly函数用于画并填充一个多边形(必须首尾两点重合以确保多边形封闭),边线用当前颜色画出。其调用格式为:

fillpoly(int nps,int *pxy);

其参数意义与drawpoly函数相同,同时,使用前也必须由setfillstyle函数指定当前的填充模式和颜色。

(6)图形方式下的文本操作

①. outtext函数

outtext函数用于在当前位置输出一个文本字符串。其调用格式为:

outtext(char *text);

参数text是一个字符串,例如:“outtext("Hello world");”将在当前位置输出一个字符串“Hello world”。

②. outtextxy函数

outtextxy函数用来在(x,y)位置输出一个字符串。其调用格式为:

out settextstyle(int font,int direction,int csize);textxy(int x,int y,char *text);

参数(x,y)为指定位置的坐标,text为待输出的字符串。

在图形方式下,BGI提供了两种输出文本的方式,一种是位映象字符(或称点阵字符);另一种是笔划字体(或称矢量字符)。位映象字符为缺省方式,即在一般情况下输出文本时,都是以位映象字符显示的。

笔划字体不是以位模式表示的,每个字符被定义为一系列的线段或笔划的组合。笔划字体可以灵活地改变其大小,而且不会降低分辨率。系统提供了4种不同的笔划字体,即小号字体、3倍字体、无衬线字体和黑体。每种笔划字体都存放在独立的字体文件中,文件扩展名为“.chr”,一般情况下安装在与BGI相同的目录下。为了使用笔划字体,必须装入相应的字体文件。

③. 设置文本类型

函数settextstyle用于在使用笔划字体之前装入字体文件,其调用格式为:

settextstyle(int font,int direction,int csize);

font用来指定所使用的字体,其取值如表所示:

符号名 值 含义

8*8位图字体(缺省)

三重矢量字体

符号名

SMALL_FONT

GOTHIC_FONT

值 含义

2

4

小号矢量字体

无衬线矢量字体

黑体矢量字体

DEFAULT_FONT 0

TRIPLEX_FONT 1

SANSSERIF_FONT 3

direction用于指定文本的输出方向,取值为HORIZ_DIR(或0),表示从左向右输出(缺省);VER_DIR(或1),表示从上到下输出。

csize用来表示字符的大小。该参数实际上是一个放大系数,它表示对8*8点阵的放大倍数,其取值范围是1~10,它即影响点阵字符,也影响笔划字体。

调用了settextstyle函数后,设置了输出字符的字体、输出方向及大小,这些设置将outtext和outtextxy所产生的文本输出。

三、图形的动态显示

计算机图形的动画显示实际上是一系列静止图像在不同位置的重放。大部分动态显示程序模拟运动的基本方法是相同,即在屏幕某一显示位置上先擦除一个静止图像,然后在临近的位置上绘出下一幅图,程序重复地执行擦除和绘制的过程,就产生所需要的动画效果。

以上所述的动画方式对于简单的图形效果是很好的,但对于较为复杂的图形来说,效果就不是很好了,因为复杂图形的重画时间较长。为了解决这一问题,还可以采用多页方式显示动画。

在TC的图形子系统中,提供了两个重要的页面设置函数,即设置图形输出活动页函数setactivepage和设置可见图形页函数setvisualpage,其函数声明为:

void far setactivepage(int);

void far setvisualpage(int);

多个图形页交替显示的过程如下:在所用的两个页面中,当一个可见页面用于显示时,另一个关闭页同时用于绘图。当新的画面绘成后,就把两页进行互换,原来作为显示用的页面现在关闭用来绘制新的图形,而原来的绘图页面被激活作为可见页。

一般可把画面显示顺序做如下安排:第1页用于显示动画过程的1,3,5„„画面,第2页用于显示2,4,6„„画面,如此交替下去,利用页面转换技术进行动态显示。因为图形的擦除和重画过程都在后台进行,屏幕傻瓜出现的仅仅是整幅画面的瞬间切换,所以动态效果十分平滑。

图形页实际上是一个虚假页面,是内存中开辟的一块内存缓冲区。活动图像既可以是当前显示页,也可以是非显示页。当用函数setactivepage选定某一页作为活动页后,其后所有的图形输出都针对该页。有了多个图形页面,程序可以先将图形输出到一个非显示屏幕页上,然后调用setvisualpage改变可见页来快速显示、关闭图形页面中的画面。


发布者:admin,转转请注明出处:http://www.yc00.com/news/1708062193a1538060.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信