论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

C语言图形编程(三、绘图函数-02)

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:36:22

四、图形和图像函数
(一) 像素函数
    56. putpiel() 画像素点函数
    57. getpixel()返回像素色函数
(二) 直线和线型函数
   
58. line() 画线函数
    59. lineto() 画线函数
    60. linerel() 相对画线函数
    61. setlinestyle() 设置线型函数
    62. getlinesettings() 获取线型设置函数
    63. setwritemode() 设置画线模式函数
(三)、多边形函数
    64. rectangle() 画矩形函数
    65. bar() 画条函数
    66. bar3d() 画条块函数
    67. drawpoly() 画多边形函数
(四)、 圆、弧和曲线函数
    68. getaspectratio()获取纵横比函数
    69. circle()画圆函数
    70. arc() 画圆弧函数
    71. ellipse()画椭圆弧函数
    72. fillellipse() 画椭圆区函数
    73. pieslice() 画扇区函数
    74. sector() 画椭圆扇区函数
    75. getarccoords()获取圆弧坐标函数
(五)、 填充函数
    76. setfillstyle() 设置填充图样和颜色函数
   
77. setfillpattern() 设置用户图样函数
    78. floodfill() 填充闭域函数
    79. fillpoly() 填充多边形函数
    80. getfillsettings() 获取填充设置函数
    81. getfillpattern() 获取用户图样设置函数
(六)、图像函数
    82. imagesize() 图像存储大小函数
    83. getimage() 保存图像函数
    84. putimage() 输出图像函数




四、图形和图像函数
   对许多图形应用程序,直线和曲线是非常有用的。但对有些图形只能靠操作单个像素才能画出。当然假如没有画像素的功能,就无法操作直线和曲线的函数。而且通过大规模使用像素功能,整个图形就可以保存、写、擦除和与屏幕上的原有图形进行叠加。
(一) 像素函数

56. putpixel() 画像素点函数
功能: 函数putpixel() 在图形模式下屏幕上画一个像素点。
用法: 函数调用方式为void putpixel(int x,int y,int color);
说明: 参数x,y为像素点的坐标,color是该像素点的颜色,它可以是颜色符号名,也可以是整型色彩值。
       此函数相应的头文件是graphics.h
返回值: 无
例: 在屏幕上(6,8)处画一个红色像素点:
   putpixel(6,8,RED);

57. getpixel()返回像素色函数
功能: 函数getpixel()返回像素点颜色值。
用法: 该函数调用方式为int getpixel(int x,int y);
说明: 参数x,y为像素点坐标。
       函数的返回值可以不反映实际彩色值,这取决于调色板的设置情况(参见setpalette()函数)。
       这个函数相应的头文件为graphics.h
返回值: 返回一个像素点色彩值。
例: 把屏幕上(8,6)点的像素颜色值赋给变量color。
   color=getpixel(8,6);

(二) 直线和线型函数
   有三个画直线的函数,即line(),lineto(),linerel()。这些直线使用整型坐标,并相对于当前图形视口,但不一定受视口限制,假如视口裁剪标志clip为真,那么直线将受到视口边缘截断;假如clip为假,即使终点坐标或新的当前位置在图形视口或屏幕极限之外,直线截断到屏幕极限。
   有两种线宽及几种线型可供选择,也可以自己定义线图样。下面分别介绍直线和线型函数。

58. line() 画线函数
功能: 函数line()使用当前绘图色、线型及线宽,在给定的两点间画一直线。
用法: 该函数调用方式为void line(int startx,int starty,int endx,int endy);
说明: 参数startx,starty为起点坐标,endx,endy为终点坐标,函数调用前后,图外形态下屏幕光标(一般不可见)当前位置不改变。
       此函数相应的头文件为graphics.h
返回值: 无
例: 见函数60.linerel()中的实例。

59. lineto() 画线函数
功能: 函数lineto()使用当前绘图色、线型及线宽,从当前位置画一直线到指定位置。
用法: 此函数调用方式为void lineto(int x,int y);
说明: 参数x,y为指定点的坐标,函数调用后,当前位置改变到指定点(x,y)。
       该函数对应的头文件为graphics.h
返回值: 无
例: 见函数60.linerel()中的实例。

