c语言打印图形B,C语言图形编程(三、绘图函数-02) B

71. ellipse()画椭圆弧函数

功能: 函数ellipse()使用当前绘图色画一椭圆弧。

用法: 该函数调用方式为void ellipse(int x,int y,int startangle,int endangle,

int xradius,int yradius);

说明: 参数x,y为椭圆中心坐标,startangle和endangle为给定的起始角和终止角,xradius与yradius为椭圆的x轴半径与y轴半径,如果startangle为0 ,endangle等于360度,那么画出的是个完整的椭圆。ellipse()函数不同于arc()和circle()函数,屏显纵横比不能自动调节。若需要的是成比例的半径而不是特定的像素距离,则y轴距离必须调节为yradius*aspectratio(y轴半径乘以纵横比)。

此函数对应的头文件为graphics.h

返回值: 无

例: 在屏幕上画一个鸡蛋形的椭圆。

#includevoid main()

{

int driver,mode;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

ellipse(200,100,0,360,80,40);

getch();

restorecrtmode();

}

72. fillellipse() 画椭圆区函数

功能: 函数fillellipse()使用当前绘图色画一椭圆,然后用当前填充色图样和填充色填充所画的椭圆。

用法: 此函数调用方式为void fillellipse(int x,int y,int xradius,int yradius);

说明: 参数x,y为椭圆中心坐标,xradius,yradius为水平轴半径和垂直轴半径。

这个函数对应的头文件为graphics.h

返回值: 无

例: 画一填充椭圆:

#include#include#define R 60

void main()

{

int driver,mode;

int xasp,yasp;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

fillellipse(getmaxx()/2,getaxy()/2,66,44);

getaspectratio(&xasp,&yasp);

fillellipse(R,R,R,R*(long)xasp/(long)yasp);

getch();

closegraph();

}

73. pieslice() 画扇区函数

功能: 函数pieslice()使用当前绘图色画一圆弧,并把弧两端与圆心分别连一直线段(即半径),然后用当前填图样和填充色进行填充,即得扇区。

用法: 这个函数调用方式为void pieslice(int x,int y,int startangle,int endangle,int radius);

说明: 函数pieslice()的操作类似于arc()函数(即同调用参数一样,只是函数名不同),因此调用此函数的详细说明参见函数arc()的相应内容。该函数对屏显纵横比能自动调节进行补偿。

pieslice()函数对应的头文件为graphics.h

返回值:无

例: 显示一个扇形图,每45度为一个不同的扇区:

#includevoid main()

{

int driver,mode;

int i,start,end;

driver=DETECT;

mode=0;

initgraph(&driver,mode,"");

start=0;

end=45;

for(i=0;i<8;i++)

{

setfillstyle(SOLID_FILL,i);

pieslice(260,200,start,end,100);

start+=45;

end+=45;

}

getch();

restorecrtmode();

}

74. sector() 画椭圆扇区函数

功能: 函数sector()先用当前绘图色画椭圆扇形轮廓,然后用当前填充图样和填充色进行填充,即得椭圆扇区。

用法: 该函数调用方式为void sector(int x,int y,int startangle,int endangle,int xradius,int yradius);

说明: 参数x,y为椭圆中心坐标,startangle和endangle为起始角与终止角,xradius与yradius是水平轴半径和垂直轴半径即长短轴。当startangle为0,endangle为360度时,调用此函数可画得一个完整的椭圆区。角度增加方向为反时针方向。设定填充图样和填充色,用setfillstyle()或setfillpattern()函数,若画轮廓线或填充扇区出现错误,则graphresult()函数返回值-6。对屏显纵横比,sector()函数不能自动调节补偿。

返回值: 无

例: 画出两个椭圆扇区:

#include#include#define R 80

void main()

{

int driver,mode;

int xasp,yasp;

initgraph(&driver,&mode,"");

sector(getmaxx()/2,getmaxy()/2,0,656,R,R);

getaspectratio(&xasp,&yasp);

setctor(getmaxx()/2,getmaxy()/2,180,135,R,R*(long)xasp/(long)yasp);

getch();

closegraph();

}

