Chinaunix首页 | 论坛 | 博客
  • 博客访问: 586057
  • 博文数量: 165
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1554
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-23 22:57
个人简介

我本仁慈,奈何苍天不许

文章分类

全部博文(165)

文章存档

2018年(1)

2016年(33)

2015年(5)

2014年(34)

2013年(92)

分类: Windows平台

2013-10-23 23:29:30

C语言中图形函数及其用法  

  |字号 订阅

C语言中图形函数及其用法 
Turbo C 2.0具有丰富的图形功能,它提供了70多个图形函数。在这里只介绍最常用的一部分,其余的图形函数及用法可参阅相关书籍。图形函数均在头文件"graphics.h"中定义,所以在程序中调用这些图形函数时,必须在程序文件的开头写上文件包含命令:#include "graphics.h"。
14.8.1 图形系统管理
PC机的显示器有两种工作模式,一种是图形模式,另外一种是文本模式(缺省模式)。在文本方式下,屏幕分为80列、25行,在该方式下,图形函数不能正确工作。因此在使用图形函数绘图之前,必须将屏幕显示适配器设置为图形模式,这就是通常所说的"图形方式初始化"。在绘图工作完毕之后,又要使屏幕回到文本方式,以便进行文本方式下的工作。
1. 图形方式初始化
图形方式初始化是通过函数initgraph()来完成的。其调用格式为:
initgraph(*gdriver,*gmode,*path);
函数initgraph()的功能是通过从磁盘上装入一个图形驱动程序来初始化图形系统,并将系统设置为图形方式。调用该函数必须用三个参数,其含义为:
gdriver是一个整型值,用来指定要装入的图形驱动程序,如果给其赋值为DETECT(该值在头文件"graphics.h"已经中定义), 则系统自动检测图形适配器的最高分辨率模式,并装入相应的图形驱动程序。
gmode是一个整型值,用来设置图形显示模式。不同的图形驱动程序有不同的图形显示模式;即使是在同一个图形驱动程序下,也可能会有几种图形显示模式。图形显示模式决定了显示的分辨率、可同时显示的颜色的多少、调色板的设置方式以及存储图形的一页数。
path是一个字符串,用来指明图形驱动程序所在的路径。如果驱动程序就在用户当前目录下,则该参数可以为空字符串,否则应给出具体的路径名。
以上介绍了initgraph 函数中的三个参数的含义。注意,前两个参数实际上是整形指针,调用时应加上地址运算符"&"。
例:
int gdriver=DETECT,gmode; 
initgraph(&gdriver,&gmode, "");
使用DETECT模式,由系统自动对硬件进行检测,并把图形显示模式设置为检测到的驱动程序的最高分辨率。
2. 关闭图形方式
在运行图形程序绘图结束后,要回到文本方式,以进行其他工作,这时应关闭图形方式。关闭图形方式要用函数closegraph()。其调用格式为:
closegraph();
函数closegraph()的作用是:释放所有图形系统分配的存储区,恢复到调用initgraph()之前的状态。函数closegraph()不需要参数。
14.8.2 屏幕管理
Turbo C 2.0提供了11个函数用于对屏幕和视图区等进行控制管理。
1. 设置视图区
在图形模式下,可以用函数setviewport()在屏幕上定义一个视图区(视图区相当于一个用于绘图的窗口)。视图区的位置用屏幕绝对坐标定义,并且可以把视图区设置为剪裁和不剪裁两种状态。
函数setviewport()的调用格式为:
setviewport(x1,y1,x2,y2,c);
函数调用中的五个参数均为整型,其中:
x1,y1:为视图区的左上角坐标。X2,y2:为视图区的右下角坐标。
C:为裁剪状态参数。当c=1时,则超出视图区的图形部分被自动裁剪掉;当c=0 时,则对超出视图区的图形不作裁剪处理。
注意:视图区建立以后,所有的图形输出坐标都是相对于当前视图区的,即视图区左上角为坐标(0,0)点,而与图形在屏幕上的位置无关。
2. 清除视图区
清除视图区可以使用函数clearviewport()。它的作用是清除掉当前的视图区,将当前点位置设置于屏幕作上角(0,0)点。执行后,原先设置的视图区将不复存在。函数的调用格式为:
clearviewport(); 
3. 清屏
清除屏幕使用函数cleardevice()。它的作用是立即清除全屏幕内容,并将当前点位置设置为原点(0,0)。但是其他的图形系统设置保持不变,如线型,充填模式等;如果设置了视图区,则视图区的设置不变,包括当前点位置设置在视图区的左上角。
清屏函数的调用格式为:
cleardevice();
14.8.3 绘图函数
绘图函数是进行图形操作的基础。用象素点几乎可以画出任何图形,但效率太低。为此TC提供了大量的基本绘图函数,以方便图形设计。
在使用绘图函数时,要随时注意画图的"当前点位置",它是绘图的起始位置。也就是说,图形总是从当前点开始画。画完一个图形后,有时当前点的位置不变,仍在原来的位置;有时则要把当前点移到新的位置。此外,为了从指定位置开始作图,有时需要先改变当前点位置,然后再作图。在调用绘图函数的时候要注意这些问题。
1. 直线类函数
用直线类函数绘制直线图形,可以用两种坐标:一种时绝对坐标;另一种是相对坐标。
Line()函数
用line()函数可以在指定的两点之间画一条直线段。其调用格式为:
line(x1,y1,x2,y2);
参数x1,y1,x2,y2均为整型,使用绝对坐标。其中(x1,y1)和(x2,y2)分别为直线的两个端点坐标。用line函数画线时,其当前点的位置不变。
例如:已知三角形的两个顶点坐标分别为:(x1,y1)、(x2,y2)和(x3,y3),则用下面的语句可以把该三点连成一个三角形:
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x1,y1);
lineto()函数
lineto()函数用于从当前点位置到指定位置画一条直线,并改变当前点的位置。在画线到指定点的同时也把当前点的位置移到了指定点(即直线的终点)。其调用格式为:
lineto(x,y);
参数x,y位指定点坐标,均为整型。
moveto()函数
函数moveto()用于移动当前点位置,并不画线。其调用格式为:
moveto(x,y);
参数x,y用于指定新的当前点位置坐标(用整型,使用绝对坐标)。调用的结果是将当前点位置移到点(x,y)处。例如:
moveto(400,10);
结果是将当前点位置移到了(400,10)处。
moveto()函数和lineto()函数配合使用,可以在两点之间画直线。例如:
moveto(400,10);
lineto(240,360);
上面的语句实现把当前点移到(400,10)处,然后从该点画线到(240,360)处。画线结束后,当前点位置在(240,360)处。
linerel()函数
linerel()函数用相对坐标画线。其功能是从当前点位置开始画线到指定点位置,该指定点位置的坐标不是以绝对坐标的形式给出,而是以其相对于当前点(即直线起点)位置的坐标增量给出的(相对坐标)。其调用格式为:
linerel(dx,dy);
参数是相对于直线起点的坐标增量。Linerel() 函数改变当前点位置到指定点处。
moverel()函数
moverel()函数的功能与moveto()函数相似,但它使用的是相对坐标,它使当前点位置在x和y方向上分别移动一个增量。其调用格式为:
moverel(dx,dy);
参数dx,dy为整型,是相对于当前点位置的增量。
下面举几个实际的绘图例子,来说明上面这些函数在使用上的差别:
例14.10: 用line函数过四点画一个矩形。
#include "graphics.h"
#include "stdio.h"
main()
{
int gdriver=DETECT,,gmode;
initgraph(&gdriver,&gmode, "");
cleardevice();
line(100,100,100,400);
line(100,400,300,400);
line(300,400,300,100);
line(300,100,100,100);
getch();
closegraph();
2. 圆弧类函数
circle()函数
函数circle()用于以指定圆心和半径的方式画圆。其调用格式为
circle(x,y,r);
参数x,y,r均为整型。其中x,y为指定的圆心坐标,r为圆的半径。
例如:
circle(300,200,100);的调用结果是:以点(300,200)为圆心,以100为半径画一个整圆。
arc()函数
arc()函数用于画圆弧。其调用格式为:
arc(x,y,args,ange,r);
函数调用时所需的五个参数均为整型。其中:
x,y为圆弧所在圆的圆心坐标。angs,ange分别为圆弧的起始角和终止角(单位为度),r为圆弧的半径。
例如:
arc(300,200,90,180,200);的结果是以点(300,200)为圆心,200为半径,从90度到180度画了四分之一圆弧。当圆弧的起始角angs=0,终止角angs=360时,则可以画出一个整圆。
ellipse()函数
函数ellipes()用于画椭圆弧或椭圆。其调用格式为:
ellipse(x,y,angs,ange,xr,yr);
函数的参数均为整型。其中:
x,y为椭圆的中心坐标,angs,ange分别为椭圆弧的起始角和终止角(单位为度),xr,yr分别为椭圆的水平轴半轴和垂直轴半轴。如果args=0,ange=360,则可以画出一个完整的椭圆。另外:
xr>yr:则画出长轴为水平方向的椭圆或椭圆弧;
xr
xr=yr:则可以画出圆或圆弧。
例14.11: 调用函数ellipse画出一个椭圆群。
#include "graphics.h"
#include "stdio.h"
main()
{
int a=150,i;
int gdriver=EDTECT,gmode;
initgraph(&gdriver,&gmode, "");
cleardevice()
for(i=10;i<=140;i+=10);
ellips(320,240,0,360,a-i,i);
getch();
closegraph();
}
3. 多边形
rectangel()函数
函数rectangle()用于绘制矩形。其调用格式为:
rectangle(x1,y1,x2,y2);
参数x1,y1,x2,y2均为整型。函数的功能是以点(x1,y1)为矩形的左上角点,以点(x2,y2)为矩形的右下角点,画一个矩形。
drawpoly()函数
函数drawpoly()可用于画一条多边折线或者一个多边形。其调用格式为:
drawpoly(nps,*pxy);
它有两个参数。第一个参数nps是一个整型数据,它表时所画多边折线的顶点数,第二个参数pxy是一个整型数组的数组名,该数组中存放了nps 个顶点的坐标值序列。例如,有一个名为d_poly的数组中存放了4个顶点的坐标为[x1,y1,x2,y2,x3,y3,x4,y4],则调用方式为:drawpoly(4,d_poly);
如果最后一个点的坐标与第一个点的坐标相同,则利用drawpoly()函数便可以画出一个封闭的多边形。此时,坐标点的数目应该是多边形的顶点数加1,即让最后一个顶点和第一个点重合。
例如,有一个名为d_poly的数组中存放了6个顶点的坐标为[x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x1,y1],则调用方式为:drawpoly(6,d_poly); 便可以画出一个具有5个顶点的封闭的多边形。
14.8.4 图形属性控制
图形的属性控制包括控制颜色和线型。颜色有背景色和前景色之分。背景色指屏幕的颜色(即绘图时的底色),前景色指绘图时图形线条所用的颜色。
任何绘图函数都是在当前的颜色(包括背景色和前景色)和线型的状态下进行绘图的。前面所举的例子中没有提当前的颜色和线型,是因为用了系统的缺省值(系统的缺省值是:背景色为黑色,前景色为白色,线型为实线)。
如果绘图时要使用系统缺省值以外的颜色和线型,则可以利用图形属性控制函数另行设置。
setbkcolor()函数
函数setbkcolor()用于设置绘图时的背景色。调用格式为:
setbkcolor(color);
参数color为一个整型数据,代表所取的颜色,可以用整型常数(0~15),也可以用符号常数。
例如,要把背景色设置成浅蓝,可以如下调用:setbkcolor(9);;9表示浅蓝。
setcolor()函数
函数setcolor()用于设置前景颜色,即绘图用的颜色。调用格式为:
setcolor(color);
参数color的含义和用法同setbkcolor()函数。
下面的例程序可以演示16种颜色。
例14.12: 显示16种颜色
#include "graphics.h"
#include "stdio.h"
main()
{
int cb,cf;
int gdriver=DETECT,gmode;
initgraph(&drive,&gmode,"");
cleardevice();
for(cb=0;cb<=15;cb++)
setbkcolor(cb);
for(cf=0;cf<=15;cf++)
{
setcolor(cf);
circle(100+cf*25,240,100);
}
getch();
}
getch();
closegraph();
}
setlinestyle()函数
函数setlinestyle()用于设置当前绘图所用的线型和宽度,这些设置限于对
直线类图形有效。其调用格式如下:
setlinestyle(sty,pat,;
该函数所用的三个函数含义如下:
sty为整型值,用来定义所画直线的类型(0~4),pat为无符号整型数,该参数
在需要用户自定义线型时使用,如果是使用系统定义的线型,则该参数可取0值,
b为整型数,指定所画直线的粗细,以象素为单位(1或3)当函数setlinestyle
的第一个参数为USERBIT-LINE(或4)时,可以由用户自己定义直线类型。
例14.13: 编写程序,显示系统预定义的四种线型。
#include "graphics.h"
#include "stdiio.h"
main()
{
int i,j,c,x=50,y=50,k=1;
int gdrive=DETECT,gmode;
printf("input color number.n")
scanf("%d",&c);
initgraph(&gdriver,&gmode, "");
cleardevice();
setbkcolor(11);
setcolor?;
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();
}
14.8.5 充填
setfillstyle() 函数
函数setfillstyle ()用来设置当前充填的模式和充填的颜色,以便用于充填一个指定的封闭区域。其调用格式为:
setfillstyle(pattern,color);
参数pattern用于指定充填的模式(取值:0~11),第二个参数color指定充填用颜色。
Floodfill()函数
函数floodfill()实施对一指定区域进行充填操作,其充填模式和颜色已由setfillstyle()函数指定。其调用格式为:
floodfill(x,y,bcolor);
参数x,y指位于充填区域内任意一点的坐标,该点作为充填的起始点。bcoloor为充填区域的边界颜色。

例14.14: 下面的例程序演示充填情况。
#include "graphics.h"
#include "stdio.h"
main()
{
int i,c,x=5,y=6;
int gdriver=DETECT,gmode;
printf("input color number.n");
scanf("%d",&c);
initgraph(&gdriver,&gmode, "");
cleardevice();
setbkcolor(9);
for(i=c;i
{
setcolor(i);
rectangle(x,y,x+140,y+104);
x=x+70;
y=y+52;
setfillstyle(1,i);
floodfill(x,y,i);
}
getch();
closegraph();
}
14.8.6 图形方式下的文本输出
settextstyle(font,direction,csize)函数。设置字符的显示风格。
函数的三个参数的含义如下
font:是一个整型数据,用于指明所要使用的文字的字体(0表示8*8位图字体;1表示三重矢量字体;2表示小号矢量字体;3表示无衬线矢量字体;4表示哥特矢量字体)。direction:是一个整型数据,表示指定文本的输出方向(0表示从左向右输出;1表示从上向下输出)。csize:是一个整型数据,表示字符的大小(实际是一个放大系数,表示对8*8点阵字符的放大倍数,取值范围是1~10)。
outtext(char *text);在当前位置输出一个文本字符串。
outtextxy(int x,int y,char *text);在x,y位置输出一个文本字符串。
14.8.7 综合举例
例14.15: 渔网图案绘制
#include "graphics.h"
#include "stdio.h"
main()
{
int x,y,x1,y1,x0=320,y0=50;
int i,j,n=5,r=20;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode, "");
cleardevice();
setbkcolor(9);
for(i=0;i<2*n;i++)
{
x1=x0-i*r;
y1=y0+i*r;
for(j=0;j<=n-1;j++)
{
x=x1+2*j*r;y=y1+2*j*r;
arc(x,y,180,270,r);
arc(x,y+2*r,0,90,r);
}
}
x1=x0-2*r;
y1=y0;
for(i=0;i<2*n;i++)
{
x1=x1+r;
y1=y1+r;
for(j=0;j<=n-1;j++)
{
x=x1-2*j*r;y=y1+2*j*r;
arc(x,y,90,180,r);
arc(x-2*r,y,270,360,r);
}
}
getch();
closegraph();
}
例14.16: 图形模式下的文本输出
#include "graphics.h"
#include "stdio.h"
#include "dos.h"
main()
{
int i,t,x=300,y=50;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode, "");
cleardevice();
setbkcolor(9);
setcolor(4);
for(i=1;i<=10;i++)
{
x=x-15;
y=y+15;
settextstyle(1,0,i);
cleardevice();
outtextxy(x,y,"it is ok");
delay(200); /* 时间延迟 */
}
getch();
closegraph();
}

阅读(5180) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~