60.linerel() 相对画线函数
功能: 函数linerel() 使用当前绘图色、线型及线宽,从当前位置开始,按指定的水平和垂直偏移距离画一直线。
用法: 这个函数调用方式为void linerel(int dx,int dy);
说明: 参数dx,dy分别是水平偏移距离和垂直偏移距离。
       函数调用后,当前位置变为增加偏移距离后的位置,例如,原来的位置是(8,6),调用函数linerel(10,18)后,当前位置为(18,24)。
返回值:无
例: 下面的程序为画线函数调用实例:
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   setcolor(15);
   line(66,66,88,88);
   lineto(100,100);
   linerel(36,64);
   getch();
   restorecrtmode();
}

61. setlinestyle() 设置线型函数
功能: setlinestyle() 为画线函数设置当前线型,包括线型、线图样和线宽。
用法: setlinestyle() 函数调用方式为void setlinestyle(int stly,unsigned pattern,int width);
说明: 参数style为线型取值,也可以用相应名称表示,如表1-10中所示。
       参数pattern用于自定义线图样,它是16位(bit)字,只有当style=USERBIT_LINE(值为1)时,pattern的值才有意义,使用用户自定义线图样,与图样中“1”位对应的像素显示,因此,pattern=0xFFFF,则画实线;pattern=0x9999,则画每隔两个像素交替显示的虚线,假如要画长虚线,那么pattern的值可为0xFF00和0xF00F,当style不为USERBIT_LINE值时,虽然pattern的值不起作用,但扔须为它提供一个值,一般取为0。
    参数wigth用来设定线宽,其取值见表1-11,表中给出了两个值,即1和3,实际上,线宽取值为2也是可以接受的。
    若用非法参数调用setlinestyle()函数,那么graphresult()会返回错误代码,并且当前线型继续有效。
    Turbo C提供的线型与线宽定义在头文件graphics.h中,表1-10和1-11分别列出了参数的取值与含义。

表1-10  线型
-----------------------------------------------------
   名        称      取 值         含    义
-----------------------------------------------------
   SOLID_LINE          0             实线
   DOTTED_LINE         1             点线
   CNTER_LINE          2             中心线
   DASHED_LINE         3             虚线
   USERBIT_LINE        4             用户自定义线型
-----------------------------------------------------

表1-11 线宽
-----------------------------------------------------------
   名         称            取  值      说   明
-----------------------------------------------------------
   NORM_WIDTH(常宽)           1         一个像素宽(缺省值)
   THICK_WIDTH(加宽)          3         三个像素宽
-----------------------------------------------------------

这个函数的头文件是graphics.h
返回值: 无
例: 下面的程序显示了BC中所提供的线型图样:
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   for(i=0;i<4;i++)
   {
      setlinestyle(i,0,1);
      line(i*50,200,i*50+60,200)
   }
   getch();
   restorecrtmode();
}

62. getlinesettings() 获取线型设置函数
功能: 函数getlinesettings() 用当前设置的线型、线图样和线宽填 写linesettingstype型结构。
用法: 函数调用方式为void getlinesettings(struct linesettingstype *info);
说明: 此函数调用执行后,当前的线型、线图样和线宽值被装入info指向的结构里,从而可从该结构中获得线型设置。
   linesettingstype型结构定义如下:
   struct linesettingstype {
      int linestyle;
      unsigned upattern;
      int thickness;
   };
   其中linestyle用于存放线型,线型值为表1-10中的各值之一。
   upattern用为装入用户自定义线图样,这是16位字,每一位等于一个像素,假如哪个位被设置,那么该像素打开,否则关闭。
   thickness为线宽值存放的变量,可参见表1-11。
   getlinesettings()函数对应的头文件为graphics.h
返回值: 返回的线型设置存放在info指向的结构中。
例: 把当前线型的设置写入info结构:
   struct linesettingstype info;
   getlinesettings(&info);


63.setwritemode() 设置画线模式函数
功能: 函数setwritemode() 设置画线模式
用法: 函数调用方式为 void setwritemode()(int mode);
说明: 参数mode只有两个取值0和1,若mode为0,则新画的线将复盖屏幕上原有的图形,此为缺省画线输出模式。假如mode为1,那么新画的像素点与原有图形的像素点先进行异或(XOR)运算,然后输出到屏幕上,使用这种画线输出模式,第二次画同一图形时,将擦除该图形。调用setwritemode()设置的画线输出模式只影响函数line(),lineto(),linerel(),recangle()和drawpoly()。
       setwritemode()函数对应的头文件是graphics.h
返回值: 无
例: 设置画线输出模式为0:
   setwritemode(0);

