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<stdio.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. getarclearcase/" 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