75. getarccoords()获取圆弧坐标函数

功能: 函数getarccoords()将最后一次调用arc()或ellipse()画的圆弧或椭圆弧的起终点坐标和中心坐标填入arccoordstype型结构里,进而从该结构中获取这些坐标值。

用法: getarccoords()函数调用方式为void getarccoords(struct arccoordstype *coordsp);

说明: 调用此函数填写coordsp指向的结构,从而获得起终点坐标和中心坐标值。它们可用于画弦、半径以及其它与圆弧端点相连的直线等。pieslice()函数就要用到这些值。如果最后一次调用的函数是circle(),那么getarccoords()将返回圆心坐标和起终点坐标即圆的位置。

arccoordstype型结构定义如下:

struct arccoordstype {

int x,y;

int xstart,ystart,xend,yend;

};

其中,x,y存放中心坐标;xstart,ystart,xend,yend分别存放起终点坐标。

值得注意的是,结构里起终点(xstart,ystart)与(xend,yend)坐标是像素值,不是角度值,这和调用arc()或ellipse()函数所用的不一样。当然中心坐标(x,y)与调用函数时所用的是一样的。

这个函数的头文件是graphics.h

返回值: 返回最后一次调用圆或椭圆函数的相应起终点与中心坐标值,并存放在coordsp指向的结构里。

例: 下面的程序画圆心在(100,100)的四分之一圆弧,然后于弧两端点之间连一直线。

#includevoid main()

{

int driver,mode;

struct arcccoordstype arcinfo;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

arc(100,100,0,90,88);

getarccoords(&arcinfo);

line(arcinfo.xstart,arcinfo.ystart,arcinfo.xend,arcinfo.yend);

getch();

restorecrtmode();

}

(五)、 填充函数

前面已经涉及到了用填充图样和填充色填充图形的问题,如调用pieslice()画扇区就要用填充图样与填充色来填充区域。那么怎样设置填充图样和填充色呢?我们只要简单地学习并练习一下就会掌握其方法。下面介绍用于设置填图样与填充色、建立用户自己的填充图样与填充封闭区域的几个常用函数。

76. setfillstyle() 设置填充图样和颜色函数

功能:setfillstyle()设置填充图样和颜色函数

功能: 函数setfillstyle()为各种图形函数设置填充图样和颜色。

用法: 函数调用方式为void setfillstyle(int pattern,int color);

说明: 参数pattern的值为填充图样,它们在头文件graphics.h中定义,详见表1-12所示。

参数color的值是填充色,它必须为当前显示模式所支持的有效值。

填充图样与填充色是独立的,可以是不同的值。

表1-12 填充图样

-------------------------------------------------------------------

填充图样符号名         取值            说明

-------------------------------------------------------------------

EMPTy_FILL               0         用背景色填充区域(空填)

SOLID_FILL               1         用实填充色填充(实填)

LINE_FILL                2         ----填充

LTSLASH_FILL             3         ///填充

SLASH_FILL               4         ///用粗线填充

BKSLASH_FILL             5         \\\用粗线填充

LTBKSLASH_FILL           6         \\\填充

HATCH_FILL               7         网格线填充

xHATCH_FILL              8         斜网格线填充

INTEREAVE_FILL           9         间隔点填充

WIDE_DOT_FILL            10        大间隔点填充

CLOSE_DOT_FILL           11        小间隔点填充

USER_FILL                12        用户定义图样填充

-------------------------------------------------------------------

除了EMPTy_FILL,所有填充图样都使用当前填充色,填充图样USER_FILL只有在用函数setfillpattern()已经建立一个用户定义的填充图样后才能使用。

此函数对应的头文件为graphics.h

返回值: 无

例: 下面的程序用HATCH_FILL填充一个矩形:

#includevoid main()

