registerbgidriver(EGAVGA_driver); 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; } 程序练习4.1:编辑例4.1程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。 程序练习4.2:编辑例4.2程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。 问题4.1:在表4.3中填写10个以上画点、画线(直线、圆、矩形)和线型设定的函数。 表4.3 基本图形函数表 函数名称
函数功能及返回值 - 15 -
函数原型 包含的头文件
程序练习4.3:设计并实现一个独特的图形绘制程序。 程序功能说明: 代码: 运行结果: 5封闭图形的填充(4学时)
填充就是用规定的颜色和图模填满一个封闭图形。 一、先画轮廓再填充
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, inttopflag);
当topflag为非0时, 画出一个三维的长方体。当topflag为0时,三维图形不封顶, 实际上很少这样使用。
说明: bar3d()函数中, 长方体第三维的方向不随任何参数而变, 即始终为45度的方向。
void far pieslice(int x, int y, int stangle, int endangle, intradius);
- 16 -
画一个以(x, y)为圆心,radius为半径,stangle为起始角度,endangle 为终止角度的扇形,再按规定方式填充。当stangle=0, endangle=360 时变成一个实心圆,并在圆内从圆点沿X轴正向画一条半径。
void far sector(int x, int y, int stanle, intendangle, intxradius, int yradius); 画一个以(x, y)为圆心分别以xradius, yradius为x轴和y轴半径,stangle 为起始角,endangle为终止角的椭圆扇形,再按规定方式填充。 二、设定填充方式
Turbo C有四个与填充方式有关的函数: void far setfillstyle(int pattern, int color);
color的值是当前屏幕图形模式时颜色的有效值。pattern的值及与其等价的。符号常数如表5.1所示。
表5.1关于填充式样pattern的规定
━━━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 EMPTY_FILL SOLID_FILL LINE_FILL
数值 含义 0 以背景颜色填充 1 以实填充 2 以直线填充 3 以斜线填充(阴影线) 4 以粗斜线填充(粗阴影线) 5 以粗反斜线填充(粗阴影线) 6 以反斜线填充(阴影线) 7 以直方网格填充 8 以斜网格填充 10 以稀疏点填充 11 以密集点填充 12 以用户定义式样填充
───────────────────────────
LTSLASH_FILL SLASH_FILL BKSLASH_FILL LTBKSLASH_FILL HATCH_FILL
XHATCH_FILL WIDE_DOT_FILL CLOSE_DOS_FILL USER_FILL
INTTERLEAVE_FILL 9 以间隔点填充
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
除USER_FILL(用户定义填充式样)以外,其它填充式样均可由setfillstyle() 函数设置。当选用USER_FILL时,该函数对填充图模和颜色不作任何改变。 之所以定义USER_FILL主要因为在获得有关填充信息时用到此项。
void far setfillpattern(char * upattern,int color);
设置用户定义的填充图模的颜色以供对封闭图形填充。
- 17 -
其中upattern是一个指向8个字节的指针。这8个字节定义了8x8点阵的图形。
每个字节的8位二进制数表示水平8点, 8个字节表示8行, 然后以此为模型向个封闭区域填充。
void far getfillpattern(char * upattern);
该函数将用户定义的填充图模存入upattern指针指向的内存区域。 void far getfillsetings(struct fillsettingstype far * fillinfo);
获得现行图模的颜色并将存入结构指针变量fillinfo中。其中fillsettingstype 结构定义如下:
struct fillsettingstype{
int pattern; /* 现行填充模式 * / int color; /* 现行填充模式 * / };
例5.1:图形填充图模的颜色的选择。 #include
main(){
char str[8]={10,20,30,40,50,60,70,80}; /*用户定义图模*/ int gdriver,gmode,i;
struct fillsettingstype save; /*定义一个用来存储填充信息的结构变量*/ gdriver=DETECT;
initgraph(&gdriver,&gmode,\ setbkcolor(BLUE); cleardevice(); for(i=0;i<13;i++) {
setcolor(i+3);
setfillstyle(i,2+i); /* 设置填充类型 * bar(100,150,200,50); /*画矩形并填充*/ bar3d(300,100,500,200,70,1); /* 画长方体并填充*/
- 18 -
pieslice(200, 300, 90, 180, 90);/*画扇形并填充*/ sector(500,300,180,270,200,100);/*画椭圆扇形并填充*/ delay(1000); /*延时1秒*/ }
cleardevice(); setcolor(14);
setfillpattern(str, RED); bar(100,150,200,50); bar3d(300,100,500,200,70,0); pieslice(200,300,0,360,90); sector(500,300,0,360,100,50); getch();
getfillsettings(&save); /*获得用户定义的填充模式信息*/ closegraph(); clrscr();
printf(\ save.pattern, save.color); /*输出目前填充图模和颜色值*/ getch(); }
以上程序运行结束后, 在屏幕上显示出现行填充图模和颜色的常数值。 三、任意封闭图形的填充
截止目前为止,我们只能对一些特定形状的封闭图形进行填充,但还不能对任意封闭图形进行填充。为此, Turbo C 提供了一个可对任意封闭图形填充的函数,其调用格式如下:
void far floodfill(int x, int y, int border);
其中: x, y为封闭图形内的任意一点。border为边界的颜色,也就是封闭图形轮廓的颜色。调用了该函数后,将用规定的颜色和图模填满整个封闭图形。
注意:
1. 如果x或y取在边界上, 则不进行填充。
- 19 -