计算机图形学实验报告及代码 联系客服

发布时间 : 星期日 文章计算机图形学实验报告及代码更新完毕开始阅读6856d0c258f5f61fb73666c4

3.2 图形颜色设置

在画图时,往往要求配置一定的颜色以使图形光彩夺目。颜色分为前景色和背景色。前景色是指构成字符和图形点的颜色;而背景色是指整个显示屏颜色。Turbo C提供了多个颜色控制函数用来设置前景、背景、改变调色板等。 一、 颜色的设置

画图时,用户可以对当前的背景颜色和作图颜色进行设置。 1. 设置当前背景颜色

void far setbkcolor(int color);

将背景色设置成color所指定的颜色值。参数color可以用名字,也可以用数字,它们对应关系在graphics.h中定义,表3.3(见书P60)列出背景色名称和数值的对应关系。缺省时,默认值为0,即黑色。 2. 设置当前画图颜色

void far setcolor(int color);

该函数把当前画图颜色设置为color所指定颜色,即画笔的颜色。实际对应的颜色和调色板有关,缺省时,默认值是白色。

例3.11 将背景颜色设置为黄色,画笔设置为红色, 画一圆。 #include \#include \void main()

{int gdriver,gmode; gdriver=VGA; gmode=EGAHI;

initgraph(&gdriver,&gmode,\ setbkcolor(YELLOW); /*设置背景色为黄色*/ setcolor(RED);

/*设置画笔为红色*/ circle(120,100,50); /*画一圆*/ getch(); closegraph(); }

这是允许的 二、 调色板

调色板:是设置画颜笔的组合

设置当前画笔色与调色板有关,对应一个显示设备可能有多个调色板,这意味着尽管硬件能够显示多种颜色,但由于同一时间内只能使用一个调色板,所以在同一时间内只有显示 设备可能显示总颜色的一个子集可以被显示出来,因为调色板内颜色的数只受到可用视频内存的限制。根据颜色控制方法不同,可以把支持的颜色屏幕划分为两类:一类是CGA,包括CGAHI、MCGAMED、MCGAHI、ATT400MED、ATT400HI;另一类是EGA,包括EGA和VGA适配器。 1、CGA调色板

CGA类屏幕有两种分辨率:低分辨率和高分辨率。 (1)低分辨率

低分辨率方式显示320×200个像素点,4种颜色; 第三章 C语言图形程序设计基础

在CGA低分辨率方式下,可以显示4种颜色,这4种颜色由选择的调色板决定。在CGA方式下可以使用的调色板有CGAC0、CGAC1、CGAC2和CGAC3。每种CGA调色板均含有4种不同颜色,调色板不同所包含的颜色也不一样。

每种调色板只能使用与它列在同一行中的颜色,其编号依次为0、1、2、3,也可以使用符号常量。

表中调色板号是图形方式

而颜色0是背景色,颜色1、2、3是像素点颜色。调色板在initgraph函数中设置,颜色用setcolor函数设置。 背景色默认是黑色

如果setcolor(a),a>=3,那么将显示值最大的那种颜色,例如CGAC0,将显示黄色 (2)高分辨率

高分辨率方式显示640×200个像素点,只有两种颜色。黑色背景和彩色前景。由于CGA本身原因,背景色就是硬件所认为的背景色,可用setbkcolor参照课本P60表3.3设置,前景色(即画笔颜色)始终是青色。 例3.12在高分辨率下画一青色圆。 # include \#include \void main() {

int gdriver=CGA,gmode=CGAHI; initgraph(&gdriver,&gmode, \cleardevice(); setbkcolor(3);

circle(160,100,50); circle(160,100,25); getch();

closegraph(); }

程序执行后,在青色屏幕上显示两个白色圆图形。 2、EGA调色板

对EGA来说,总共可以有64种颜色,但只有一个调色板,这个调色板只有16项,可同时显示16种颜色。默认的这16种颜色可参看P60表3.3。表3.5(见书P63)的颜色不准确,是随机选取的,不作为参考。 3、改变调色板的一种颜色

void far setpalette(int oldcolor,int newcolor);

此函数改变屏幕系统所显示颜色。它把调色板oldcolor变为newcolor。 (1). 对于CGA模式,

只有背景色能改变,而背景色总是取oldcolor=0 例如,下列语句可把背景色改成绿色: setpalette(0,GREEN);

Turbo C中好像不支持对该函数的执行 (2).对于EGA模式

可以用setpalette( )函数将某一种颜色设置为16 种不同颜色中的一种。oldcolor是表3.3中任一 颜色,而newcolor是表3.5中前7种颜色。 例如:setpalette(BLUE,EGA-GREEN); 或setpalette(1,2);

将屏幕上的蓝色(BLUE)均变为绿色(EGA-GREEN) 三、获取颜色信息 1. 读取当前背景颜色 int far getbkcolor(void);

该函数返回当前背景颜色,其背景颜色值如表3.3所示。

例如:下列语句显示当前背景颜色:printf(\2. 读取当前画图颜色 int far getcolor(void);

该函数返回当前画笔颜色。

例如,在CGAC2图形模式下,调色板包含四种颜色:0为背景色,1为绿色,2为红色,3为棕色。如果 getcolor( )函数的返回值为 1,则当前画笔色为绿色。 3.读取最高可用颜色数 int far getmaxcolor(void);

该函数返回当前屏幕模式下最大有效颜色值。在EGA模式下,getmaxcolor()函数返回最大值为15,这表明用setcolor()函数值在0-15有效;在CGA低分辨率模式中,getmaxcolor()函数返回最大值为3,这表明用setcolor()函数值在0-3有效;而在CGAHI模式中,返回值为1,因为画笔始终是青色。

4. 在点(x,y)处画一规定颜色点 void far putpixel(int x,int y,int color);

把color所指定的颜色写到(x,y)处的像素上。 5.读取点(x,y)的颜色 int far getpixel(int x,int y);

此函数返回指定点x,y位置上的像素颜色。 例3.14 在不同位置画点 #include \#include \void main()

{int gdriver=DETECT,gmode; int color,i,max;

initgraph(&gdriver,&gmode, \max=getmaxcolor(); for(i=0;i<20;i++)

putpixel(50+i*10,20,max); color=getpixel(50,20); putpixel(150,150,color); getch();

closegraph(); }

得到当前屏幕模式下最大有效颜色值

以(50,20)为起点,在X正方向上每隔10用当前屏幕模式下最大有效颜色画点 得到点(50,20)的像素颜色

把color所指定的颜色写到(150,150)处的像素上。 3.3 线的特性设定和填充 一、线的特性设定

用画线函数进行画线时,其默认值均属于一像素点宽度的实线。为了改变线形与线宽,Turbo C提供了可以改变线型和线宽的函数。 void far setlinestyle(int linestyle,

unsigned pattern,int width); 该函数所用三个参数含义如下:

(1)linestyle:为整型值,用来定义所画直线类型

表中前四种为系统预定义的类型,第五个为用户自定义类型。 线型的代号说明

(2)pattern:无符号整型数。该参数在需要用户自定义线型时使用,如果是使用前四种系统预定义的线型,则该参数可取0值。

(3) width:整型数。指定所画直线的粗细,以像素为单位,分为两种情况

通过上述几个参数的不同组合,就可以根据需要画出不同类型、不同粗细的直线。 例如:setcolor(RED);

Setlinestyle(DASHED-LINE,0,THICK-WIDTH); line(10,20,150,70);

从(10,20)到(150,70)用一条红色的3个像素宽点划线

当函数setlinestyle的第一个参数为USERBIT-LINE(或4)时,可以由用户自己定义直线类型。此时,第三个参数意义同前,直线类型在第二个参数中定义,该参数是一个16位二进制码,每一位(bit)表示一个像素。某一位置1时表示直线上相应位置以当前颜色显示;如果某位为0,则其对应像素不显示或不改变(仍用原来颜色)。 例如:1111 1111 1111 1111

16位全置1,因此画一条16个像素的点实线(就是实线)。

1010 1010 1010 1010

则隔位置1,因此画一条16个像素的点虚线(就是点线)。

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

例3.15演示系统预定义的四种线型 #include \#include \void main() {

int i,j,c,x=50,y=50,k=1;

int gdriver=DETECT,gmode; printf(\

scanf(“%d”,&c); /*输入所选择的颜色*/ initgraph(&gdriver,&gmode, \cleardevice();

setbkcolor(11); /*设置背景色为浅青色*/ setcolor(c); /*设置前景色为输入颜色*/

for(j=1;j<=2;j++)

{for(i=0;i<4;i++) {setlinestyle(i,0,k);

rectangle(x,y,x+210,y+80); x=x+110; y=y+40; } k=3; x=50; y=250; } getch();

closegraph(); }

Setlinestyle(1,0,1) ,线型为点线, 1个像素宽 Setlinestyle(2,0,1) , 线型为中心线, 1个像素宽 当输入颜色为红色时结果如下:

Setlinestyle(0,0,1),线型为实线, 1个像素宽 Setlinestyle(1,0,3),线型为点线,3个像素宽 Setlinestyle(2,0,3),线型为中心线, 3个像素宽 Setlinestyle(3,0,3),线型为虚线, 3个像素宽 Setlinestyle(0,0,3),线型为实线,3个像素宽 Setlinestyle(3,0,1),线型为虚线, 1个像素宽 2.设置文本对齐方式

void far settextjustify(int horiz,int vert);

此函数规定文本输出在水平和垂直方向上的输出方式.参数horiz和vert是整型数, 用来确定文本输出的当前对齐位置。 horiz和vert的取值 horiz确定 水平方向的 对齐位置

vert确定垂直方向的对齐位置。

例如,执行settextjustify(RIGHT_TEXT,BOTTOM_TEXT);