图形函数(上)_小姚_新浪博客
图形函数
   Turbo C提供了非常丰富的图形函数, 所有图形函数的原型均在graphics. h
中, 本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图
形窗口以及图形模式下的文本输出等函数。另外, 使用图形函数时要确保有显示
器图形驱动程序*BGI, 同时将集成开发环境Options/Linker中的Graphics lib选
为on, 只有这样才能保证正确使用图形函数。
    1. 图形模式的初始化
    不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器, 在不同
模式下也有不同分辨率。因此, 在屏幕作图之前, 必须根据显示器适配器种类将
显示器设置成为某种图形模式, 在未设置图形模式之前, 微机系统默认屏幕为文
本模式(80列, 25行字符模式), 此时所有图形函数均不能工作。设置屏幕为图形
模式, 可用下列图形初始化函数:
     void far initgraph(int far *gdriver, int far *gmode, char *path);
    其中gdriver和gmode分别表示图形驱动器和模式, path是指图形驱动程序所
在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见表2。
    图形驱动程序由Turbo C出版商提供, 文件扩展名为.BGI。根据不同的图形
适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序
EGAVGA.BGI。

 例4. 使用图形初始化函数设置VGA高分辨率图形模式
#include <graphics.h>
int main()
{
 int gdriver, gmode;
 gdriver=VGA;
 gmode=VGAHI;
 initgraph(&gdriver, &gmode, "c:\\tc");
 bar3d(100, 100, 300, 250, 50, 1);      
 getch();
 closegraph();
 return 0;
}

有时编程者并不知道所用的图形显示器适配器种类, 或者需要将编写的程序
用于不同图形驱动器, Turbo C提供了一个自动检测显示器硬件的函数,  其调用
格式为:
  void far detectgraph(int *gdriver, *gmode);
 其中gdriver和gmode的意义与上面相同。

例5. 自动进行硬件测试后进行图形初始化
 #include <graphics.h>
 int main()
 {
    int gdriver, gmode;
    detectgraph(&gdriver, &gmode);    
    printf("the graphics driver is %d, mode is %d\n", gdriver,
       gmode);      
    getch();
    initgraph(&gdriver, &gmode, "c:\\tc");
 
    bar3d(10, 10, 130, 250, 20, 1);
    getch();
    closegraph();
    return 0;
}

   上例程序中先对图形显示器自动检测, 然后再用图形初始化函数进行初始化
设置, 但Turbo C提供了一种更简单的方法,  即用gdriver= DETECT 语句后再跟
initgraph()函数就行了。采用这种方法后, 上例可改为:
 
例6.
#include <graphics.h>
int main()
{
    int gdriver=DETECT, gmode;
    initgraph(&gdriver, &gmode, "c:\\tc");
    bar3d(50, 50, 150, 30, 1);
    getch();
    closegraph();
    return 0;
}
另外, Turbo C提供了退出图形状态的函数closegraph(), 其调用格式为:
void far closegraph(void);
调用该函数后可退出图形状态而进入文本方式(Turbo C 默认方式), 并释放
用于保存图形驱动程序和字体的系统内存。

2. 独立图形运行程序的建立
    Turbo C对于用initgraph()函数直接进行的图形初始化程序, 在编译和链接
时并没有将相应的驱动程序(*.BGI)装入到执行程序, 当程序进行到intitgraph()
语句时, 再从该函数中第三个形式参数char *path中所规定的路径中去找相应的
驱动程序。若没有驱动程序, 则在C:\TC中去找, 如C:\TC中仍没有或TC不存在,
将会出现错误:
     BGI Error: Graphics not initialized (use 'initgraph')
    因此, 为了使用方便, 应该建立一个不需要驱动程序就能独立运行的可执行
图形程序,Turbo C中规定用下述步骤(这里以EGA、VGA显示器为例):
    1. 在C:\TC子目录下输入命令:BGIOBJ EGAVGA
    此命令将驱动程序EGAVGA.BGI转换成EGAVGA.OBJ的目标文件。
    2. 在C:\TC子目录下输入命令:TLIB LIB\GRAPHICS.LIB+EGAVGA
    此命令的意思是将EGAVGA.OBJ的目标模块装到GRAPHICS.LIB库文件中。
    3. 在程序中initgraph()函数调用之前加上一句:
       registerbgidriver(EGAVGA_driver):