{

int driver,mode;

driver=DETECT;

mode=0;

initgraph(&driver,mode,"");

setcolor(GREEN);

rectangle(80,200,200,300)

setfillstyle(HATCH_FILL,RED);

floodfill(160,240,GREEN);

getch();

restorecrtmode();

}

77. setfillpattern() 设置用户图样函数

功能: 函数setfillpattern() 设置用户的填充图样以供fllodfill(),fillpoly()填充函数等使用。

用法: 此函数调用方式为void setfillpattern(char *pattern,int color);

说明: 参数color设置填充图样的颜色。参数pattern指向一字符数组,该数组至少8个字节长,它定义了一个8像素*8像素的用户填充图样。例如:

char diamond[8]={0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x00};

diamond为8个字节的数组,每个字节对应于填充图样中的8个像素,字节中的1位,画出一个由color设定颜色的像素,字节中的0位则不画。实际上,diamond数组定义了一个7*7的小钻石图样,右边和底部都留有一个像素的边缘。

调用setfillpattern()设置用户填充图样后,必须调用setfilstyle()函数,使USER_FILL值成为当前填充图样。

这个函数对应的头文件为graphics.h

返回值: 无

例:建立一个用户填充图样,并用它填充一个矩形:

#includevoid main()

{

int driver,mode;

static char p[8]={10,20,30,40,50,60,70,80};

driver=DETECT;

mode=0;

initgraph(&driver,mode,"");

setcolor(GREEN);

rectangle(80,200,220,300);

setfillpattern(p.RED);

floodfill(160,260,GREEN);

getch();

restorecrtmode();

}

78. floodfill() 填充闭域函数

功能: 函数floodfill()用当前填充图样和填充色填充一个由特定边界颜色(通常是当前绘图色)定义的有界封闭区域。

用法: 该函数调用方式为void floodfill(int x,int y,int bordercolor);

说明: 这里参数(x,y)为指定填充区域中的某点,如果点(x,y)在该填充区域之外,那么外部区域将被填充,但受图形视口边界的限制。如果直线定义的区域出现间断,那么将导致泄漏,即使很小的间断,也将导致泄漏。也就是说,间断将引起区域外被填充。

参数bordercolor为闭区域边界颜色,若可能的话,建议尽量用下面函数fillpoly()代替floodfill(),以便和将来的版本保持兼容。

如果出错,graphresult()函数将返回错误代码-7(flood填充内存不足)。

此函数对应的头文件为graphics.h

返回值: 无

例: 用floodfill() 函数填充一个具有交叉阴影线的品红色椭圆:

#includevoid main()

{

int driver,mode;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

ellipse(188,88,0,360,100,60);

setfillstyle(cHATCH_FILL,MAGENTA);

floodfill(188,88,WHITE);

getch();

restorecrtmode();

}

79. fillpoly() 填充多边形函数

功能: 函数fillpoly()用当前绘图色、线型及线宽画出给定点的多边形,然后用当前填充图样和填充色填充这个多边形。

用法: 此函数调用方式为void fillpoly(int pointnum,int *points);

说明: fillpoly()的调用形式与drawpoly()的一样,其参数含义相同。该函数中pointnum为所填充多边形的顶点数,points指向存放所有顶点坐标的整型数组。有时顶点数目是通过过计算sizeof(整型数组)除以两倍的sizeof(int)然后得到的,之所以除以两倍的sizeof(int)是因为每个顶点需要两个整型坐标。

注意,fillpoly()是通过连接起点和终点将图形封闭起来,然后填充被包围的区域。与floodfill()不同的是,fillpoly()所用的填充方法不依靠边界连续的轮廓来确定填充区域。这样间断的线型是允许的,并且可以很简单地填充多边形确定的区域,包括在新的边界范围内任何其它图形上重画。如果出错,graphresult()函数将返回错误代码-6(Scan填充内存不足)。

这个函数对应的头文件为graphics.h

返回值: 无

例:用红色间隔点填充一个正方形:

#includevoid main()

