C语言图形编程.docx

上传人:b****3 文档编号:4469624 上传时间:2022-12-01 格式:DOCX 页数:22 大小:185.76KB
下载 相关 举报
C语言图形编程.docx_第1页
第1页 / 共22页
C语言图形编程.docx_第2页
第2页 / 共22页
C语言图形编程.docx_第3页
第3页 / 共22页
C语言图形编程.docx_第4页
第4页 / 共22页
C语言图形编程.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

C语言图形编程.docx

《C语言图形编程.docx》由会员分享,可在线阅读,更多相关《C语言图形编程.docx(22页珍藏版)》请在冰豆网上搜索。

C语言图形编程.docx

C语言图形编程

C的图形编程

、屏幕显示模式

1、文本模式

在文本模式又称字符模式。

在此模式下整个屏幕被划分成(25行,80列),

共25*80个文本单元,每个单元包括一个字符和一个属性,字符即ASCII码字符,属性规定该字符的颜色和强度。

坐标原点在屏幕的左上角。

如下图所示:

°,1)

屏幕区

在vconio.h>头文件中定义了文本模式下一些函数常用的有;

(1)定义一个文本窗口

voidwindow(intleft,inttop,intright,intbottom);

如要定义一个窗口左上角在屏幕(20,5)处,大小为30列15行的窗口可写成:

window(20,5,50,25);

2)

文本窗口颜色的设置

voidtextbackground(intcolor);

//设置背景颜色

voidtextcolor(intcolor);

//设置字符颜色

有关颜色的定义见表1。

3)

光标定位

voidgotoxy(intx,inty);

4)

清屏

voidclrscr(void);

5)

其它函数

一、

窗口内文本的输出函数

intcprintf("<格式化字符串>",<变量表>);

intcputs(char*string);

intputch(intch);

cprintf()函数输出一个格式化的字符串或数值到窗口中。

它与printf()函数的用法完全一样,区别在于cprintf()函数的输出受窗口限制,而printf()函数的输出为整个屏幕。

cputs()函数输出一个字符串到屏幕上,它与puts()函数用法完全一

样,只是受窗口大小的限制。

putch()函数输出一个字符到窗口内。

二、窗口内文本的输入函数

intgetche(void);

getche()函数从键盘上获得一个字符,在屏幕上显示的时候,如果字符超过了窗口右边界,则会被自动转移到下一行的开始位置。

例1:

下面这个程序使用了关于窗口大小的定义、颜色的设置等函数,在一个屏幕上不同位置定义了7个窗口,其背景色分别使用了7种不同的颜色。

#include

#include//文本模式下的函数

voidmain(void)

{inti;

char*c[]={"BLACK","BLUE","GREEN","CYAN","RED","MAGENTA","BROWN","LIGHTGRAY"};

textbackground(0);/*设置屏幕背景色*/

clrscr();/*清除文本屏幕*/

cputs(c[0]);

for(i=1;i<8;i++)

{window(10+i*5,5+i,30+i*5,15+i);/*定义文本窗口*/textbackground(i);/*定义窗口背景色*/

clrscr();

cputs(c[i]);/*清除窗口*/

}

getch();

}

表1.有关颜色的定义

符号常数

数值

含义

字符或背景

BLACK

0

两者均可

BLUE

1

两者均可

GREEN

2

绿

两者均可

CYAN

3

两者均可

RED

4

两者均可

MAGENTA

5

洋红

两者均可

BROWN

6

两者均可

LIGHTGRAY

7

淡灰

两者均可

DARKGRAY

8

深灰

只用于字符

LIGHTBLUE

9

淡兰

只用于字符

LIGHTGREEN

10

淡绿

只用于字符

LIGHTCYAN

11

淡青

只用于字符

LIGHTRED

12

淡红

只用于字符

LIGHTMAGENTA

13

淡洋红

只用于字符

YELLOW

14

只用于字符

WHITE

15

只用于字符

BLINK

128

闪烁

只用于字符

 

例2:

捕获键盘按键。

键盘扫描码:

每个键都有一个两字节的扫描码,其格式:

High

Low

#defineESCOxOIIB

#defineUP0x4800

#defineDOWN0x5000#defineLEFT0x4B00

#defineRIGHT0x4D00

#defineENTER0x1C0D

在头文件vbios.h>中定义如下函数,用以捕获键盘按键。

intbioskey(intmode);〃此函数声明于bios.h

mode为1时,如有按键盘,则记录其扫描码至缓冲区,并返回其扫描码;无按键则返回0;不清除缓冲区。

mode为0时,从键盘缓冲区取出按键,并清除缓冲区。

若没有的话,贝U等待。

UP

DOWN

H8ghi

0

LEFT

H7gh

0

RIGHT

H7gh

0

F1

H5gh

0

F2

H6ghi

0

A

Hjghi

65

Z

H4gh

90

a

Hjghi

97

 

Hjghi

122

#include

#inlcude

unionkeyTest

{

intc;

charch[2];

};

voidmain(void)

