韓繼英
(山西職業(yè)技術(shù)學(xué)院計(jì)算機(jī)工程系,山西太原030006)
C語(yǔ)言是一種功能強(qiáng)大的計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,它具有很強(qiáng)的數(shù)據(jù)處理能力,應(yīng)用范圍廣泛,不僅可以編寫(xiě)系統(tǒng)軟件,而且還可以通過(guò)繪制三維、二維圖像以及動(dòng)畫(huà)來(lái)實(shí)現(xiàn)可視化人機(jī)界面。
通常在C語(yǔ)言中使用頻率最高的輸出函數(shù)printf(),只能輸出文本信息,不能實(shí)現(xiàn)繪圖功能。為了實(shí)現(xiàn)這一功能,C語(yǔ)言的標(biāo)準(zhǔn)函數(shù)庫(kù)還提供了一個(gè)功能強(qiáng)大的圖形函數(shù)庫(kù),包含了所有的圖形函數(shù)。當(dāng)程序中需要使用到任何一個(gè)或多個(gè)圖形函數(shù)時(shí),都必須包含頭文件graphics.h,而且這些圖形函數(shù)都必須在特定的圖形模式下才能使用。但C語(yǔ)言的默認(rèn)模式是文本模式,在文本模式中,圖形函數(shù)無(wú)法實(shí)現(xiàn)其功能,因此,必須先將計(jì)算機(jī)模式調(diào)整為圖形模式。在圖形模式下,我們可以通過(guò)圖形函數(shù)實(shí)現(xiàn)可視化人機(jī)界面[1]。
文本模式顯示數(shù)據(jù)的最小單位是字符,屏幕被劃分為80列25行;而圖形模式是以顯示器屏幕上的每個(gè)發(fā)光點(diǎn)即象素為顯示數(shù)據(jù)的最小單位的[2]。在此模式下,顯示器屏幕上的象素?cái)?shù)目是根據(jù)顯示器的分辨率確定的。例如:分辨率為1 024×768,則屏幕被劃分為768行1 024列,即每行有768個(gè)象素,每列有1 024個(gè)象素。一般情況下,顯示器分辨率越高,象素越多,則顯示的圖形效果就越精確,越光滑。
在使用C語(yǔ)言的圖形功能時(shí),首先要將屏幕設(shè)置為圖形模式,如不做此項(xiàng)工作,則屏幕的初始模式為文本模式,無(wú)法顯示圖形。將屏幕設(shè)置成圖形模式由函數(shù)initgraph()來(lái)完成,此函數(shù)包含在頭文件graphics.h中,因此在使用時(shí)要將該文件包含到程序中。在完成圖形功能后用closegraph語(yǔ)句關(guān)閉圖形模式,使屏幕返回到初始的文本模式。
下面的程序給出了繪制圖形所需的必要操作,本程序在完成屏幕初始化后,畫(huà)了一條從左上角到右下角的直線。
說(shuō)明:
(1)程序中定義了gdriver和gmode,并給 gdriver賦值DETECT,表示讓硬件自動(dòng)監(jiān)測(cè)圖形驅(qū)動(dòng)器與模式。
(2)initgraph()函數(shù)是初始化屏幕圖形模式,""中應(yīng)指明屏幕圖形模式驅(qū)動(dòng)程序所在的位置,如:"c:\borlandc\bgi",如當(dāng)前目錄包含該驅(qū)動(dòng)程序時(shí),可省略為:"",我們使用的驅(qū)動(dòng)程序?yàn)镋GAVGA.BGI,該驅(qū)動(dòng)程序支持640×480分辨率16種顏色,分別用0~15表示*/
(3)line()函數(shù)是畫(huà)直線函數(shù),此程序中從左上角點(diǎn)(0,0)到右下角點(diǎn)(getmaxx(),getmaxy())畫(huà)了一條直線。
(4)closegraph()函數(shù)是關(guān)閉圖形模式,退回到文本模式。
圖形模式下,有時(shí)也需要顯示字符,我們還能夠使用文件模式下的輸出函數(shù)printf()以及字符處理函數(shù)putchar()、puts(),將文本信息輸出到屏幕上。除此之外,C語(yǔ)言圖形函數(shù)庫(kù)還提供了專門(mén)用在圖形模式下輸出文本的一些函數(shù),如outtextxy()等。對(duì)于輸出的文本,還可以利用圖形函數(shù)對(duì)其進(jìn)行大小和顏色的設(shè)置。settextstyle()函數(shù)可以使文本在水平和垂直方向上放大相同的倍數(shù);setusercharsize()函數(shù)可以分別設(shè)置水平和垂直方向上的放大倍數(shù);setcolor()函數(shù)可以對(duì)輸出文本的顏色進(jìn)行設(shè)置。
在圖形模式設(shè)置時(shí),需要有相應(yīng)的BGI文件,因此在將圖形模式下編寫(xiě)好的程序復(fù)制到其他用戶計(jì)算機(jī),根本無(wú)法正常運(yùn)行。必須將所有的BGI文件一起復(fù)制給用戶,并且還要考慮路徑是否存在問(wèn)題。因此我們需要建立一個(gè)不需要驅(qū)動(dòng)程序就可以獨(dú)立運(yùn)行的可以執(zhí)行圖形程序的有效方法,具體實(shí)現(xiàn)步驟如下:
1)使用命令:C:TC>BGIOBJEGAVGA
把原有的 EGAVGA.BGI驅(qū)動(dòng)程序轉(zhuǎn)換為 EGAVGA。OBJ目標(biāo)文件。
2)使用命令:C:TC>TLINK C:TCLIBGRAPHICS.LIB+EGAVGA
把已經(jīng)建立的OBG目標(biāo)文件裝入到GRAPHICS.LIB庫(kù)文件中。
3)為了能夠通知連接程序?qū)GAVGA驅(qū)動(dòng)程序在連接時(shí)可以裝入到用戶的執(zhí)行程序中,應(yīng)在調(diào)用initgraph()函數(shù)前面加上語(yǔ)句:
registerbgidriver(EGAVGA_driver);
應(yīng)用上面方法處理以后,經(jīng)過(guò)編譯連接生成的執(zhí)行程序就能夠在任意目錄下運(yùn)行了。
由于人的眼睛在視覺(jué)訊號(hào)分辨時(shí),都會(huì)出現(xiàn)視覺(jué)暫留現(xiàn)象。醫(yī)學(xué)證明:當(dāng)一個(gè)物體的影象或者一幅畫(huà)面消失后,留在人眼睛視網(wǎng)膜上的映像還可以保留1/24秒。動(dòng)畫(huà)、電視以及電影都是利用了人的這一視覺(jué)暫留特性,快速地顯示一連串圖形,并在每張圖形上做一些小小的修改,從而達(dá)到動(dòng)畫(huà)的效果。
C語(yǔ)言中有一種邏輯運(yùn)算稱為“異或”運(yùn)算。“異或”運(yùn)算是指操作數(shù)1與操作數(shù)2的非同操作數(shù)1的非與操作數(shù)2的或的結(jié)果。例如:
0異或0=0
1異或0=1
0異或1=1
1異或1=0
由于0異或1結(jié)果為1,所以任何兩種不相同的顏色值進(jìn)行按位異或時(shí),除和黑色進(jìn)行按位異或后結(jié)果為原色外,其余都變成了和這兩種顏色不同的另外一種顏色。因此,在實(shí)現(xiàn)動(dòng)畫(huà)時(shí),可以將兩種顏色值按位進(jìn)行異或,從而模擬這兩種顏色的重疊。即通過(guò)按位異或兩個(gè)圖形中相應(yīng)的像素值來(lái)模擬這兩個(gè)圖形的重疊,從而不用顧及背景色,一直保持他們的可見(jiàn)性。任何一個(gè)數(shù)在和另一個(gè)數(shù)異或兩次后,就可以還原。也就是說(shuō),在繪制圖形時(shí),如果在同一個(gè)坐標(biāo)繪制兩次某個(gè)圖形,則這個(gè)圖形就會(huì)消失,變?yōu)楸尘吧?/p>
因此,我們可以很輕松地利用異或技術(shù)來(lái)實(shí)現(xiàn)簡(jiǎn)單動(dòng)畫(huà)過(guò)程。先在屏幕上用某種顏色采用異或方式繪制一幅圖,接著在同一個(gè)位置采用異或方式再畫(huà)一次,將該圖抹掉,然后根據(jù)運(yùn)動(dòng)軌跡在新的位置采用異或方式繪制第二幅圖,同樣再用異或方式繪制一次,將此畫(huà)面消失,如此反復(fù),直到繪制完最后一幅圖為止[3]。在這個(gè)過(guò)程中,每幅畫(huà)都繪制了兩次,一次顯示,一次擦除,只是每幅畫(huà)的位置有所不同。
下面是應(yīng)用異或方式實(shí)現(xiàn)繪制一個(gè)運(yùn)動(dòng)的圓的例子。
本例采用異或方式重畫(huà),畫(huà)點(diǎn)開(kāi)銷較小,是繪制動(dòng)畫(huà)最好的選擇。
本文主要是研究了在C語(yǔ)言的圖形模式下,利用圖形函數(shù),采用異或方式,較好地實(shí)現(xiàn)了可視化人機(jī)界面[4]。這種方式操作方便,易于理解,是解決可視化人機(jī)界面有效的一種方式。
[1]楊寶華,袁志樹(shù),文昌辭.應(yīng)用軟件人機(jī)界面優(yōu)化的研究[J].電腦知識(shí)與技術(shù),2009(18):4817-4818.
[2]王士元.C高級(jí)適用程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2001.
[3]程書(shū)紅,王毅.用C語(yǔ)言實(shí)現(xiàn)圖形動(dòng)畫(huà)設(shè)計(jì)[J].電腦開(kāi)發(fā)與應(yīng)用,2010,23(2):78 -80.
[4]蔡青,蔡華.可視化技術(shù)及其發(fā)展[N].計(jì)算機(jī)世界網(wǎng),1996-06-13.