繪圖函數

一、繪圖函數

在標準的 C 語言中,是沒有繪圖函數的,這邊我們介紹的是 Turbo C++ 系統專用的繪圖函數。這些繪圖函數都是定義在 graphics.h 裡:

initgraph(&gd,&gm,path) 以 gd、gm 指定的模式進入繪圖模式

closegraph() 結束繪圖模式,返回文字模式

putpixel(x,y,c) 在 (x,y) 的座標以 c 為顏色畫點

setcolor(c) 設定畫圖用的顏色為 c

circle(x,y,r) 以 (x,y) 為圓心、r 為半徑畫圓

line(x1,y1,x2,y2) 在 (x1,y1)-(x2,y2) 之間畫線

其他更多的繪圖函數,可以按 Shift+F1 輸入 graphics.h 找到,在此我們先討論上面的函數。要進入繪畫模式,要使用三個參數,前兩個參數是整數,第一個 gd 是顯示卡種類,第二個 gm 是顯示模式,也就是解析度,我們通常用 92 來指定 VGA 640x480 16 色的繪圖模式,第三個參數是 egavga.bgi 所在的目錄,通常是 C:\TCC:\TC\BGI 。而為了讓繪圖的結果可以停住,我們會配合使用 getch() 函數(定義在 conio.h) 讓畫面停住等我們按一下鍵盤再繼續,下面我們示範寫一個畫一個十字以及一個圓的程式:

#include <graphics.h>

#include <conio.h>

void main()

{

 int gd=9, gm=2;

 initgraph(&gd,&gm,"c:\\tc");

 setcolor(11);

 line(0,240,639,240);

 line(320,0,320,479);

 setcolor(14);

 circle(320,240,200);

 getch();

 closegraph();

}

因為 C 把反斜線 \ 當成控制字元,所以 c:\tc 要改成 c:\\tcsetcolor 函數可設定的顏色從 0-15 ,其中 0-7 是低亮度的顏色,0 為黑色,8-15 是高亮度的顏色,15是白色。

 

二、使用自定座標

在上面的例子中,左上角的座標是 (0,0) ,而右下角的座標是 (639,479) ,這與我們習慣的數學座標有很大的不同,在此如果我們要畫 y=sin(x) 的圖形( x 從 -4 到 4 ),勢必要把這個座標做一個轉換,而螢幕的寬與高的比例為 4:3,所以我們把整個螢幕轉換成 (-4,-3) 到 (4,3) 的座標。我們完成兩個函數 PX(x) 和 PY(y),所以要用到座標的函數就先用這兩個函數轉換成螢幕的真正座標,例如 line(PX(x),PY(y)) 的寫法。下面我們來寫 y=sin(x) 的圖形( sin() 函數定義在 math.h 裡 ):

#include <math.h>

#include <graphics.h>

#include <conio.h>

int PX(float x)

{

 return (x+4.0)*80;

}

int PY(float y)

{

 return (3.0-y)*80;

}

void main()

{

 int gd=9, gm=2;

 float x;

 initgraph(&gd,&gm,"c:\\tc");

 setcolor(11);

 line(PX(0),PY(-3),PX(0),PY(3));

 line(PX(-4),PY(0),PX(4),PY(0));

 for(x=-4.0; x<4.0; x=x+0.1)

   putpixel(PX(x),PY(sin(x)),14);

 getch();

 closegraph();

}

上面是一個標題的描點法,不過似乎這些點沒有連起來,我們可以把 for 迴圈裡的 x=x+0.1 改成 x=x+0.01 或更小的數。而要看到描點的過程,我們可以在畫圖的時候讓它小小的停頓,這時候可以用到 delay() 函數(定義在 dos.h ),它需要一個參數 n, 即是停頓千分之 n 秒。這段程式可以改成:

#include <math.h>

#include <graphics.h>

#include <conio.h>

#include <dos.h>

iint PX(float x)

{

 return (x+4.0)*80;

}

int PY(float y)

{

 return (3.0-y)*80;

}

void main()

{

 int gd=9, gm=2;

 float x;

 initgraph(&gd,&gm,"c:\\tc");

 setcolor(11);

 line(PX(0),PY(-3),PX(0),PY(3));

 line(PX(-4),PY(0),PX(4),PY(0));

 for(x=-4.0; x<4.0; x=x+0.1) {

   putpixel(PX(x),PY(sin(x)),14);

   delay(10);

 }

 getch();

 closegraph();

}

要注意的是,上面的 graphics.h、conio.h、dos.h 的函數都是 Turbo C++ 專用的,也就是說它不是標準 C 語言的函數,一般全國性及國際性比賽是不會用到這些東西,不過一些地區性的比賽可能就會用到。

接下來,同學請自行將上面的程式改成螢幕座標為 (-8,-6) - (8,6) ,並用不同的顏色畫出 y=sin(x) 及 y=sin(2x) 的圖形。

 

三、心臟線

小綠收到一封網路上流傳的信件,法國數學家迪卡兒晚年與克麗絲汀的愛情故事,最後迪卡兒留下一行 r = a ( 1 - sinθ ) 就過世了,這就是著名的心臟線。小綠看完這個故事後感動不已,決定動手試著把它描出來,無奈這個公式計算複雜,畫不到三個點她就放棄了。現在,你是不是可以用 C 程式用描點的方式,畫出在 (-4,-3) - (4,3) 座標中, a=1、0 <= θ<= 2π時,r = a ( 1 - sinθ ) 的圖形。

上面 r = a ( 1 - sinθ ) 的公式為極座標的寫法,我們要先把它轉換成直角座標,才能在座標上畫點:x = r cosθ、y = r sinθ。程式如下:

#include <math.h>

#include <graphics.h>

#include <conio.h>

#include <dos.h>

int PX(float x)

{

 return (x+4.0)*80;

}

int PY(float y)

{

 return (3.0-y)*80;

}

void main()

{

 int gd=9, gm=2;

 float f;

 initgraph(&gd,&gm,"c:\\tc");

 setcolor(11);

 line(PX(0),PY(-3),PX(0),PY(3));

 line(PX(-4),PY(0),PX(4),PY(0));

 for(f=0; f<6.3; f=f+0.01) {

   putpixel(PX((1-sin(f))*cos(f)),PY((1-sin(f))*sin(f)),12);

   delay(10);

 }

 getch();

 closegraph();

}

 

上一頁

首頁

下一頁