{unionkeyTestk;

while

(1)

{while(bioskey

(1)==0);

/*function1returns0untilakeyispressed*/k.c=bioskey(0);

/*function0returnsthekeythatiswaiting*/printf(High=[%d],Low=[%d]\n”,k.c,k.ch[1],k.ch[0]);

}

}

例3:

C提供的随机函数:

voidrandomize();〃初始化随机数发生器

intrandom(intubound);//返回范围在0到ubound-1之间的一个随机整数。

2、图形模式

不同的显示器适配器(显卡)有不同的图形分辨率。

即是同一显卡,在

不同模式下也有不同分辨率。

因此,在屏幕作图之前,必须根据显卡种类将显示器设置成为某种图形模式。

016色640*200

116色640*350

216色640*480

1)图形模式的初始化

在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。

设置屏幕为图形模式,可用下列图形初始化函数:

voidinitgraph(int*gdriver,int*gmode,char*path);

表2.图形驱动器、模式的符号常数及数值

图形驱动器(gdriver)

图形模式(gmode)

一调分辨率

符号常数

数值

符号常数

数值

CGA

1

CGAC0

0

C0

320*200

CGAC1

1

C1

320*200

CGAC2

2

C2

320*200

CGAC3

CGAHI

3

4

C3

2色

320*200

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

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

用于硬件测试

例子1:

使用图形初始化函数设置VGA高分辨率图形模式#include

intmain()

intgdriver,gmode;

gdriver=VGA;

gmode=VGAHI;

initgraph(&gdriver,&gmode,"c:

\\tc");//图形模式初始化

bar3d(100,100,300,250,50,1);/*画一长方体*/

getch();

closegraph();//关闭图形模式,返回默认文本模式

return0;

}

例子2:

自动进行硬件测试后进行图形初始化有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动器,TurboC提供了一个自动检测显示器硬件后进行图形初始化的方法。

(2)退出图形状态

TurboC提供了函数closegraph(),其调用格式为:

voidfarclosegraph(void);

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

(3)屏幕颜色的设置和清屏函数

对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。

在TurboC中分别用下面两个函数。

voidfarsetbkcolor(intcolor);//设置背景色:

voidfarsetcolor(intcolor);//设置作图色:

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

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

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

白色

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

(4).基本图形函数

基本图形函数包括画点,线以及其它一些基本图形的函数。

本节对这些函数作一全面的介绍。

一、画点

1.画点函数

voidfarputpixel(intx,inty,intcolor);

该函数表示有指定的象素画一个按color所确定颜色的点。

对于颜色color的值可从表3中获得而对x,y是指图形象元的坐标。

对VGA适配器,它的最高分辨率为640x480,屏幕的左上角坐标为(0,0),右下角坐

标为(639,479),关于点的另外一个函数是:

intfargetpixel(intx,inty);

它获得当前点(x,y)

的颜色值。

2.有关坐标位置的函数

intfargetmaxx(void);

//

返回x轴的最大值。

intfargetmaxy(void);

//

返回y轴的最大值。

intfargetx(void);

//

返回光标在x轴的位置。

voidfargety(void);

//

返回光标有y轴的位置

voidfarmoveto(intx,inty);

移动光标到(x,y)点,虽不是画点,在移动过程中亦画点。

voidfarmoverel(intdx,intdy);移动光标从当前位置(x,y)移动到(x+dx,y+dy)的位置,移动过程中不画点。

二、画线

1.画线函数

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

voidfarline(intx0,inty0,intx1,inty1);

画一条从点(xO,yO)到(x1,y1)的直线。

voidfarlineto(intx,inty);画一从当前光标到点(x,y)的直线。

voidfarlinerel(intdx,intdy);

画一条从当前光标(x,y)到按相对增量确定的点(x+dx,y+dy)的直线。

voidfarcircle(intx,inty,intradius);

以(x,y)为圆心,radius为半径,画一个圆。

voidfararc(intx,inty,intstangle,intendangle,intradius);

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

在TURBOC中规定x轴正向为O度,逆时针方向旋转一周,依次为90,180,270和360度(其它有关函数也按此规定,不再重述)。

voidellipse(intx,inty,intstangle,intendangle,intxradius,intyradius);以(x,y)为中心,xradius,yradius为x轴和y轴半径,从角stangle开始到endangle结束画一段椭圆线,当stangle=0,endangle=360时,画出一个完整的椭圆。

voidfarrectangle(intx1,inty1,intx2,inty2);

以(x1,y1)为左上角,(x2,y2)为右下角画一个矩形框。

voidfardrawpoly(intnumpoints,intfar*polypoints);

画一个顶点数为numpoints,各顶点坐标由polypoints给出的多边形。

polypoints整型数组必须至少有2倍顶点数个无素。

每一个顶点的坐标都定义为x,y,并且x在前。

值得注意的是当画一个封闭的多边形时,numpoints的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。

2.设定线型函数

线型包括:

宽度和形状。

其中宽度只有两种选择:

一点宽和三点宽。

而线的形状则有五种。

在没有对线的特性进行设定之前,TURBOC用其默认值,即一点宽的实线。

下面介绍有关线型的设置函数。

