C语言图形编程(三、绘图函数-02) B
发表于:2007-07-01来源:作者:点击数:
标签:
71. ellipse()画椭圆弧函数 功能: 函数ellipse()使用当前绘图色画一椭圆
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
返回值: 无
例: 在屏幕上画一个鸡蛋形的椭圆。
#include<graphics.h>
void 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<graphics.h>
#include<s
tdio.h>
#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度为一个不同的扇区:
#include<graphics.h>
void 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<graphics.h>
#include<stdio.h>
#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. getar
clearcase/" target="_blank" >ccoords()获取圆弧坐标函数
功能: 函数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)的四分之一圆弧,然后于弧两端点之间连一直线。
#include<graphics.h>
void 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填充一个矩形:
#include<graphics.h>
void 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
返回值: 无
例:建立一个用户填充图样,并用它填充一个矩形:
#include<graphics.h>
void 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() 函数填充一个具有交叉阴影线的品红色椭圆:
#include<graphics.h>
void 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
返回值: 无
例:用红色间隔点填充一个正方形:
#include<graphics.h>
void 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指向的数组里。
例: 显示组成当前用户填充图样的各字节内容:
#include<graphics.h>
void 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<garphics.h>
#include<stdlib.h>
#include<conio.h>
void 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<graphics.h>
#include<conio.h>
#include<stdlib.h>
void 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);
}
图像函数是对屏幕图像操作进行讨论的,但对屏幕图形同样适用。实际上,屏幕图形也是一种特定的屏幕图像,它可称为外形屏幕图像或称轮廓屏幕图像。因此图像与图形不必区分。
原文转自:http://www.ltesting.net