(三)、多边形函数
   
对多边形,无疑可用画直线函数来画出它,但直接提供画多边形的函数会给用户很大方便。最常见的多边形有矩形、矩形块(或称条形)、多边形和多边形块,我们还把长方形条块也放到这里一起考虑,虽然它不是多边形,但它的特例就是矩形(块)。下面直接介绍画多边形的函数。

64. rectangle() 画矩形函数
功能: 函数rectangle() 用当前绘图色、线型及线宽,画一个给定左上角与右下角的矩形(正方形或长方形)。
用法: 此函数调用方式为void rectangle(int left,int top,int right,int bottom);
说明: 参数left,top是左上角点坐标,right,bottom是右下角点坐标。假如有一个以上角点不在当前图形视口内,且裁剪标志clip设置的是真(1),那么调用该函数后,只有在图形视口内的矩形部分才被画出。
      这个函数对应的头文件为graphics.h
返回值: 无
例: 下面的程序画一些矩形实例:
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgrpah(&driver,&mode,"");
   rectangle(80,80,220,200);
   rectangle(140,99,180,300);
   rectangle(6,6,88,88);
   rectangle(168,72,260,360);
   getch();
   restorecrtmode();
}

65. bar() 画条函数
功能: 函数bar()用当前填充图样和填充色(注重不是给图色)画出一个指定上左上角与右下角的实心长条形(长方块或正方块),但没有四条边线)。
用法: bar()函数调用方式为void bar(int left,int top,int right,int bottom);
说明: 参数left,topright,bottom分别为左上角坐标与右下角坐标,它们和调用函数rectangle()的情形相同,调用此函数前,可用setfillstyle()或setfillpattern()设置当前填充图样和填充色。
注重此函数只画没有边线的条形,假如要画有边线的的条形,可调用下面的函数bar3d()来画,并将深度参数设为0,同时topflag参数要设置为真,否则该条形无顶边线。
      这 应的头文件为graphics.h
返回值: 无
例: 见函数bar3d()中的实例。
  
66.bar3d() 画条块函数
功能: 函数bar3d() 使用当前绘图色、线型及线宽画出三维长方形条块,并用当前填充图样和填 充色填充该三维条块的表面。
用法: 此函数调用方式为void bar3d(int left,int top,int right,int bottom,int depth,int topflag);
说明: 参数left,top,right,bottom分另为左上角与右下角坐标,这与bar()函数中的一样。参数depth为条块的深度,以像素为单位,通常按宽度的四分之一计算。深度方向通过屏显纵横比调节为约45度(即这时x/y比设置为1:1)。
参数topflag相当于一个布尔参数,假如设置为1(真)那么条块上放一顶面;若设置为0(假),则三维条形就没有顶面,这样可使多个三维条形叠加在一起。
要使图形更加美观,可利用函数floodfill()或setfillpattern()来选择填充图样和填充色(参见本小节(五)填充函数 )。
      bar3d()函数对应的头文件为graphics.h
返回值: 无
例: 下面的程序画一个条形和条块:
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   setfillstyle(SOLID-FILL,GREEN);
   bar(60,80,220,160);
   setfillstyle(SOLID-FILL,RED);
   bar3d(260,180,360,240,20,1);
   getch();
   restorecrtmode();
}

67. drawpoly() 画多边形函数
功能: 函数drawpoly() 用当前绘图色、线型及线宽,画一个给定若干点所定义的多边形。
用法: 此函数调用方式为void drawpoly(int pnumber,int *points);
说明: 参数pnumber为多边形的顶点数;参数points指向整型数组,该数组中是多边形所有顶点(x,y)坐标值,即一系列整数对,x坐标值在前。显然整型数组的维数至少为顶点数的2倍,在定义了多边形所有顶点的数组polypoints时,顶点数目可通过计算sizeof(polypoints)除以2倍的sizeof(int)得到,这里除以2倍的原因是每个顶点有两个整数坐标值。另外有一点要注重,画一个n个顶点的闭合图形,顶点数必须等于n+1,并且最后一点(第n+1)点坐标必须等于第一点的坐标。
   drawpoly()函数对应的头文件为grpahics.h
返回值: 无
例: 下面的程序画一个封闭星形图与一个不封闭星形图:
#include<graphics.h>
void main()
{
   int driver,mode;
   static int polypoints1[18]={100,100,110,120,100,130,120,125,140,140,130,120,
   140,110,120,115,100,100};
   static int polyp oints2[18]={180,100,210,120,200,130,220,125,240,140,230,120,
   240,110,220,115,220,110};
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   drawpoly(9,polypoints1);
   drawpoly(9,polypoints2);
   getch();
   restorecrtmode();
}

