[轉]C語言圖形編程(三) -繪圖函數①

 

一、屏幕和視口設置與清除函數
    36. setviewport() 設置圖形視口函數
    37. clearviewport()清除圖形視口函數
    38. cleardevice() 清除屏幕函數
    39. getviewsettings() 獲取圖形視口設置函數
二、調色板和顏色函數
    40. setpalette()設置調色板函數
    41. setallpalette()設置整個調色板函
    42. setbackcolor() 設置背景顏色函數
    43. setcolor() 設置顏色函數
    44. getbkcolor() 返回背景色函數
    45. getcolor() 返回當前繪圖顏色
    46. getmaxcolor()返回最大顏色值函數
    47. getpalette() 獲取調色板函數
    48. getpalettesize() 返回調色板大小函數
    49. getdefaultpalette() 獲取缺省調色板函數
三、屏幕位置函數
    50. getmaxx()返回最大x座標函數
    51. getmaxy() 返回最大y座標函數
    52. getx() 返回x座標函數
    53. gety() 返回y座標函數
    54. moveto()函數
    55. moverel() 相對移動函數
----------------------------------------------------



   Borland C++提供了一整套綜合性的圖形函數,上節介紹了其中有關圖形顯示的函數,本節介紹其中的繪圖函數,下節將介紹它的圖形文本函數。
   一般繪圖時,首先要清除屏幕,設置圖形視口,設置繪圖顏色,然後在屏幕上某個位置畫點或直線或曲線等。下面給出具有這些功能的函數。

一、屏幕和視口設置與清除函數

36. setviewport() 設置圖形視口函數
功能: 函數setviewport() 設置當前圖形視口。
用法: 函數調用方式爲void setviewport(int left,int top,int right,int bottom,int clip);
說明: 參數left,top是左上角座標,right,bottom是右下角座標,它們都是絕對屏幕座標。
      傳給setviewport()的第五個參數是clip,如果clip爲1,則超出視口的輸出圖形自動被裁剪掉,即所有作圖限制於當前圖形視口之內,如果clip爲0,則不做裁剪,即作圖將無限制地擴展於視口周界之外,直到屏幕邊界。若無效參數傳入setviewport(),則graphresult()函數返回值-11,先前視口設置仍有效。
      setviewport()函數的對應頭文件爲 graphics.h
返回值: 無
例: 建立對角爲(6,6)和(88,88)的視口,並帶有裁剪功能:
   setviewport(6,6,88,88,1);

37. clearviewport()清除圖形視口函數
功能: 函數clearviewport()清除當前圖形視口,並把光標從當前位置移到原點(0,0)。
用法: 該函數調用方式爲void clearviewport(void);
說明: 此函數調用執行後,當前圖形視口將不復存在。
      這個函數對應的頭文件是graphics.h
返回值: 無
例: 清除當前圖形視口,但並非整個屏幕:
   clearviewport();

38. cleardevice() 清除屏幕函數
功能: 函數cleardevice() 清除整個屏幕,並且將當前位置移到屏幕原點。
用法: 此函數調用方式爲void cleardevice(void);
說明: 該函數類似於文本模式下的函數clrscr(),但clrscr()函數不能在圖形方式下工作;同樣cleardevice()函數不能在文本模式下工作。
      這個函數相應的頭文件爲graphics.h
返回值: 無
例: 清除當前整個屏幕:
   cleardevice();

39. getviewsettings() 獲取圖形視口設置函數
功能: 函數getviewsettings()返回當前圖形視口座標和裁剪標誌,座標是絕對屏幕座標,裁剪標誌 1或 0。
用法: 此函數調用方式爲void getviewsettings(struct viewporttype *info);
說明: 該函數執行後,把有關當前視口的信息裝入info指向的viewporttype型結構中。
      viewporttype結構定義如下:
      struct viewporttype {
         int left,top,right,bottom;
         int clipflag;
      }
   這裏left,top中存放視口左上角座標,right,bottom中存放視口右下角座標,clipflag中存放裁剪標誌,若clipflag爲1 ,執行裁剪以防止超出視口邊界,如果clipflag爲0,則不對超出邊界輸出作裁剪。
      getviewsettings()函數對應的頭文件是graphics.h
返回值: 無
例: 顯示當前視口角點座標:
   struct viewporttype info;
   getviewsettings(&info);
   printf("left:%d top:%d/n",info.left,info.top);
   printf("right:%d bottom:%d/n",info.right,info.bottom);


