繪圖函數(shù)是編寫(xiě)繪圖程序的基礎(chǔ),也是任何一種圖形軟件的核心內(nèi)容。從理論上來(lái)說(shuō),用像素點(diǎn)幾乎可以畫(huà)出任務(wù)圖形,但畢竟效率太低。為此,C程序的BGI(Borland Graphics Interface)提供了大量的基本繪圖函數(shù),以方便圖形設(shè)計(jì)。
在用圖形函數(shù)作圖時(shí),要隨時(shí)注意畫(huà)圖的“當(dāng)前點(diǎn)位制”,它是繪圖的起始位置。也就是說(shuō),圖形總是從當(dāng)前點(diǎn)開(kāi)始畫(huà)。畫(huà)完一個(gè)圖形后,有時(shí)當(dāng)前點(diǎn)位置不變,仍在原來(lái)的位置;而有時(shí)則要把當(dāng)前點(diǎn)移到新的位置。此外,為了從指定位置開(kāi)始作圖,有時(shí)需要先移動(dòng)當(dāng)前點(diǎn)位置,然后再作圖。這些,在調(diào)用繪圖函數(shù)的時(shí)候要注意。
1.直線類繪圖函數(shù)
用直線類函數(shù)繪制直線圖形,可以用兩種坐標(biāo):一種是絕對(duì)坐標(biāo);另一種是相對(duì)坐標(biāo)。
幾個(gè)常用的函數(shù):
1. moveto函數(shù)
點(diǎn)的絕對(duì)定位函數(shù),用于移動(dòng)當(dāng)前點(diǎn)位置。
調(diào)用形式:moveto(x,y);
參數(shù)x,y用于指定新的當(dāng)前點(diǎn)位置坐標(biāo),整型數(shù)據(jù),使用絕對(duì)坐標(biāo)。調(diào)用結(jié)果是將當(dāng)前點(diǎn)位置移到點(diǎn)(x,y)處。例如
moveto(100,100)/*結(jié)果是將當(dāng)前點(diǎn)位置移到了(100,100)處。
2. moverel函數(shù)
點(diǎn)的相對(duì)定位函數(shù),功能與moveto函數(shù)相似,但它使用的是相對(duì)坐標(biāo),它使用當(dāng)前點(diǎn)位置在x和y方向上分別移動(dòng)一個(gè)增量。
調(diào)用形式:moverel(dx,dy);
參數(shù)dx,dy為整型,是相對(duì)于當(dāng)前點(diǎn)位置的增量。
它們不繪制圖形,只改變當(dāng)前點(diǎn)的位置,接著用繪圖函數(shù)繪圖。
3. line函數(shù)
指定兩個(gè)絕對(duì)點(diǎn)繪直線函數(shù)。
調(diào)用形式:line(x1,y1,x2,y2)
參數(shù)x1,y1,x2,y2均為整型,使用絕對(duì)坐標(biāo)。其中(x1,y1)和(x2,y2)分別為直線的兩個(gè)端點(diǎn)坐標(biāo)。
用line函數(shù)畫(huà)線時(shí),其當(dāng)前點(diǎn)的位置不變。
例如,下面的調(diào)用可在屏幕上(VGA)畫(huà)出一條對(duì)角線,line(0,0,639,479);
如果已知三角形的三個(gè)頂點(diǎn)坐標(biāo)分別為:(x1,y1)、(x2,y2)和(x3,y3),則可以用line函數(shù)畫(huà)三條直線構(gòu)成一個(gè)三角形:
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x1,y1);
4. lineto函數(shù)
從當(dāng)前點(diǎn)到指定的絕對(duì)點(diǎn)繪直線函數(shù),并改變當(dāng)前點(diǎn)的位置。所以執(zhí)行的結(jié)果是,在畫(huà)線到指定點(diǎn)的同時(shí)也把當(dāng)前點(diǎn)的位置移到了指定點(diǎn)(即直線的終點(diǎn))。其調(diào)用格式為:
lineto(x,y);
參數(shù)x,y為指定坐標(biāo),均為整型。
5. linerel函數(shù):
從當(dāng)前點(diǎn)到指定的相對(duì)點(diǎn)繪直線函數(shù),指定點(diǎn)位置的坐標(biāo)不是以絕對(duì)坐標(biāo)的形式給出,而是以其相對(duì)于當(dāng)前點(diǎn)(即直線點(diǎn))位置的坐標(biāo)增量給出的。調(diào)用格式為:
linerel(dx,dy);
參數(shù)dx,dy為整型。
該函數(shù)畫(huà)線的同時(shí),將當(dāng)前點(diǎn)的位置移到(x+dx,y+dy)。設(shè)當(dāng)前坐標(biāo)為(x,y),則
linerel(dx,dy)與lineto(x+dx,y+dy)等價(jià)。
通過(guò)下面幾個(gè)實(shí)例體會(huì)上面所說(shuō)函數(shù)在使用上的差別:
設(shè)要過(guò)四點(diǎn)(160,120),(480,120),(480,360)和(160,360)畫(huà)一個(gè)矩形,用不同的函數(shù)其繪圖程序不同,分別如下:
【例9-3】使用line函數(shù)畫(huà)矩形
#include<graphics.h>
#include <conio.h>
int main()
{
initgraph(640, 480); /* 初始化繪圖窗口*/
cleardevice();
line(160,120,480,120);
line(480,120,480,360);
line(480,360,160,360);
line(160,360,160,120);
getch();
closegraph();
return 0;
}
程序運(yùn)行結(jié)果:
圖9-5 運(yùn)行結(jié)果圖
【例9-4】使用lineto函數(shù)畫(huà)矩形
#include<graphics.h>
#include <conio.h>
int main()
{
initgraph(640, 480); /* 初始化繪圖窗口*/
cleardevice();
moveto(160,120);
lineto(480,120);
lineto(480,360);
lineto(160,360);
lineto(160,120);
getch();
closegraph();
return 0;
}
程序運(yùn)行結(jié)果如圖9-4所示。
【例9-5】使用linerel函數(shù)畫(huà)矩形
#include<graphics.h>
#include <conio.h>
int main()
{
initgraph(640, 480); /* 初始化繪圖窗口*/
cleardevice();
moveto(160,120);
linerel(320,0);
linerel(0,240);
linerel(-320,0);
linerel(0,-240);
getch();
closegraph();
return 0;
}
程序運(yùn)行結(jié)果如圖9-4所示。
6.getx(),gety()函數(shù)分別是讀取當(dāng)前點(diǎn)的位置x,y坐標(biāo)值。
7.getmaxx(),getmaxy()函數(shù)分別讀取x,y軸的最大坐標(biāo)值。