voidfarsetlinestyle(intlinestyle,unsignedupattern,intthickness);

该函数用来设置线的有关信息,其中linestyle是线形状的规定,见表5。

符号常数

数值

SOLID_LINE

0

DOTTED_LINE

1

CENTER_LINE

2

DASHED_LINE

3

USERBIT_LINE

4

义线

thickness是线的宽度,见表6。

表6.

有关线宽(thickness)

符号常数

数值

NORM_WIDTH

1

点宽

THIC_WIDTH

3

点宽

含义

实线

点线

中心线

点画线

用户定

含义

表5.有关线的形状(linestyle)

线型,

对于upattern,只有linestyle选USERBIT_LINE时才有意义(选其它

uppattern取0即可)。

此进uppattern的16位二进制数的每一位代表一个象素如果那位为1,则该象素打开,否则该象素关闭。

有关线型设定和画线函数的例子如下所示。

(5)封闭图形的填充

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

一、先画轮廓再填充

TURBOC提供了一些先画出基本图形轮廓,再按规定图模和颜色填充整个封闭图形的函数。

在没有改变填充方式时,TURBOC以默认方式填充。

下面介绍这些函数。

voidfarbar(intx1,inty1,intx2,inty2);

确定一个以(x1,y1)为左上角,(x2,y2)为右下角的矩形窗口,再按规定图

模和颜色填充。

说明:

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

voidfarbar3d(intx1,inty1,intx2,inty2,intdepth,inttopflag);

当topflag为非0时,画出一个三维的长方体。

当topflag为0时,三维图形不封顶,实际上很少这样使用。

说明:

bar3d()函数中,长方体第三维的方向不随任何参数而变,即始终为45度的方向。

voidfarpieslice(intx,inty,intstangle,intendangle,intradius);

画一个以(x,y)为圆心,radius为半径,stangle为起始角度,endangle为

终止角度的扇形,再按规定方式填充。

当stangle=0,endangle=360时变成一个实心圆,并在圆内从圆点沿X轴正向画一条半径。

voidfarsector(intx,inty,intstanle,intendangle,intxradius,intyradius);

画一个以(x,y)为圆心分别以xradius,yradius为x轴和y轴半径,stangle为起始角,endangle为终止角的椭圆扇形,再按规定方式填充。

、设定填充方式

TURBOCt四个与填充方式有关的函数。

下面分别介绍

voidfarsetfillstyle(intpattern,intcolor);

color的值是当前屏幕图形模式时颜色的有效值。

pattern的值及与其等价的符号常数如表7所示。

表7.关于填充式样pattern的规定

符号常数

数值

含义

EMPTY_FILL

0

以背景颜色填

SOLID_FILL

1

以实线填充

LINE_FILL

2

以直线填充

LTSLASH_FILL

3

以斜线填充(阴影

线)

SLASH_FILL

4

以粗斜线填充

(粗阴影线)

BKSLASH_FILL

5

以粗反斜线填充

(粗阴影线)

LTBKSLASH_FILL

6

以反斜线填充(阴影

线)

HATCH_FILL

7

以直方网格填

XHATCH_FILL

8

以斜网格填充

INTTERLEAVE_FILL

9

以间隔点填充

WIDE_DOT_FILL

10

以稀疏点填充

CLOSE_DOS_FILL

11

以密集点填充

USER_FILL

12

以用户定义式

样填充

除USER_FILL用户定义填充式样)以外,其它填充式样均可由

setfillstyle()函数设置。

当选用USER_FILL时,该函数对填充图模和颜色不作

任何改变。

之所以定义USER_FILL主要因为在获得有关填充信息时用到此项。

voidfarsetfillpattern(char*upattern,intcolor);

设置用户定义的填充图模的颜色以供对封闭图形填充。

其中upattern是一个指向8个字节的指针。

这8个字节定义了8x8点阵的图形。

每个字节的8位二进制数表示水平8点,8个字节表示8行,然后以此为模型向个封闭区域填充。

voidfargetfillpattern(char*upattern);该函数将用户定义的填充图模存入upattern指针指向的内存区域。

voidfargetfillsetings(structfillsettingstypefar*fillinfo);获得现行图模的颜色并将存入结构指针变量fillinfo中。

其中fillsettingstype结构定义如下:

structfillsettingstype{

intpattern;/*现行填充模式*/

intcolor;/*现行填充模式*/

};

三、任意封闭图形的填充截止目前为止,我们只能对一些特定形状的封闭图形进行填充,但还不能对任意封闭图形进行填充。

为此,TURBOC提供了一个可对任意封闭图形填充的函数,其调用格式如下:

voidfarfloodfill(intx,inty,intborder);

其中:

x,y为封闭图形内的任意一点。

border为边界的颜色,也就是封闭图形轮廓的颜色。

调用了该函数后,将用规定的颜色和图模填满整个封闭图形。

1.如果x或y取在边界上,则不进行填充。

2.如果不是封闭图形则填充会从没有封闭的地方溢出去,填满其它地方。

3.如果x或y在图形外面,则填充封闭图形外的屏幕区域。

4.由bor

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1