二、調色板和顏色函數
進行圖形顯示或繪圖,除了要知道用什麼顯示卡以及相應的圖形驅動程序外,還必須瞭解它們支持什麼樣的調色板顏色。

40. setpalette()設置調色板函數
功能: 函數setpalette()可對調色板上的顏色的色彩值重新設定。
用法: setpalette()函數調用方式爲void setpalette(int value,int color);
說明: 參數value爲色彩值,color爲色彩值相應的顏色名。當需要將一顏色指定爲一色彩值地,即可調用此函數來設置。

表1-7  預先定義的調色板與色彩
-----------------------------------------------------------------
調色板         色彩0         色彩1         色彩2         色彩3
-----------------------------------------------------------------
  C0            黑色         淡綠           紅淺          黃色
  C1            黑色         淡青           粉紅          白色
  C2            黑色         綠色           紅色          棕色
  C3            黑色         青色          品粉紅        淡灰色
-----------------------------------------------------------------
這個函數相對應的頭文件爲graphics.h
返回值: 無

41. setallpalette()設置整個調色板函
功能: 函數setallpalette()對某個調色板上的所有顏色重新設定彩色值。
用法: 函數調用方式爲void setallpalette(struct palettetype *p);
說明: 在低分辨率圖形顯示模式下,該函數無效。若函數調用成功,則把p指向的palettetype結構中的色彩值設置爲當前調色板所有顏色的新色彩值。
   palettetype結構定義如下:
   struct palettetype {
      unsigned char size;
      signed char color[16];
   };
這裏必須把size設置爲調色板顏色的數目,並把每個色彩值都裝入color數組相應元素中,然後纔可用於調用函數。
      此函數對應的頭文件是graphics.h
返回值: 無
例:把16色的EGA/VGA顯示卡調色板改爲其前16種顏色:
   struct palettetype;
   int i;
   for(i=0;i<16;i++) p.color[i]=i;
   p.size=16;
   setallpalette(&p);

42. setbackcolor() 設置背景顏色函數
功能: 函數setbackcolor()把當前調色板顏色的第一個值改成指定的顏色值,以設置背景顏色。
用法: 此函數調用方式爲void setbackcolor(int color);
說明: 參數color爲指定的背景色,其有效值可以是顏色符號名,也可以是色彩值。表1-8列出了背景顏色供選取。

表1-8 背景顏色值
-----------------------------------------------------------------
   顏色符號名         色彩值      顏色符號名         色彩值
-----------------------------------------------------------------
   BLACK(黑色)          0         DARKGRAY(深灰)        8
   BLUE(藍色)           1         LIGHTBLUE(淡藍)       9
   GREEN(綠色)          2         LIGHTGREEN(淡綠)      10
   CYAN(青色)           3         LIGHTCYAN(淡青)       11
   RED(紅色)            4         LIGHTRED(淡紅)        12
   MAGENTA(品紅)        5         LIGHTMAGENTA(粉紅)    13
   BROWN(棕色)          6         YELLOW(黃色)          14
   LIGHTGRAY(淡灰)      7         WHITE(白色)           15
-----------------------------------------------------------------
      調用該函數,將改變整個屏幕的顏色,如果新的背景色與原來屏幕的圖形顏色相同,儘管圖形信息不會丟失,但是看不見圖形了。如果所選背景色爲對比鮮明的顏色,看不見的圖形就會重新清晰地顯現出來。
      這個函數的頭文件爲graphics.h
返回值: 無
例: 把背景色置爲淡藍色
   setbackcolor(LIGHTBLUE);

43. setcolor() 設置顏色函數
功能: 函數setcolor()設置當前繪圖顏色(或稱做前景色)。
用法: 該函數調用方式爲voids setcolor(int color);
說明: 參數color爲選擇的當前繪圖顏色。在高分辨率顯示模式下,選取的color是實際色彩值,也可以用顏色符號名錶示。如果已經搖籃函數setpalette()改變了調色板色彩值,那麼符號名就不可能產生預期作用了。
   在低分辨率顯示模式(320X200)下,選取的color是調色板顏色號,不是實際色彩值。
      此函數相應的頭文件爲graphics.h
返回值: 無
例: 設置16種不同的顏色,顯示16段直線:
#include<graphics.h>
void main()
{
   int driver,mode;
   int i;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   moveto(0,200);
   for(i=0;i<16;i++)
   {
      setcolor(i);
      linerel(20,0);
   }
   getch();
   restorecrtmode();
}

44. getbkcolor() 返回背景色函數
功能: 函數getbackcolor()返回當前背景顏色。
用法: 函數調用方式爲int getbackcolor(void);
說明: 調用該函數後,獲得背景色,但其值不一定是調色板上的色彩值。
       這個函數對應的頭文件是graphics.h