该函数告诉连接程序在连接时把EGAVGA的驱动程序装入到用户的执行程序中。
    经过上面处理,编译链接后的执行程序可在任何目录或其它兼容机上运行。
假设已作了前两个步骤,若再向例6中加 registerbgidriver()函数则变成:
    例7:
     #include<stdio.h>
     #include<graphics.h>
     int main()
     {
         int gdriver=DETECT,gmode;
         registerbgidriver(EGAVGA_driver):  / *建立独立图形运行程序 */
         initgraph( gdriver, gmode,"c:\\tc");
         bar3d(50,50,250,150,20,1);
         getch();
         closegraph();
         return 0;
     }
    上例编译链接后产生的执行程序可独立运行。
    如不初始化成EGA或CGA分辨率, 而想初始化为CGA分辨率,  则只需要将上述
步骤中有EGAVGA的地方用CGA代替即可。

    3.屏幕颜色的设置和清屏函数
    对于图形模式的屏幕颜色设置, 同样分为背景色的设置和前景色的设置。在
Turbo C中分别用下面两个函数。
    设置背景色:        void far setbkcolor( int color);
    设置作图色:        void far setcolor(int color);
    其中color 为图形方式下颜色的规定数值, 对EGA, VGA显示器适配器, 有关
颜色的符号常数及数值见下表所示。
   表3 有关屏幕颜色的符号常数表
━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义 符号常数   数值 含义
───────────────────
BLACK      黑色 DARKGRAY     深灰
BLUE       兰色 LIGHTBLUE    深兰
GREEN      绿色 LIGHTGREEN   10 淡绿
CYAN       青色 LIGHTCYAN    11 淡青
RED        红色 LIGHTRED     12 淡红
MAGENTA    洋红 LIGHTMAGENTA 13 淡洋红
BROWN      棕色 YELLOW       14 黄色
LIGHTGRAY 7   淡灰 WHITE        15 白色
━━━━━━━━━━━━━━━━━━━━
    对于CGA适配器, 背景色可以为表3中16种颜色的一种, 但前景色依赖于不同
的调色板。共有四种调色板, 每种调色板上有四种颜色可供选择。不同调色板所
对应的原色见表4。
    表4 CGA调色板与颜色值表
━━━━━━━━━━━━━━━━
   调色板          颜色值
──────   ─────────
符号常数 数值         3
━━━━━━━ ━━━━━━━━━━
  C0       背景  绿   红   
  C1       背景  青  洋红  
  C2       背景 淡绿 淡红  
  C3       背景 淡青 淡洋红 白
━━━━━━━━━━━━━━━━━

xx图形屏幕内容使用清屏函数, 其调用格式如下:
 voide far cleardevice(void);
