图3.2 屏幕颜色设置与清屏程序运行结果截图2 问题3.1:说明以上运行结果。 问题3.2:按照示例填写表3.3。 表3.3 屏幕颜色设置于清屏等函数表 函数名称 函数功能及返回值 清屏函数,返回值void 函数原型 void cleardevice() 包含的头文件 graphics.h 示例: cleardevice bar3d circle delay setcolor setbkcolor getcolor getbkcolor getmaxcolor 程序练习3.2:设计并实现一个独特的屏幕颜色设置程序。 程序功能说明: 代码: 运行结果: 4基本图形函数(4学时)
基本图形函数包括画点、线以及其它一些基本图形的函数。 一、画点 1. 画点函数
void far putpixel(int x, int y, int color);
- 10 -
该函数表示有指定的象元画一个按color所确定颜色的点。对于颜色color的值可从表3.1中获得,x, y是指图形象元的坐标。
在图形模式下,是按象元来定义坐标的。对VGA适配器,它的最高分辨率为640x480,其中640为整个屏幕从左到右所有象元的个数,480 为整个屏幕从上到下所有象元的个数。屏幕的左上角坐标为(0, 0), 右下角坐标为(639, 479),水平方向从左到右为x轴正向,垂直方向从上到下为y轴正向。Turbo C 的图形函数都是相对于图形屏幕坐标,即象元来说的。
关于点的另外一个函数是: int far getpixel(int x, int y); 它获得当前点(x, y)的颜色值。 2. 有关坐标位置的函数 int far getmaxx(void); 返回x轴的最大值。 int far getmaxy(void); 返回y轴的最大值。 int far getx(void); 返回游标在x轴的位置。 void far gety(void); 返回游标有y轴的位置。 void far moveto(int x, int y);
移动游标到(x, y)点,不是画点,在移动过程中亦画点。 void far moverel(int dx, int dy);
移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置,移动过程中不画点。 二、画线 1. 画线函数
Turbo C提供了一系列画线函数: void far line(int x0, int y0, int x1, int y1); 画一条从点(x0, y0)到(x1, y1)的直线。 void far lineto(int x, int y);
- 11 -
画一作从现行游标到点到(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)为右下角画一个矩形框。 void far drawpoly(int numpoints, int far *polypoints);
画一个顶点数为numpoints, 各顶点坐标由polypoints 给出的多边形。 polypoints整型数组必须至少有2倍顶点数个元素。每一个顶点的坐标都定义为x,y, 并且x在前。值得注意的是当画一个封闭的多边形时, numpoints 的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。
例4.1:用drawpoly()函数画箭头。 #include
#include
int gdriver, gmode, i;
int arw[16]={200, 102, 300, 102, 300, 107, 330,100, 300, 93, 300, 98, 200, 98, 200, 102};
- 12 -
gdriver=DETECT;
registerbgidriver(EGAVGA_driver); initgraph(&gdriver, &gmode, \ setbkcolor(BLUE); cleardevice();
setcolor(12); /*设置作图颜色*/ drawpoly(8, arw); /*画一箭头*/ getch(); closegraph(); return 0; }
2. 设定线型函数
在没有对线的特性进行设定之前, Turbo C用其默认值, 即一点宽的实线,但Turbo C也提供了可以改变线型的函数。线型包括:宽度和形状。其中宽度只有两种选择: 一点宽和三点宽。而线的形状则有五种。下面介绍有关线型的设置函数。 void far setlinestyle(int linestyle, unsigned upattern, intthickness);
该函数用来设置线的有关信息,其中linestyle是线形状的规定,见表4.1,thickness是线的宽度,见表4.2。
表4.1 有关线的形状(linestyle)
━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义 ───────────────────────── SOLID_LINE CENTER_LINE
0 实线 2 中心线 3 点画线 4 用户定义线
DOTTED_LINE 1 点线 DASHED_LINE USERBIT_LINE
━━━━━━━━━━━━━━━━━━━━━━━━━
表4.2 有关线宽(thickness)
━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数
- 13 -
数值 含义
───────────────────────── NORM_WIDTH THIC_WIDTH
1 一点宽 3 三点宽
━━━━━━━━━━━━━━━━━━━━━━━━━
对于upattern, 只有linestyle选USERBIT_LINE 时才有意义( 选其它线型,uppattern取0即可)。uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。
void far getlinesettings(struct linesettingstype far *lineinfo);
该函数将有关线的信息存放到由lineinfo 指向的结构中,linesettingstype的结构如下:
struct linesettingstype{
int linestyle; unsigned upattern; int thickness; }
下面两句程序可以读出当前线的特性: struct linesettingstype *info; getlinesettings(info);
void far setwritemode(int mode);
该函数规定画线的方式。如果mode=0, 则表示画线时将所画位置的原来信息覆盖了(这是Turbo C的默认方式)。如果mode=1, 则表示画线时用现在特性的线与所画之处原有的线进行异或(XOR)操作, 实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没有画线。
例4.2:有关线型设定和画线函数的例子。 #include
#include
int gdriver, gmode, i; gdriver=DETECT;
- 14 -