返回值: 返回當前繪圖色彩值。
例: 返回當前背景色彩值:
   printf("background color is %d", getbkcolor());

45. getcolor() 返回當前繪圖顏色
用法: 此函數調用方式爲int getcolor(void);
說明: 對於使用彩色低分辨率顯示模式調色板,返回值是調色板顏色號,而不是實際顏色值,對於高分辨率顯示模式,返回值對應於顏色值,除非調色板顏色已被函數setpalette()或setallpalette()改變了。
      這個函數相應的頭文件爲graphics.h
返回值: 返回當前繪圖顏色值。
例: printf("drawing color is %d",getcolor());

46. getmaxcolor()返回最大顏色值函數
用法: 函數調用方式爲int getmaxcolor(void);
說明: 該函數調用後,在低分辨率模式下返回值爲3(這種模式下有效顏色值爲0至3);在高分辨率顯示模式下返回值可以是256或更高(此模式下有效顏色值爲0至256或更高)。
      這個函數相應的頭文件爲graphics.h
返回值: 返回當前圖形模式下最大顏色值。
例: 顯示最大有效顏色值:
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   printf(";largest color: %d",getmaxcolor());
   getch();
   restorecrtmode();
}

47. getpalette() 獲取調色板函數
功能: 函數getpalette()將當前調色板的值填 入palettetype型結構中。
用法: getpalette()函數調用方式爲void getpalette(struct palettetype *p);
說明: 此函數調用執行後,當前調色板的值被裝入p指向的結構裏;從而可從該結構中獲得這個調色板的設置信息。
   palettetype型結構定義如下
   #define MAXCOLORS 15
   struct palettetype {
      unsigned char size;
      signed char colors[MAXCOLORS+1];
   };
   其中size用於存放當前調色板的有效顏色個數;colors數組的每一元素中裝入調色板的一個相應顏色值。
   表1-9 列出了這些顏色值(適用於EGA/VGA)
---------------------------------------------------
   顏色符號名                  色彩值
---------------------------------------------------
   EGA_BLACK(EGA黑色)            0
   EGA_BLUE(EGA藍色)             1
   EGA_GREEN(綠色)               2
   EGA_CYAN(EGA青色)             3
   EGA_RED(紅色)                 4
   EGA_MAGENTA(EGA品紅)          5
   EGA_BROWN(EGA棕色)            20
   EGA_LIGHTGRAY(EGA淡灰)        7
   EGA_DARKGRAY(EGA深灰)         56
   EGA_LIGHTBLUE(EGA淡藍)        57
   EGA_LIGHTGREEN(EGA淡綠)       58
   EGA_LIGHTCYAN(EGA淡青)        59
   EGA_LIGHTRED(EGA淡紅)         60
   EGA_LIGHTMAGENTA(EGA粉紅)     61
   EGA_YELLOW(EGA黃色)           62
   EGA_WHITE(EGA白色)            63

---------------------------------------------------
      getpalette()函數對應的頭文件是graphics.h

返回值: 無
例: 顯示由自動檢測所得顯示模式支持的調色板上的顏色數目:
#include<graphics.h>
void main()
{
   int driver,mode;
   struct palettetype p;
   driver=DETECT;      // 自動檢測
   mode=0;
   initgraph(&driver,&mode,"");
   getpalette(7p);
   printf("number of colors palette: %d", p.size);
   getch();
   restorecrtmode();
}

