第2章绘制图形
【本章学习目标】
z掌握设置与关闭图形模式的函数。
z能正确调用颜色函数设置图形的颜色。
z掌握使用C语言绘制图形的基本步骤。
z掌握基本绘图函数。
z了解图形模式下输出字符的函数。
C语言不仅可以处理字符和数值,还可以绘制图形。C语言的图形函数可以方便地绘制直线、圆和圆弧等基本图形,这
些基本图形又可以组合出复杂的图形。本章简要介绍C语言的绘图功能和常用图形函数。学完本章内容后,您也能使用C语
言绘制出美丽的图形。
2.1设置屏幕显示模式
字符和图形是两类不同的显示对象,它们对屏幕的要求是不同的。屏幕通常使用不同的显示模式显示这两类对象。要使
用C语言正确处理字符和图形,就需要先掌握屏幕显示模式的基础知识,掌握设置屏幕显示模式的方法。
2.1.1屏幕显示模式概述
屏幕显示模式就是数据在屏幕上的显示方式。C语言把屏幕显示模式分为文本模式和图形模式两种。文本模式通常用于
显示文本,图形模式则用于显示图形。C语言默认屏幕显示模式为文本模式。
1.屏幕坐标系
显示器的工作原理与电视机的工作原理相似,其屏幕上规则地排列着许多细小的发光点。这些发光点的明暗和色彩的不
同组合,就组成了屏幕上绚丽多姿的画面。
为了便于指定屏幕上显示内容的位置,我们取屏幕左上角为坐标原点,第一行所在位置为x轴,第一列所在位置为y轴,建立
如图2-1所示的屏幕直角坐标系。
建立屏幕直角坐标系后,就可以用有序数对(x,y)表示屏幕上点的位置。在点的坐标(x,y)中,x指定点的列坐标,y指
定点的行坐标。例如,屏幕左上角点的坐标即为(0,0)。而屏幕上其它点的坐标则与屏幕显示模式有关,同一个点的坐标可
能随着屏幕显示模式的改变而改变。
请读者注意:数学中建立平面直角坐标系后,平面上任意一点的位置可以用一个有序实数对来表示。建立屏幕直角坐标
系后,屏幕上任意一点的位置可以用一个有序整数对来表示。而屏幕直角坐标系的坐标原点在屏幕的左上角,y轴的正方向
y
x
O
图2-1屏幕坐标系
页码,1/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
向下,坐标轴的单位与屏幕显示模式有关,这些都是与数学中的平面直角坐标系不同之处。
2.文本模式
如果显示数据的最小单位是一个字符,则称该显示模式为文本模式。在文本模式下,屏幕一般被划分为25行80列,即整
个屏幕可以显示25×80个字符。
在文本模式下,行的编号依次是0、1、2、…、24,列的编号依次是0、1、2、…、79。即行坐标y的取值范围是0≤y≤
24之间的正整数,列坐标x的取值范围是0≤x≤79之间的正整数。屏幕左上角的坐标是(0,0),屏幕右下角点的坐标为(79,
24)。
3.图形模式
显示器屏幕上的每个发光点称为一个象素。如果显示数据的最小单位是一个象素,则称该显示模式为图形模式。在图形
模式下,一个显示器屏幕上象素的数目由显示器的分辨率决定,如果分辨率是640×480,则屏幕被划分为480行640列,即每
行有640个象素,每列有480个象素。常用的显示器分辨率有640×480,800×600,1024×768等,分辨率越高,象素越多,
显示的图形就越精确、越光滑。
一个显示器通常可以使用多种分辨率,用户可以按照需要方便地设置分辨率。在分辨率为640×480的显示器屏幕上,列
的编号依次为0、1、2、…、639,行的编号依次为0、1、2、…、479。即列坐标x的取值范围为0≤x≤639之间的正整数,行
坐标y的取值范围为0≤y≤479之间的正整数。屏幕左上角点的坐标仍然是(0,0),屏幕右下角点的坐标为(639,479)。
4.测试x轴坐标的最大值
由于不同类型显示器的分辨率不同,在图形模式下屏幕上点的多少也不同。所以,了解图形模式下屏幕坐标的最大值,
对于正确安排图形在屏幕上的位置是非常重要的。
测试图形屏幕x轴坐标的最大值可以使用getmaxx函数,该函数的一般形式为:
getmaxx()
【函数功能】返回图形模式下屏幕x轴坐标的最大值。
5.测试y轴坐标的最大值
测试图形屏幕y轴坐标的最大值使用getmaxy函数,该函数的一般形式为:
getmaxy()
【函数功能】返回图形模式下屏幕y轴坐标的最大值。
2.1.2设置和关闭图形模式
在实际生活中绘图,需要先准备好纸和画笔,再使用画笔在纸上作图。使用C语言的图形函数在屏幕上作图与之类似:
先将屏幕设置成某种图形模式,再调用作图函数绘制图形。例1.5的演示程序可以在屏幕上画一个半径为50的圆。程序中的
语句:
intdriver,mode;
driver=DETECT;
initgraph(&driver,&mode,"c:\\tc");
调用图形驱动程序,设置屏幕为图形模式。语句中各项的意义正是本节将要介绍的内容。
1.图形驱动程序
把屏幕设置为图形模式,需要根据显示器的类型调用不同的图形驱动程序。C语言为常见的彩色或单色显示器提供了图
形驱动程序。图形驱动程序的符号和意义见表2-1。
表2-1图形驱动程序
我们可以使用表示图形驱动程序的符号和数值调用图形驱动程序。例如,对VGA彩色显示器,可以使用符号VGA或数
符号常量数值意义
DETECT0自动测试显示卡类型,选择相应的驱动程序
CGA1CGA彩色显示器
EGA3EGA彩色显示器
EGAMONO5EGA单色显示器
VGA9VGA彩色显示器
页码,2/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
值9调用其驱动程序。
2.图形模式
显示器类型不同,显示模式一般也不同。因此,在绘制图形之前,还必须根据显示器的实际情况将显示器设置成所需的
图形模式。常见CGA、EGA和VGA显示器的图形模式如表2-2所示。
表2-2图形模式
从表中可以看出,不同类型的显示器,有不同的图形模式。同一种类型的显示器,也可能有几种图形模式,每种图形模
式对应一种分辨率。与调用图形驱动程序相似,我们也使用表中的符号和数值指定图形模式。例如,对于分辨率为640×480
的VGA显示器,可以使用符号VGAHI或数值2指定其图形模式。
3.设置图形模式
C语言默认屏幕显示模式为文本模式。要使用C语言作图,首先要设置屏幕显示模式为某种图形模式。
设置屏幕为图形模式可以使用initgraph函数,该函数的调用形式是:
initgraph(&驱动程序,&图形模式,路径);
【函数功能】调用指定的图形驱动程序,设置屏幕为图形模式。
【参数说明】
z“驱动程序”指定调用的图形驱动程序。“驱动程序”用表2-1中的符号或数值表示。例如对VGA显示器,函数中既
可以使用符号VGA,又可以使用数值9指定驱动程序。请注意,不要遗忘驱动程序前面的符号“&”。
z“图形模式”指定屏幕的图形模式。“图形模式”用表2-2中的符号或数值表示。例如对分辨率为640480的VGA显示
器,函数中既可以使用符号VGAHI,又可以使用数值2指定图形模式。也请注意,不要遗忘图形模式前面的符号“&”。
z“路径”指定存放图形驱动程序的路径。如果图形驱动程序存放在当前盘的当前文件夹中,可以用空字符串""表示
该路径;如果图形驱动程序存放在C盘的\TC文件夹中,可以用如下字符串表示该路径:
"c:\\tc"
注意别遗忘双引号,并且反斜杠是两个。
(1)用户指定图形模式
如果您已经知道所使用的显示器类型和图形模式,那么设置屏幕为图形模式是非常简单的事。例如,对于分辨率为640
×480的VGA显示器,可以使用如下语句把屏幕设置成图形模式:
intdrive,mode;
drive=VGA;
mode=2;
initgraph(&drive,&mode,"c:\\tc");
其中第1行定义了两个整型变量,第2行和第3行给这两个变量赋值,使drive存放表示VGA驱动程序的符号常量VGA,
mode存放表示VGA高分辨率显示模式的数值2。第4行调用initgraph函数设置屏幕为图形模式。参数“c:\\tc”指定驱动程序存
放的位置是C:\TC文件夹。
显示器类型图形模式符号常量数值分辨率色调
CGA
CGAC00320×200C0
CGAC11320×200C1
CGAC22320×200C2
CGAC33320×200C3
CGAHI4640×2002色
EGA
EGALO0640×20016色
EGAHI1640×35016色
EGAMONOEGAMONOHI0640×3502色
VGA
VGALO0640×20016色
VGAMED1640×35016色
VGAHI2640×48016色
页码,3/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
(2)自动测试并设置图形模式
如果您不知道所使用的显示器类型和图形模式,可以使用自动测试的方法设置屏幕为图形模式,这也是initgraph函数最
常用的一种用法。
自动测试并设置屏幕为图形模式可以使用以下语句:
intdrive,mode;
drive=DETECT;
initgraph(&drive,&mode,"c:\\tc");
其中第2条语句给变量drive赋值为DETECT,使程序能自动测试显示器,并选择相应的驱动程序设置图形模式。我们经
常使用自动测试的方法设置图形屏幕,请读者很好地掌握这种方法。
4.关闭图形模式
在图形模式下调用图形函数作图结束后,通常要关闭图形模式,恢复系统的默认状态。关闭图形模式可以使用
closegraph函数,该函数的调用形式为:
closegraph();
【函数功能】关闭图形模式,将屏幕恢复为文本模式。
5.用C语言绘图的基本步骤
使用C语言的图形函数在屏幕上作图有三个基本步骤:
①设置屏幕为图形模式。
②调用作图函数绘制图形。
③关闭图形模式。
【例2.1】在屏幕上画一个圆的演示程序。
/在屏幕上画一个白色圆圈的演示程序T201.C/
#include"graphics.h"
main()
{
intdrive,mode;
drive=DETECT;
initgraph(&drive,&mode,"c:\\tc");/设置图形模式/
cleardevice();/清屏/
circle(300,200,60);/画一个圆/
getch();
closegraph();/关闭图形模式/
}
运行程序时,将在黑色的屏幕上画一个白色的圆圈。
【说明】
z程序第2行的include命令指出图形函数的头文件。要使用图形函数作图,请一定记住使用这条命令。
z程序中使用自动测试显示器,并设置图形模式语句。
z程序第9行在屏幕上画一个圆。画圆函数circle将在下面介绍。
z程序第11行关闭图形模式,使屏幕返回字符模式。
2.2绘制图形
一幅复杂的图形,通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。而其中的三
角形、矩形、平行四边形又可以由直线组成。C语言提供了画直线、矩形、圆、圆弧、椭圆等基本图形的函数。只要我们正
页码,4/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
确使用这些基本绘图函数,同样可以画出美丽的图画。
2.2.1画直线形
许多图形可以由直线组成。如图2-2所示的房屋,可以由矩形、平行四边形和三角形组成。使用C语言的画直线函数和画
矩形函数,可以方便地画出该房屋。
图2-2房屋示意图
1.画直线函数
画直线函数line可以在指定位置画一条指定长度的直线。该函数的调用形式为:
line(x1,y1,x2,y2);
【函数功能】在指定位置画一条直线。
【参数说明】“x1,y1”指定直线始点的坐标,“x2,y2”指定直线终点的坐标。一般情况下,x1、y1、x2、y2是整型
数据。
例如,要在点(20,50)与(100,200)之间画一条直线,可以使用语句:
line(20,50,100,200);
【特殊情况】
z如果x1与x2相等,y1与y2不相等,则line函数在屏幕上画一条竖直线。
z如果y1和y2相等,x1与x2不相等,则line函数在屏幕上画一条水平线。
z如果x1与x2相等,y1与y2也相等,则line函数在屏幕上画一个点。
2.2.2画矩形函数
画矩形函数rectabnle可以在指定位置画一个指定大小的矩形。该函数的调用形式为:
rectabnle(x1,y1,x2,y2)
【函数功能】在指定位置画一个矩形。
【参数说明】“x1,y1”指定矩形左上角顶点的坐标,“x2,y2”指定矩形右下角顶点的坐标。一般情况下,x1、y1、
x2、y2是整型数据。
例如,要在屏幕上以点(20,50)为左上角顶点,以点(100,200)为右下角顶点,画一个矩形,可以使用语句:
rectangle(20,50,100,200);
画直线函数可以画矩形,画矩形函数也可以画直线。在rectangle函数中,如果x1与x2相等,y1与y2不相等,则画一条竖
线。如果x1与x2不相等,y1与y2相等,则画一条横线。
【例2.2】画出如图2-2所示的房屋。
分析:这个房屋主要由三个矩形(正面、门、窗),两个平行四边形(侧面、屋顶),一个三角形和两条直线(窗户中
的线条)组成,矩形可以调用rectangle函数画出,平行四边形、三角形和直线可以调用line函数画出。根据使用C语言绘图的
三个基本步骤,容易写出如下的程序。
页码,5/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
/绘制房屋示意图的程序T202.C/
#include"graphics.h"
main()
{
intdrive,mode;
drive=DETECT;
initgraph(&drive,&mode,"c:\\tc");/设置图形模式/
rectangle(225,250,480,400);/画正面/
rectangle(390,320,440,400);/画门/
rectangle(260,290,300,330);/画窗户/
line(260,310,300,310);
line(280,290,280,330);
line(200,200,455,200);/画屋顶/
line(455,200,480,250);
line(200,200,225,250);
line(160,230,200,200);
line(160,230,225,250);/画左面/
line(160,230,160,380);
line(160,380,225,400);
getch();
closegraph();/关闭图形模式/
}
【说明】编写程序时,可以改变确定直线和矩形位置的点的坐标。但请读者注意设计各条线和各个矩形的位置。
2.2.3画圆和圆弧
C语言的画圆函数、画圆弧函数和画椭圆函数,提供了画圆、画圆弧、画椭圆和椭圆弧等曲线的功能。如图2-3所示的
“笑脸”图形,可以由一个大圆、两个小圆、三条直线、两条圆弧组成。使用画圆函数、画圆弧函数和画直线函数,可以方
便地画出该图形。
图2-3笑脸
1.画圆函数
画圆函数circle可以在指定位置画一个指定大小的圆。该函数的调用形式为:
circle(x,y,半径);
【函数功能】在指定位置画一个圆。
【参数说明】“x,y”指定圆心的坐标,“半径”指定圆的半径。
例如,在屏幕上画一个圆心在(300,200),半径为50的圆,可以使用语句:
circle(300,200,50);
页码,6/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
2.画圆弧函数
画圆弧函数arc可以在指定位置画一个指定大小的圆弧。该函数的调用形式为:
arc(x,y,起始角,终止角,半径);
【函数功能】在指定位置画一个圆弧。
【参数说明】
z“x,y”指定圆心的坐标。
z“起始角”指定圆弧开始的角度,“终止角”指定圆弧结束的角度。它们的取值范围一般是0~360,如果“起始角”
是0,“终止角”是360,则函数arc画一个圆。
z“半径”指定圆弧的半径。
例如,要在屏幕上以(300,200)为圆心,起始角为0,终止角为180,半径为50画一条圆弧,可以使用语句:
arc(300,200,0,180,50);
3.画椭圆或椭圆弧线函数
画椭圆函数ellipse可以在指定位置画一个指定大小的椭圆或椭圆弧线,该函数的调用形式为:
ellipse(x,y,起始角,终止角,横轴,纵轴);
【函数功能】在指定位置画一个椭圆或椭圆弧线。
【参数说明】
(1)“x,y”指定椭圆中心的坐标,
(2)“起始角”指定图形开始的角度,“终止角”指定图形结束的角度。“起始角”与“终止角”的取值范围一般为0~
360。
(3)“横轴”指定椭圆横轴的长度,“纵轴”指定椭圆纵轴的长度。当横轴长度和纵轴长度不等时,画椭圆或椭圆弧
线。当横轴长度和纵轴长度相等时,画圆或圆弧线。
例如,在屏幕上画一个中心坐标为(300,200),起始角度为0度,终止角度为360度,横轴半径为80,纵轴半径为50的椭
圆,可以使用语句:
ellipse(300,200,0,360,80,50);
又如,在屏幕上画一条中心坐标为(300,200),起始角度为0度,终止角度为180度,横轴半径为80,纵轴半径为50的椭
圆弧线,可以使用语句:
ellipse(300,200,0,180,80,50);
【例2.3】画一张如图2-3所示的“笑脸”图形。
分析:图2-3所示的“笑脸”由一个大圆表示脸,两个小圆表示眼睛,三条直线组成鼻子,两条圆弧组成嘴。大圆和小
圆可以调用画圆函数circle画出,圆弧可以调用画圆弧函数arc画出,直线可以调用画直线函数line画出。根据使用C语言作图
的三个基本步骤,可以写出如下的程序:
/画“笑脸”的程序T203.C/
#include"graphics.h"
main()
{
intdrive,mode;
drive=DETECT;
initgraph(&drive,&mode,"c:\\tc");/设置图形模式/
circle(150,100,80);/画脸/
circle(120,80,15);/画左眼/
circle(180,80,15);/画右眼/
line(145,105,140,125);/画鼻子/
line(155,105,160,125);
line(140,125,160,125);
arc(150,80,235,305,60);/画圆弧(嘴的上线)/
arc(150,110,210,330,40);/画圆弧(嘴的下线)/
页码,7/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
getch();
closegraph();/关闭图形模式/
}
2.2.4设置线型和线宽
实际生活中画图时,人们常常使用不同的线形和不同粗细的线条表现图形的不同意义。使用C语言绘制图形时也可以使
用实线、点线、点划线等多种线形,可以使用细线和粗线画图。
1.线型
C语言能够使用的线形见表2-3。
表2-3线形
2.线宽
C语言能够使用的线宽见表2-4。
表2-4线宽
前面各例中调用图形函数画出的图形,边界线都是实线,线宽都是一点宽。其实您还可以根据需要设置画线的线型和线
宽,用画线函数画出不同线型和线宽的图形。
3.设置线形和线宽
设置线型和线宽可以使用函数setlinestyle,该函数的调用形式为:
setlinestyle(线形,自定义线型,线宽);
【函数功能】设置画线的线型和线宽。
【参数说明】
z“线形”指定画线的形状,它的取值见表2-4。
z“线宽”指定画线的宽度,它的取值见表2-5。
z“自定义线型”只在“线形”取4的时候才有意义,当线形取0~3时,“自定义线型”取0即可。使用自定义线型涉及
到二进制数的知识,本书从略,有兴趣的读者请参阅其它书籍。
z参数“线型”和“线宽”对矩形都起作用,但“线型”对圆、椭圆和圆弧不起作用,“线宽”对直线、椭圆和圆弧不
起作用。如果不设置线宽和线型,则系统默认所画的线是一点宽的实线。
2.3设置屏幕显示颜色
前面的程序ST22.C,可以在黑色的屏幕上画出白色的圆圈,这种图形不够美观。C语言可以使用彩色显示器提供的颜色
资源,在屏幕上画出彩色图形。
符号常量数值线形
SOLID_LINE0实线
DOTTED_LINE1点线
CERTER_LINE2中心线
DASHED_LINE3点划线
USERBIT_LINE4用户自定义线
符号常量数值线宽
NORM_WIDTH1一点宽
THICK_WIDTH3三点宽
页码,8/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
2.3.1颜色简介
彩色显示器为我们提供了丰富多彩的颜色,C语言可以在彩色显示器上绘制出彩色图形。在C语言中可以方便地设置屏
幕对象的颜色,常见的EGA和VGA显示器的颜色说明见表2-5。
表2-5颜色定义
我们可以使用表示颜色的符号和数字表示颜色。例如,可以使用字符RED或数字4表示红色。
2.3.2设置屏幕颜色
实际生活中在纸上绘画时,当画笔的颜色与纸的颜色不相同时,我们在纸上画的图形可以显示出来。调整纸的颜色或画
笔的颜色,可以改善绘图的色彩效果。在屏幕上绘图与在纸上绘图类似,只要屏幕的颜色与绘图的颜色不相同,即可显示出
所画的图形。屏幕的颜色称为背景色,屏幕上显示对象的颜色称为前景色。正确设置背景色和前景色,C语言将按照您设置
的颜色画出图形。
1.设置前景色
前景色决定屏幕上显示对象的颜色。C语言的作图函数都使用当前前景色作图。因此,要用什么颜色画图,在调用作图
函数之前就先设置它为前景色。
设置前景色可以使用setcolor函数,该函数的调用形式为:
setcolor(颜色代码);
【函数功能】设置图形屏幕的前景色。
【参数说明】“颜色代码”指定显示对象的颜色。
对EGA或VGA显示器,可以使用表2-5中的数字或符号指定颜色。例如,设置前景色为红色,可以使用如下语句:
setcolor(4);
或
setcolor(RED);
2.设置背景色
背景色决定屏幕的颜色。设置背景色可以使用setbkcolor函数,该函数的调用形式为:
setbkcolor(颜色代码);
【函数功能】设置图形屏幕的背景色。
【参数说明】“颜色代码”指定屏幕的颜色。
对EGA或VGA显示器,可以使用表2-5中的数字或符号指定颜色。例如,设置背景色为淡蓝色,可以使用如下语句:
setbkcolor(9);
或
setbkcolor(LIGHTBLUE);
3.以背景色清屏
调用setbkcolor函数设置背景色后,系统并不立即改变当前屏幕的颜色,只有在调用了以背景色清屏的函数cleardevice
颜色符号常量数值颜色符号常量数值
黑色BLACK0深灰色DARKGRAY8
蓝色BLUE1淡蓝色LIGHTBLUE9
绿色GREEN2淡绿色LIGHTGREEN10
青色CYAN3淡青色LIGHTCYAN11
红色RED4淡红色LIGHTRED12
洋红色MAGENTA5淡洋红
色
LIGHTMAGENTA13
棕色BROWN6黄色YELLOW14
淡灰色LIGHTGRAY7白色WHITE15
页码,9/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
后,屏幕颜色才会变成设置的背景色。
以背景色清屏函数的调用形式为:
cleardevice();
【函数功能】清除图形屏幕的显示信息,使用当前背景色填充整个屏幕,并将图形输出位置移到屏幕右上角顶点。
【例2.4】画彩色图形的演示程序。
/在白色屏幕上画一个绿色圆圈和蓝色圆圈的程序T204.C/
#include"graphics.h"
main()
{
intdrive,mode;
drive=DETECT;
initgraph(&drive,&mode,"c:\\tc");/设置图形模式/
setbkcolor(WHITE);/设置背景色为白色/
cleardevice();/以背景色清屏/
setcolor(GREEN);/设置前景色为绿色/
circle(240,300,60);/画一个圆/
setcolor(BLUE);/设置前景色为蓝色/
circle(360,300,60);/画一个圆/
getch();
closegraph();/关闭图形模式/
}
运行程序时,将在白色的屏幕上画一个绿色的圆圈和一个蓝色的圆圈。
【说明】从程序运行结果可以看出,设置了前景色后,C语言的作图函数就以当前前景色作图。改变前景色,即可画出
不同颜色的图形。
3.测试背景色和前景色
如果在程序中作图改变了系统的颜色设置,则在结束程序运行之前通常应恢复原来的颜色设置。正确使用测试前景色和
背景色的函数,可以方便地恢复前景色和背景色的设置。
(1)测试前景色
在程序中,常常需要测试当前的前景色。测试前景色使用getcolor函数,该函数的调用形式是:
getcolor();
【函数功能】返回当前前景色的设置。
【函数返回值】返回一个表示颜色的整数。
(2)测试背景色
在程序中,常常需要测试当前的背景色。测试背景色使用getbkcolor函数,该函数的调用形式是:
getbkcolor();
【函数功能】返回当前背景色的设置。
【函数返回值】返回一个表示颜色的整数。
【例2.5】在淡蓝色屏幕上画一个黄色的圆,并在程序结束前恢复图形模式的颜色设置。
分析:在淡蓝色屏幕上画一个黄色的圆,
/恢复图形模式颜色设置的演示程序T205.C/
#include"graphics.h"
main()
{
intdrive,mode,a,b;
drive=DETECT;
initgraph(&drive,&mode,"c:\\tc");/设置图形模式/
页码,10/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
a=getcolor();/保存前景色的设置/
b=getbkcolor();/保存背景色的设置/
setcolor(YELLOW);
setbkcolor(LIGHTBLUE);
cleardevice();
circle(330,230,60);/画一个圆/
getch();
setcolor(a);/恢复前景色/
setbkcolor(b);/恢复背景色/
cleardevice();/以背景色清屏/
closegraph();/关闭图形模式/
}
本程序在设置屏幕为图形模式后,先用变量a、b保存前景色与背景色的颜色代码;再设置前景色和背景色,并调用作图
函数作图;完成作图操作后,在关闭图形模式之前,利用保存的前景色与背景色的颜色代码,再次设置前景色和背景色,即
可恢复系统的前景色和背景色设置。
2.4填充彩色图形
前面介绍的作图函数只能画出图形的边框线,不能为图形填充颜色。C语言还专门提供了填充图形的函数,可以方便地
画出彩色的图形。
2.4.1设置填充模式
1.填充的图案
C语言可以使用图案或颜色填充图形。填充图形的颜色如表2-5所示,填充图形的图案如表2-6所示。
表2-6填充图案的说明
我们可以使用表中的符号和数字表示填充图案。例如,可以使用字符SOLID_FILL或数字1表示用单色填充,用字符
LINE_FILL或数字2表示用直线填充。
2.设置填充模式的函数
符号常量数值意义
EMPTY_FILL0用背景色填充
SOLID_FILL1用单色填充
LINE_FILL2用直线填充
LTSLASH_FILL3用斜线填充
SLASH_FILL4用粗斜线填充
BKSLASH_FILL5用粗反斜线填充
LTBKSLASH_FILL6用反斜线填充
HATCH_FILL7用直方网格填充
XHATCH_FILL8用斜方网格填充
INTERLEAVE_FILL9用间隔点填充(线)
WIDE_DOT_FILL10用稀疏点填充
CLOSE_DOT_FILL11用密集点填充
USER_FILL12用自定义式样填充
页码,11/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
要作一个填充的图形,首先要设置填充模式,再调用填充图形的函数。设置填充模式,就是指定使用什么图案或什么颜
色来填充图形。如果不设置填充模式,C语言默认以白色进行单色填充。
设置填充模式可以使用setfillstyle函数。该函数的调用形式为:
setfillstyle(图案,颜色);
【函数功能】设置填充模式。
【参数说明】
z“颜色”指定填充图形时使用的颜色。“颜色”可以使用表2-5中的字符或数值设置。
z“图案”指定填充图形的图案,“图案”的取值如表2-6所示。
例如,设置填充图案为单色填充,填充颜色为绿色,可以使用语句:
setfillstyle(1,2);
或
setfillstyle(SOLID_FILL,GREEN);
调用setfillstyle函数设置填充模式后,再调用下面介绍的画填充图形的函数,即可画出使用指定图案和颜色填充的图
形。
2.4.2填充基本图形的函数
1.填充矩形的函数
前面介绍的rectangle函数可以画出矩形的边框,但不能为矩形填充颜色。画填充的矩形可以使用函数bar,该函数的调用
形式为:
bar(x1,y1,x2,y2);
【函数功能】画一个填充的矩形。
【参数说明】(x1,y1)指定矩形左上角顶点的坐标,(x2,y2)指定矩形右下角顶点的坐标。一般情况下,它们都是整型
数据。
例如,以(100,50)为左上角顶点,以(200,150)为右下角顶点,画一个填充矩形,可以使用下列语句:
bar(100,50,200,150);
bar函数与rectangle函数的功能不同,bar函数画填充的矩形,而rectangle函数只画出矩形边框。
【例2.6】画填充矩形的演示程序。
/填充矩形的演示程序T206.C/
#include"graphics.h"
main()
{
intdrive,mode;
drive=DETECT;
initgraph(&drive,&mode,"c:\\tc");/设置图形模式/
setcolor(YELLOW);/设置前景色为黄色/
setbkcolor(LIGHTBLUE);/设置背景色为淡蓝色/
cleardevice();
setfillstyle(SOLID_FILL,RED);/设置填充模式为单色填充红色/
bar(200,100,300,150);/画填充的矩形/
getch();
closegraph();/关闭图形模式/
}
【说明】
z程序中设置前景色为黄色、背景色为淡蓝色、填充模式为单色填充红色。运行程序时,将在淡蓝色屏幕上画一个红色
的圆。这说明前景色的设置并不影响画填充矩形的函数bar。
z如果要为填充的矩形添加一个边框,可以在画出填充矩形后调用rectangle函数在相同位置用前景色画矩形。
页码,12/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
2.填充三维条形图的函数
bar函数可以画一个填充的矩形,而bar3d函数则可以画一个填充的三维条形图。bar3d函数的调用形式为:
bar3d(x1,y1,x2,y2,深度,顶);
【函数功能】画一个填充的三维条形图。
【参数说明】
z“x1,y1”指定条形图左上角顶点的坐标,“x2,y2”指定条形图右下角顶点的坐标。
z“深度”指定条形图的深度。
z“顶”指定是否为条形图画一个顶。如果“顶”不等于0,bar3d函数将为条形图画一个矩形顶,否则不画矩形顶。
zbar3d函数用当前前景色画出条形图的边线。如果设置其“深度”和“顶”都为0,则画一个有边框的填充矩形。
例如,在屏幕上以点(200,100)为左上角顶点,以点(300,150)为右下角顶点,画一个深度为20的有顶填充的三维条形
图,可以使用下列语句:
bar3d(200,100,300,150,20,1);
将程序T206.C中的“bar(200,100,300,150);”语句改为“bar3d(200,100,300,150,20,1);”,运行程序即可看到bar3d函数画
出的有顶用红色填充的三维条形图。
3.填充椭圆的函数
画填充的椭圆可以使用fillellipse函数,该函数的调用形式为:
fillellipse(x,y,横轴,纵轴);
【函数功能】画一个填充的椭圆。
【参数说明】
z“x,y”指定椭圆中心的坐标。
z“横轴”指定椭圆横轴的半径,“纵轴”指定椭圆纵轴的半径。如果横轴与纵轴相等,则画一个填充的圆。
zfillellipse函数用当前前景色画出椭圆的边框。
例如,在屏幕上以点(300,200)为椭圆的中心,横轴半径为100,纵轴半径为80,画一个填充的椭圆,可以使用下列语
句:
fillellipse(300,200,100,80);
【例2.7】在淡蓝色的屏幕上画一个半径为30的红色填充的圆。
分析:红色填充的圆可以调用fillellipse函数(设置其横轴与纵轴相等)画出。由于fillellipse函数用当前前景色画出椭圆
的边框,所以程序中应设置前景色与填充圆的颜色相同。根据用C语言作图的三个步骤,容易写出如下的程序。
/画红色填充圆的程序T207.C/
#include"graphics.h"
main()
{
intdriver,mode;
driver=DETECT;
initgraph(&driver,&mode,"c:\\tc");/设置图形模式/
setcolor(RED);/设置前景色/
setbkcolor(LIGHTBLUE);/设置背景色/
cleardevice();
setfillstyle(SOLID_FILL,RED);/设置填充模式/
fillellipse(320,400,30,30);/画一个填充的圆/
getch();
closegraph();/关闭图形模式/
}
运行程序时,将在淡蓝色的屏幕下方画一个红色填充的圆。
4.填充扇形的函数
画填充的扇形可以使用pieslice函数,该函数的调用形式为:
页码,13/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
pieslice(x,y,起始角,终止角,半径)
【函数功能】画一个填充的扇形。
【参数说明】
z“x,y”指定扇形圆心的坐标。
z“起始角”指定扇形开始的角度,“终止角”指定扇形结束的角度。
z“半径”指定扇形半径的长度。
例如,在屏幕上以点(300,200)为圆心,起始角为30,终止角为150,半径为60,画一个填充的扇形,可以使用下列语
句:
pieslice(300,200,30,150,60);
画填充的圆一般不使用pieslice函数。即使“起始角”为0,“终止角”为360,pieslice函数画出的填充图形也不是圆。
2.4.3填充任意封闭图形的函数
前面介绍了填充矩形、椭圆、扇形和圆的函数,但使用它们填充任意封闭图形还不够方便。例如,使用以上函数填充三
角形、菱形就很不方便。
填充任意封闭图形可以使用setfillstyle函数。该函数的调用形式为:
floodfill(x,y,边界颜色);
【函数功能】填充封闭图形。
【参数说明】
z“x,y”指定填充区域内任意一点的坐标。
z“边界颜色”指定填充区域边界的颜色。可以使用表2-5列出的符号或数值指定边界颜色。
例如,用红色填充包含点(300,200)的封闭图形,且使其边框为白色,可以使用以下语句:
setfillstyle(SOLID_FILL,RED);/设置填充模式/
floodfill(300,200,15);/填充图形/
使用floodfill函数填充图形时,如果指定的点(x,y)在封闭图形的区域内部,则区域内部被填充;如果点(x,y)在封闭图
形的区域之外,则区域外部被填充。如果图形不是一个封闭区域,则填充时颜色会从没有封闭的地方溢出去,填满其它地
方。
【例2.8】在淡蓝色的屏幕上画一个淡绿色的三角形,该三角形的顶点为(320,140)、(385,245)、(260,245)。
分析:三角形可以使用画线函数line画出,填充封闭的三角形可以使用setfillstyle函数,根据题意,应设置前景色为淡绿
色、背景色为淡蓝色,设置填充模式为单色填充淡绿色。
/画填充淡绿色三角形的程序T208.C/
#include"graphics.h"
main()
{
intdriver,mode;
driver=DETECT;
initgraph(&driver,&mode,"c:\\tc");/设置图形屏幕/
setcolor(LIGHTGREEN);/设置前景色为淡绿色/
setbkcolor(LIGHTBLUE);/设置背景色为淡蓝色/
cleardevice();
line(320,140,385,245);/画三角形/
line(385,245,260,245);
line(260,245,320,140);
setfillstyle(SOLID_FILL,LIGHTGREEN);/设置填充模式/
floodfill(320,240,10);/填充三角形/
getch();
closegraph();/关闭图形模式/
页码,14/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
}
运行程序时,将在淡蓝色的屏幕上画一个淡绿色的三角形。
2.5图形模式下显示字符
本章前面各个例子的程序中,都只画出了图形,而没有显示提示信息,这给使用带来一些不方便。下面将介绍图形模式
下显示字符的函数。
2.5.1指定当前输出位置
要在屏幕上的指定位置输出文本,需要先指定输出字符的起始位置。在图形模式下改变当前输出位置使用moveto函数,
该函数的调用形式为:
moveto(x,y);
【函数功能】改变当前输出位置到指定的点。
【参数说明】“x,y”指定当前输出位置的坐标。
例如,在图形模式下,要把当前输出位置移动到点(150,200),可以使用语句:
moveto(150,200);
2.5.2图形模式下输出文本
1.图形模式下输出文本的函数
在图形模式下输出字符通常使用outtext函数。该函数常常与moveto函数联合使用,实现从指定位置开始输出字符的功
能。
outtext函数的调用形式为:
outtext(字符串);
【函数功能】在图形模式下输出指定的文本字符。
【参数说明】“字符串”指定输出的文本字符。函数从当前位置开始输出字符。
例如,在图形模式下,要从点(50,100)开始输出字符China,可以使用下列语句:
moveto(50,100);/指定输出位置/
outtext("China");/输出字符/
遗憾的是,outtext函数不能正确处理中文字符,并且输出的字符不太美观。所以,该函数常常与文本字体设置函数一起
使用,输出美观的英文字符。
2.C语言的英文字体
C语言可以使用多种字体输出英文字符。常用的字体如表2-7所示。
表2-7字体
我们可以使用表中的符号或数值设置字符的字体。例如,可以使用SMALL_FONT或数值2表示小号矢量字体。
3.设置字符格式的函数
设置文本字符的字体和大小可以使用settextstyle函数,该函数的调用形式为:
符号常量数值意义
DEFAULT_FONT08×8位图字体
TRIPLEX_FONT1三重矢量字体
SMALL_FONT2小号矢量字体
SANS_SERIF_FONT3无衬线矢量字体
GOTHIC_FONT4哥特矢量字体
页码,15/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
settextstyle(字体,方向,大小);
【函数功能】设置在图形模式下显示的字体。
【参数说明】
z“字体”设置显示字符的字体。设置字体可以使用表2-7所示的字符和数值。
z“方向”指定显示字符的方向是水平的(从左向右)还是垂直的(逆时针旋转90度)。指定显示字符的方向可以使用表2-8
所示的字符和数值。
表2-8显示方向
z“大小”指定显示字符的大小,当“大小”取数值1、2、3、…、10时,输出字符的点阵大小依次为:8×8、16×
16、24×24、…、80×80。
例如,设置输出字体为8×8位图字体,按水平方向显示,字符大小为24×24点阵,可以使用语句:
settextstyle(0,0,3);
或
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
最后,我们画如图2-4所示的图作为本章的结束。图形下半部分是绿色的田野,太阳正从地平线上升起,上方有一行字
符“Pressanykeytocontinue…”。这幅图可以用作某个应用程序入口的封面。
图2-4C语言绘制的图画
【例2.9】图形模式下显示字符的演示程序。
/画田野和太阳,并显示字符的演示程序T209.C/
#include"graphics.h"
main()
{
intdrive,mode;
drive=DETECT;
initgraph(&driver,&mode,"c:\\tc");/设置屏幕为图形模式/
cleardevice();/清除图形屏幕显示信息/
符号常量数值意义
HORIZ_DIR0从左向右
VERT_DIR1从底向上
页码,16/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
/画太阳/
setcolor(12);/设置前景色为淡红色/
circle(320,380,50);/画太阳的圆弧/
setfillstyle(SOLID_FILL,LIGHTRED);/设置填充模式/
floodfill(320,375,12);/填充太阳/
/画草地/
setbkcolor(7);/设置背景色为淡灰色/
setfillstyle(SOLID_FILL,GREEN);/设置填充模式为单色填充绿色/
bar(0,380,639,479);/画一个填充的矩形(草地)/
setcolor(14);/设置前景色为黄色/
line(0,380,639,380);/画草地上的横线/
line(0,390,639,390);
line(0,410,639,410);
line(0,440,639,440);
line(0,479,639,479);
line(0,400,60,380);/画草地上的左斜线/
line(0,430,130,380);
line(0,479,200,380);
line(120,479,245,380);
line(210,479,280,380);
line(280,479,310,380);
line(360,479,330,380);/画草地上的右斜线/
line(430,479,360,380);
line(520,479,395,380);
line(639,479,450,380);
line(639,430,520,380);
line(639,400,590,380);
settextstyle(1,0,4);/设置显示的字体和字型/
moveto(100,150);
outtext("Pressanykeytocontinue...");/输出字符/
getch();
closegraph();/关闭图形模式/
}
运行程序时,将显示如图2-4所示的图画。学习了第4章后,您可以让太阳慢慢地从地平线上升起。学习了第5章后,您
可以将本程序改写成由多个自定义函数组成,使程序更容易理解。
小结
本章介绍了使用C语言绘制图形的基础知识。包括图形模式的设置和关闭;,屏幕颜色的设置,C语言的基本绘图函数
和填充图形的知识。还简单介绍了图形模式下字符的显示。
C语言图形函数的头文件是graphics.h。如果程序中要调用图形函数,请记住在程序开头使用include命令指出图形函数的
头文件。
编写绘制图形的C程序,通常按照如下三个基本步骤进行:
页码,17/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
①设置屏幕为图形模式。
②用作图函数绘制图形。
③关闭图形模式。
设置屏幕为图形模式调用initgraph函数,绘制图形调用C语言的绘图函数,关闭图形模式调用closegraph函数。
本章介绍的常用绘图函数如表2-9所示。
表2-9常用绘图函数
其中画直线函数可以画出点,画椭圆函数可以画出椭圆弧,画填充椭圆的函数可以画出填充的圆。
调用画直线函数,需要给出直线两个端点的坐标。调用画矩形或填充矩形的函数,需要给出矩形左上角和右下角两个顶
点的坐标。调用画圆函数,需要给出圆心坐标和半径。调用画圆弧或填充扇形的函数,需要给出圆心坐标、起始角与终止
角、半径。调用画椭圆函数,需要给出中心坐标、起始角与终止角、x轴半径与y轴半径。调用画填充椭圆的函数,需要给出
中心坐标、x轴半径与y轴半径。
使用C语言绘制彩色图形时,通常先调用setbkcolor函数和cleardevice函数设置背景色,调用setcolor函数设置前景色,调
用setfillstyle函数设置填充模式,再调用绘图函数和画填充图形的函数按指定颜色画出图形。对于不规则的图形,可以先用
基本绘图函数画出图形的边线,再调用floodfill函数为图形填充颜色。
函数功能函数功能
initgraph设置图形模式line画直线
closegraph关闭图形模式rectabnle画矩形
setlinestyle设置线型和线宽circle画圆
setcolor设置前景色arc画圆弧
setbkcolor设置背景色ellipse画椭圆
cleardevice以背景色清屏setfillstyle设置填充模式
moveto设置当前输出位置bar画填充的矩形
outtext图形模式下输出字符bar3d画填充的三维条形图
getmaxx测试x轴坐标的最大值pieslice画填充的扇形
getmaxy测试y轴坐标的最大值fillellipse画填充的椭圆
getcolor测试前景色floodfill填充任意封闭图形
getbkcolor测试背景色
页码,18/18第二章绘制图像基础
2010-5-31http://www.cdvtc.com/jpkc/cyy/wlkt/2.htm
|
|