有关颜色设置、清屏函数的使用请看例8。
例8:
 #include<stdio.h>
 #include<graphics.h>
 int main()
 {
    int gdriver, gmode, i;
    gdriver=DETECT;
    registerbgidriver(EGAVGA_DRIVER);
    initgraph(&gdriver, &gmode", "");
    setbkcolor(0);                  
    cleardevice();
    for(i=0; i<=15; i++)
    {
      setcolor(i);                  
      circle(320, 240, 20+i*10);    
      delay(100);                   
    }
    for(i=0; i<=15; i++)
    {
       setbkcolor(i);               
       cleardevice();
       circle(320, 240, 20+i*10);
       delay(100);
    }
    closegraph();
    return 0;
}

另外, TURBO C也提供了几个获得现行颜色设置情况的函数。
int far getbkcolor(void);      返回现行背景颜色值。
int far getcolor(void);        返回现行作图颜色值。
int far getmaxcolor(void);     返回{zg}可用的颜色值。
 4. 基本图形函数
基本图形函数包括画点, 线以及其它一些基本图形的函数。本节对这些函数
作一全面的介绍。

 一、画点
 1. 画点函数
  void far putpixel(int x, int y, int color);
 该函数表示有指定的象元画一个按color所确定颜色的点。对于颜色color的
值可从表3中获得而对x, y是指图形象元的坐标。
  在图形模式下, 是按象元来定义坐标的。对VGA适配器,  它的{zg}分辨率为
640x480, 其中640为整个屏幕从左到右所有象元的个数, 480 为整个屏幕从上到
下所有象元的个数。屏幕的左上角坐标为(0, 0), 右下角坐标为(639, 479), 水
平方向从左到右为x轴正向, 垂直方向从上到下为y轴正向。TURBO C 的图形函数
都是相对于图形屏幕坐标, 即象元来说的。
 关于点的另外一个函数是:
  int far getpixel(int x, int y);
 它获得当前点(x, y)的颜色值。
  2. 有关坐标位置的函数
   int far getmaxx(void);
  返回x轴的{zd0}值。

  int far getmaxy(void);
 返回y轴的{zd0}值。

  int far getx(void);
  返回游标在x轴的位置。

  void far gety(void);
 返回游标有y轴的位置。

 void far moveto(int x, int y);
 移动游标到(x, y)点, 不是画点, 在移动过程中亦画点。

 void far moverel(int dx, int dy);
 移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置, 移动过程中不画点。
 
二、画线
 1. 画线函数
 TURBO C提供了一系列画线函数, 下面分别叙述:

 void far line(int x0, int y0, int x1, int y1);
 画一条从点(x0, y0)到(x1, y1)的直线。

 void far lineto(int x, int y);
 画一作从现行游标到点(x, y)的直线。

 void far linerel(int dx, int dy);
 画一条从现行游标(x, y)到按相对增量确定的点(x+dx, y+dy)的直线。

 void far circle(int x, int y, int radius);
 以(x, y)为圆心, radius为半径, 画一个圆。

 void far arc(int x, int y, int stangle, int endangle, int radius);
 以(x, y)为圆心, radius为半径, 从stangle开始到endangle结束(用度表示)
画一段圆弧线。在TURBO C中规定x轴正向为0度, 逆时针方向旋转一周,  依次为
90, 180, 270和360度(其它有关函数也按此规定, 不再重述)。

 void ellipse(int x, int y, int stangle, int endangle, int xradius,
int yradius);
 以(x, y)为中心, xradius, yradius为x轴和y轴半径, 从角stangle 开始到
endangle结束画一段椭圆线, 当stangle=0, endangle=360时,  画出一个完整的
椭圆。

 void far rectangle(int x1, int y1, int x2, inty2);
 以(x1, y1)为左上角, (x2, y2)为右下角画一个矩形框。

 void far drawpoly(int numpoints, int far *polypoints);
 画一个顶点数为numpoints,   各顶点坐标由polypoints 给出的多边形。
polypoints整型数组必须至少有2倍顶点数个无素。每一个顶点的坐标都定义为x,
y, 并且x在前。值得注意的是当画一个封闭的多边形时, numpoints 的值取实际
多边形的顶点数加一, 并且数组polypoints中{dy}个和{zh1}一个点的坐标相同。
    下面举一个用drawpoly()函数画箭头的例子。
例9:
 #include<stdlib.h>
 #include<graphics.h>
 int main()
 {
    int gdriver, gmode, i;
    int arw[16]={200, 102, 300, 102, 300, 107, 330,
                 100, 300, 93, 300, 98, 200, 98, 200, 102};
    gdriver=DETECT;
    registerbgidriver(EGAVGA_driver);
    initgraph(&gdriver, &gmode, "");
    setbkcolor(BLUE);
    cleardevice();
    setcolor(12);      
    drawpoly(8, arw);  
    getch();
    closegraph();
    return 0;
 }

    2. 设定线型函数
    在没有对线的特性进行设定之前, TURBO C用其默认值, 即一点宽的实线,
但TURBO C也提供了可以改变线型的函数。线型包括:宽度和形状。其中宽度只有
两种选择: 一点宽和三点宽。而线的形状则有五种。下面介绍有关线型的设置函
数。

     void far setlinestyle(int  linestyle,   unsigned  upattern,   int
thickness);
    该函数用来设置线的有关信息, 其中linestyle是线形状的规定, 见表5。
 表5. 有关线的形状(linestyle)
━━━━━━━━━━━━━━
符号常数    数值  含义
──────────────
SOLID_LINE     实线
DOTTED_LINE    点线
CENTER_LINE    中心线
DASHED_LINE    点画线
USERBIT_LINE 4    用户定义线
━━━━━━━━━━━━━━
 thickness是线的宽度, 见表6。

 表6. 有关线宽(thickness)
━━━━━━━━━━━━━━
符号常数    数值   含义
──────────────
NORM_WIDTH     一点宽
THIC_WIDTH     三点宽
━━━━━━━━━━━━━━
    对于upattern, 只有linestyle选USERBIT_LINE 时才有意义( 选其它线型,
uppattern取0即可)。此进uppattern的16位二进制数的每一位代表一个象元, 如
果那位为1, 则该象元打开, 否则该象元关闭。

 void far getlinesettings(struct linesettingstype far *lineinfo);
    该函数将有关线的信息存放到由lineinfo 指向的结构中,     表中
linesettingstype的结构如下:
    struct linesettingstype{
        int linestyle;
        unsigned upattern;
        int thickness;
     }
 例如下面两句程序可以读出当前线的特性
 struct linesettingstype *info;
 getlinesettings(info);
 
  void far setwritemode(int mode);
    该函数规定画线的方式。如果mode=0, 则表示画线时将所画位置的原来信息
覆盖了(这是TURBO C的默认方式)。如果mode=1,  则表示画线时用现在特性的线
与所画之处原有的线进行异或(XOR)操作,  实际上画出的线是原有线与现在规定
的线进行异或后的结果。因此, 当线的特性不变, 进行两次画线操作相当于没有
画线。
    有关线型设定和画线函数的例子如下所示。
 例10.
 #include<stdlib.h>
 #include<graphics.h>
 int main()
 {
  int gdriver, gmode, i;
    gdriver=DETECT;
    registerbgidriver(EGAVGA_driver);
    initgraph(&gdriver, &gmode, "");
    setbkcolor(BLUE);
    cleardevice();
    setcolor(GREEN);
   circle(320, 240, 98);
    setlinestyle(0, 0, 3);  
    setcolor(2);
    rectangle(220, 140, 420, 340);
    setcolor(WHITE);
    setlinestyle(4, 0xaaaa, 1);  
    line(220, 240, 420, 240);
    line(320, 140, 320, 340);
    getch();
    closegraph();
    return 0;
  }

 5. 封闭图形的填充
填充就是用规定的颜色和图模填满一个封闭图形。

一、先画轮廓再填充
    TURBO C提供了一些先画出基本图形轮廓,  再按规定图模和颜色填充整个封
闭图形的函数。在没有改变填充方式时, TURBO C以默认方式填充。 下面介绍这
些函数。

  void far bar(int x1, int y1, int x2, int y2);
    确定一个以(x1, y1)为左上角, (x2, y2)为右下角的矩形窗口, 再按规定图
模和颜色填充。
    说明: 此函数不画出边框, 所以填充色为边框。

    void far bar3d(int x1, int y1, int x2, int y2,   int  depth,   int
topflag);
    当topflag为非0时, 画出一个三维的长方体。当topflag为0时, 三维图形不
封顶, 实际上很少这样使用。
    说明: bar3d()函数中, 长方体第三维的方向不随任何参数而变,  即始终为
45度的方向。

     void far pieslice(int x, int y, int stangle, int  endangle,   int
radius);
    画一个以(x, y)为圆心, radius为半径, stangle为起始角度, endangle 为
终止角度的扇形, 再按规定方式填充。当stangle=0, endangle=360 时变成一个
实心圆, 并在圆内从圆点沿X轴正向画一条半径。
 
     void far sector(int x, int y,   int  stanle,   intendangle,   int
xradius, int yradius);
    画一个以(x, y)为圆心分别以xradius, yradius为x轴和y轴半径,  stangle
为起始角, endangle为终止角的椭圆扇形, 再按规定方式填充。

   

郑重声明:资讯 【图形函数(上)_小姚_新浪博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——