48. getpalettesize() 返回調色板大小函數
功能: 函數getalettesize()返回調色板的顏色數目。
用法: 該函數調用方式爲int getpalettesize((void);
說明: 調用這個函數後,就知道調色板上有多少顏色數目可在當前顯示模式下設置。
      此函數對應的頭文件是graphics.h
返回值: 返回當前顯示模式支持的調色板的顏色數目。
例: 顯示當前顯示模式支持的調色板的顏色數目。
   int number;
   number=getpalettesize();
   printf("palette size: %d",number);

49. getdefaultpalette() 獲取缺省調色板函數
功能: 函數getdefaultpalette() 返回指向缺省調色板的指針。
用法: 該函數調用方式爲struct palettetype *getdefaultpalette(void);
說明: 調色板結構類型palettetype定義如下:
   #define MAXCOLORS 15
   struct palettetype {
      unsigned char size;
      signed char colors[MAXCOLORS+1];
   };
   在調用initgraph()初始化圖形系統時,給調色板結構類型變量賦值,作爲缺省調色板,調用這個函數可返回指向它的指針。
      此函數相應的頭部文件爲graphics.h
返回值: 返回指向缺省調色板(結構)的指針。
例: 顯示圖形系統初始化後所支持的調色板上的各種顏色。
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void main()
{
   int graphdriver=DETECT,graphmode;
   struct palettetype *palette;
   int errorcode,color;
   initgraph(&graphdriver,&graphmode,"");
   errorcode=graphresult();
   if(errorcode!=grOK){
      printf("Graphics error %s/n",grapherrormsg(errorcode));
      exit(1);
   }
   palette=getdefaultpalette();
   printf("palette->size %d/n",palette->size);
   getch();
   for(color=0;color<palette->size;color++)
   {
      setfillstyle(LINE_FILL,color);
      bar(20*(color-1),0,20*color,20);
      getch();
   }
   if(palette->size>1){
      do
         setpalette(random(palette->size),random(palette->size));
      while(!kbhit());
      getch();
   }
   setallpalette(palette);
   closegraph();
}


三、屏幕位置函數
   在圖形模式下,字符屏幕座標被像素座標取代了,這種像素座標根據不同的顯示硬件,水平與垂直方向的分辨率可以從320X200變化到1280X1024等。由於分辨率的變化,以致要加載合適的圖菜驅動程序,因此大多數圖形程序是通過檢測硬件開始的,然後使用getmaxx()和getmaxy()等函數來決定屏幕尺寸,調整隨後的操作來適應這些屏幕限制。

50. getmaxx()返回最大x座標函數
功能: 函數getmaxx()返回當前圖形模式下的最大x座標,即最大橫向座標。
用法: 函數調用方式爲int maxx(void);
說明: 此函數獨立於圖形視口設置,僅取決於顯示卡的顯示模式相應的分辨率。
      這個函數對應的頭文件是graphics.h
返回值: 返回當前顯示模式最大x座標值。
例: 使用本函數的例子見51.getmaxy()函數的例子中。

51. getmaxy() 返回最大y座標函數
功能: 函數getmaxy()返回當前圖形模式下的最大y座標,即最大縱向座標。
用法: 函數調用方式爲int getmaxy(void);
說明: 此函數獨立於圖形視口設置,僅取決於顯示卡的顯示模式相應的分辨率。
      這個函數對應的頭文件爲graphics.h
返回值: 返回當前顯示模式的最大y座標值。
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   printf("max x,y: %d  %d",getmaxx(),getmaxy());
   getch();
   restorecrtmode();
}

52. getx() 返回x座標函數
功能: 函數getx()返回當前圖形模式下當前位置的x座標(水平像素座標)。
用法: 此函數調用方式爲int getx(void);
說明: 這裏座標是相對於當前圖形視口的,如果沒有設置圖形視口,那麼缺省的圖形視口爲整個屏幕。這類似於文本模式下使用wherex()函數。
      getx()函數相應的頭文件是graphics.h
返回值:返回當前x座標值。
例: 見53.gety()函數中的例子。

53. gety() 返回y座標函數
功能: 函數gety()返回圖菜模式下當前位置的y座標(垂直像素座標)。
用法: 此函數調用方式爲int gety(void);
說明: 函數返回的座標是相對於當前圖形視口的,如果沒有設置圖形視口,那麼缺省的圖形視口爲整個屏幕,這類似於文本模式下使用wherey()函數。
      gety()函數對應的頭文件是graphics.h
返回值: 返回當前y座標值。
例: 顯示圖形模式下當前位置的x,y座標值:
printf("x: %d, y: %d", getx(),gety());

54. moveto()函數
功能: 函數moveto()將當前位置移動到指定座標的位置
說明: 這相當於文本模式下gotoxy()函數的操作,它提供對等的功能。
      此函數對應的頭文件爲graphics.h
返回值: 無
例: 把當前位置移到(66,88)位置上:
   moveto(66,88);

55. moverel() 相對移動函數
功能: 函數moverel()根據指定的偏移量,將當前位置移動一個相對距離(即偏移量大小的距離),成爲新的當前位置。
用法: 此函數調用方式爲void moverel(int dx,int dy);
說明: 參數dx爲x方向相對移動距離dy爲y方向相對移動距離。相對移動對圖形應用程序,往往要比絕對移動方便一些。
      這個函數對應的頭文件是graphics.h
返回值: 無
例: 下面的程序,當語句執行到當前位置在(90,90),則執行後將移動到(100,120)的位置上。即x方向相對移動10,y方向相對移動30:
    moverel(10,30);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章