{

int driver,mode;

static int points[]={100,100,100,200,200,200,100,100};

driver=DETECT

mode=0;

initgraph(&driver,mode,"");

setfillstyle(INTERLEAVE_FILL,RED);

fillpoly(4,points);

getch();

restorecrtmode();

}

80. getfillsettings() 获取填充设置函数

功能: 函数getfillsettings()将当前填充图样值(符号名或等价值)和填充颜色值(符号名或等价值)填入fillsettingstyle型结构里,从而从该结构中获得当前填充设置(填充图样和填充色)。

用法: 这个函数调用方式为void getfillsettings(struct fillsettingstype *info);

说明: 函数里fillsettingstype 型结构定义如下:

struct fillsettingstype {

int pattern;

int color;

};

注意,结构中变量pattern只用于存取一个预先定义的填充图样值,而不是填充图样元素,填充图样及等价值在前面表1-12中已经列出。结构变量color用来存储填充颜色值,它是当前显示模式的有效颜色值之一。

getfillsettings()函数相应的头文件是graphics.h

返回值:返回当前填充图样和填充色的值,并装入info指向的结构里。

例: 下面的程序把当前填充图样和填充色的值写入fillinfo结构中:

struct fillsettingstype fillinfo;

getfillsettings(&fillinfo);

81. getfillpattern() 获取用户图样设置函数

功能: 函数getfillpattern()返回上一次调用setfillpattern()设置的用户定义的填充图样。

用法: 此函数调用方式为void getfillpattern(char *pattern);

说明: 函数一旦调用,就会把定义当前用户填充图样的8个字节填入pattern所指向的数组,该数组必须至少8字节长,用户图样以8个8位字节的模式排列,如果还没有调用setfillpattern()设置用户定义的填充图样,那么函数将填入数组元素的值全为0xff。

getfillpattern()函数对应的头文件为graphics.h

返回值: 返回用户定义填充图样的8个字节数据(注意不是填充图样元素),并存放在pattern指向的数组里。

例: 显示组成当前用户填充图样的各字节内容:

#includevoid main()

{

int driver,mode;

char fp[8];

int i;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

getfillpattern(fp);

for(i=0;i<8;i++) printf("%d",fp[i]);

getch();

restorecrtmode();

}

(六)、图像函数

图像复制、擦除以及一般对屏幕图像的操作,这对应用程序是非常有用的,对动画制作是必不可少的。BC提供了以下几个图像操作函数。

82. imagesize() 图像存储大小函数

功能: 函数imagsize()返回存储一块屏幕图像所需的内存大小(即字节数)。

用法: 此函数调用方式为unsigned imagsize(int left,int top,int right,int bottom);

说明: 参数(left,top)为所定义的一块图像屏幕左上角,(right,bottom)为其右下角。

函数调用执行后,返回存储该块屏幕所需要的字节数。如果所需要字节数大于64KB,那么将返回-1。imagesize()函数一般与下面getimage()函数联用。

这个函数对应的头文件为graphics.h

返回值: 返回一块图像屏幕存储所需的字节数,如果大于64KB,则返回-1。

例: 确定左上角(10,10)与右下角(100,100)所定义的屏幕图像所需的字节数:

unsigned size;

size=imagesize(10,10,100,100);

83. getimage() 保存图像函数

功能: 函数getimage()保存左上角与右下角所定义的屏幕上像素图形到指定的内存区域。

用法: 该函数调用方式为void getimage(int left,int top,int right,int bottom,void *buf);

说明: 函数中参数(left,top)为要保存的图像屏幕的左上角,(right,bottom)为其右下角,buf指向保存图像的内存地址。调用getimage()保存屏幕图像,可用imagesize()函数确定保存图像所需字节数,再用malloc()函数分配存储图像的内存(内存分配必须小于64KB),还可以用下面函数putimage()输出getimage()保存的屏幕图像。

这个函数对应的头文件为graphics.h

返回值: 无

例: 把带有两对角线的矩形拷贝到屏幕其它位置上:

#include#include#includevoid main()