(四)、 圆、弧和曲线函数
   在一个屏幕上画得很圆的图形到另一个屏幕上可能被压扁或拉长,这是因为每一种显示卡与之相应的显示模式都有一个纵横比。纵横比是指像素的水平方向大小与垂直方向大小的比值。如VGA显示卡由于偈素基本上是正方形,所以纵横比为1.000。
   为了保证几何图形基本按预计情况显示在屏幕上,用屏显的纵横比来计算和纠正不同硬件及显示卡产生的畸变。计算纵横比所需要的水平方向和垂直方向的比例系数可调用函数getaspectratio()获得。

68. getaspectratio()获取纵横比函数
功能: 函数getaspectratio()返回x方向和y方向的比例系数,用这两个整型值可计算某一特定屏显的纵横比。
用法: 此函数调用方式为void getaspectratio(int xasp,int yasp);
说明: 参数xasp指向的变量存放返回的x方向比例系数;参数yasp指向的变量存放返回的y方向比例系数。通常y方向比例系数为10 000, x方向比例系数不大于10 000(这是因为大多数屏幕像素高比宽长)。
   注重纵横比自动用作下面函数arc(),circle()和pieslice()中的标尺因子,使屏幕上圆或弧正常显示。但用ellipse()函数画椭圆必须调用本函数获取纵横比作为标尺因子,否则不予调整。纵横比可用于其它几何图形,目的是校正和显示图形。
   getaspectratio()函数对应的头文件为graphics.h
返回值: 返回x与y方向比例系数分别存放在xasp和yasp所指向的变量中。
例: 下面的程序显示纵横比:
   int xasp,yasp;
   float aspectratio;
   getaspectratio(&xasp,&yasp);
   aspectratio=xasp/yasp;
   printf("aspect ratio: %f",aspectratio);

69. circle()画圆函数
功能: 函数circle()使用当前绘图色并以实线画一个完整的圆。
用法:该函数调用方式为void circle(int x,int y,int radius);
说明: 参数x,y为圆心坐标,radius为圆半径,用像素个素表示。注重,调用circle()函数画圆时不用当前线型。
   不同于ellipse()函数,只用单个半径radius参数调用circle()函数,故屏显纵横比可以自动调节,以产生正确的显示图。
   此函数对应的头文件为graphics.h
返回值: 无
例: 画六个同心圆,圆心在(100,100)。
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   circle(100,100,10);
   circle(100,100,20);
   circle(100,100,30);
   circle(100,100,40);
   circle(100,100,50);
   circle(100,100,60);
   getch();
   restorecrtmode();
}

70. arc() 画圆弧函数
功能: 函数arc()使用当前绘图色并以实线画一圆弧。
用法: 函数调用方式为void arc(int x,int y,int startangle,int endangle,int radius);
说明: 参数x,y为圆心坐标,startangle与endangle分别为起始角与终止角,radius为半径。圆心坐标和半径以像素个数给出,起始角和终止角以度为单位,0度位于右边,90度位于顶部,180度位于左边,底部是270度。同往常一样,360度与0度重合。角度按逆时针方向增加,但并不要求终止角一定比起始角大。例如指定300度和90度分别为起始角和终止角,与指定300度和450度分别为起始角和终止角可画出相同的弧。大于360度可作为参数,它将被化到0度 ̄360度范围里。函数arc()能画封闭圆,只要取起始角为0度,终止角为360度即可。此函数中,屏显纵横比可自动调节。
   arc()函数对应的头文件为graphics.h
返回值: 无
例: 以(200,200)为圆心,100为半径,从0度到120度画圆弧:
#include<graphics.h
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&drivwer,&mode,"");
   setcolor(WHITE);
   arc(200,200,0,120,100);
   getch();
   restorecrtmode();
}

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. 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)的四分之一圆弧,然后于弧两端点之间连一直线。
#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);
   set fillpattern(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>
#includ e<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);
}
图像函数是对屏幕图像操作进行讨论的,但对屏幕图形同样适用。实际上,屏幕图形也是一种特定的屏幕图像,它可称为外形屏幕图像或称轮廓屏幕图像。因此图像与图形不必区分。


      

视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058