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

來源:互聯網
上載者:User
 

一、螢幕和視口設定與清除函數
    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);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.