{

int driver,mode;

unsigned size;

void *buf;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

sector(15);

rectangle(20,20,200,200);

setcolor(RED);

line(20,20,200,200);

setcolor(GREEN);

line(20,200,200,20);

getch();

size=imagesize(20,20,200,200);

if(size!=-1){

buf=malloc(size);

if(buf){

getimage(20,20,200,200,buf);

putimage(100,100,buf,COPy_PUT);

putimage(300,50,buf,COPy_PUT);

}

}

outtext("press a key");

getch();

restorecrtmode();

}

84. putimage() 输出图像函数

功能: 函数putimage()将一个先前保存在内存中的图像输出到屏幕上。

用法: 此函数调用方式为void putimage(int left,int top,void *buf,int ops);

说明: 参数(left,top)为输出屏幕图像的左上角,即输出图像的起始位置。buf指向要输出的内存中图像。参数ops控制图像以何种方式输出到屏幕上。表1-13给出了图像输出方式。

表1-13  图像输出方式

--------------------------------------------------------------------

输出方式符号名      取值               含     义

--------------------------------------------------------------------

COPy_PUT              0         图像输出到屏幕上,取代原有图像

xOR_PUT               1         图像和原有像素作异或运算

OR_PUT                2         图像和原有像素作或运算

AND_PUT               3         图像和原有像素作与运算

NOT_PUT               4         把求反的位图像输出到屏幕上

--------------------------------------------------------------------

1) COPy_PUT输出方式

图像中每个像素都直接绘制到屏幕上,取代原有图像像素,包括空白的图像像素(背景)。完全空白的图像可以用来擦除其它图像或屏幕的一部分。但通常选择xOR_PUT输出方式擦除原有图像。

2)xOR_PUT输出方式

原有屏幕每个像素与相应的图像字节作“异或”运算,其结果画到屏幕上。当某一图像和屏幕上原有图像作“异或”运算时,屏幕显示的是两个图像的合成。若相同的图像作异或运算,将有效地擦除该图像,留下原始屏幕。这种输出方式,对动画制作是非常有用的。

3)OR_PUT输出方式

每个图像字节和相应的屏幕像素作“或”运算,再将结果画到屏幕上,这种输出方式也叫“两者取一”。记住,像素中的每位和图像中的每位作“或”运算,这样所得结果是背景和图像的彩色合成图像。

4)AND_PUT输出方式

选择AND_PUT图像输出方式时,屏幕像素和图像字节中都显示的位,运算后仍显示,例如,星图像中的空白背景擦除了方块轮廓以及填充色,只有星图像复盖着的方块留下,即运算后,显示两者相同的图像。

5)NOT_PUT输出方式

NOT_PUT输出方式,除了把图像的每位求反---图像中所有黑的像素(0000)变成了白色(1111),其它方面与COPy_PUT相同。背景图像被重画后将消失。

putimage()函数对应的头文件为garphics.h

返回值: 无

例: 下面的程序说明了imagesize(),getimage()和putimage()函数的调用方法:

#include#include#includevoid box(int ,int,int,int,int);

void main()

{

int driver,mode;

unsigned size;

void *buf;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

box(20,20,200,200,15);

setcolor(RED);

line(20,20,200,200);

setcolor(GREEN);

line(20,200,200,20);

getch();

size=imagesize(20,20,200,200);

if(size!=-1)

{

buf=malloc(size);

if(buf){

getimage(20,20,200,200,buf);

putimage(120,120,buf,COPy_PUT);

putimage(280,60,buf,COPy_PUT);

}

}

outtext("Press a key");

getch();

restorecrtmode)(;

}

void box(int startx,int starty,int endx,int endy,int color)

{

setcolor(color);

rectangle(startx,starty,endx,endy);

}

图像函数是对屏幕图像操作进行讨论的,但对屏幕图形同样适用。实际上,屏幕图形也是一种特定的屏幕图像,它可称为外形屏幕图像或称轮廓屏幕图像。因此图像与图形不必区分。

--------------------next---------------------

阅读(255) | 评论(0) | 转发(0) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值