C語言圖形函數(shù)庫_第1頁
C語言圖形函數(shù)庫_第2頁
C語言圖形函數(shù)庫_第3頁
C語言圖形函數(shù)庫_第4頁
C語言圖形函數(shù)庫_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

C語言圖形編程(三、繪圖函數(shù)-02)四、圖形和圖像函數(shù)

(一)像素函數(shù)

56.putpiel()畫像素點函數(shù)

57.getpixel()返回像素色函數(shù)

(二)直線和線型函數(shù)

58.line()畫線函數(shù)

59.lineto()畫線函數(shù)

60.linerel()相對畫線函數(shù)

61.setlinestyle()設(shè)置線型函數(shù)

62.getlinesettings()獲取線型設(shè)置函數(shù)

63.setwritemode()設(shè)置畫線模式函數(shù)

(三)、多邊形函數(shù)

64.rectangle()畫矩形函數(shù)

65.bar()畫條函數(shù)

66.bar3d()畫條塊函數(shù)

67.drawpoly()畫多邊形函數(shù)

(四)、圓、弧和曲線函數(shù)

68.getaspectratio()獲取縱橫比函數(shù)

69.circle()畫圓函數(shù)

70.arc()畫圓弧函數(shù)

71.ellipse()畫橢圓弧函數(shù)

72.fillellipse()畫橢圓區(qū)函數(shù)

73.pieslice()畫扇區(qū)函數(shù)

74.sector()畫橢圓扇區(qū)函數(shù)

75.getarccoords()獲取圓弧坐標函數(shù)

(五)、填充函數(shù)

76.setfillstyle()設(shè)置填充圖樣和顏色函數(shù)

77.setfillpattern()設(shè)置用戶圖樣函數(shù)

78.floodfill()填充閉域函數(shù)

79.fillpoly()填充多邊形函數(shù)

80.getfillsettings()獲取填充設(shè)置函數(shù)

81.getfillpattern()獲取用戶圖樣設(shè)置函數(shù)

(六)、圖像函數(shù)

82.imagesize()圖像存儲大小函數(shù)

83.getimage()保存圖像函數(shù)

84.putimage()輸出圖像函數(shù)四、圖形和圖像函數(shù)

對許多圖形應(yīng)用程序,直線和曲線是非常有用的。但對有些圖形只能靠操作單個像素才能畫出。當然如果沒有畫像素的功能,就無法操作直線和曲線的函數(shù)。而且通過大規(guī)模使用像素功能,整個圖形就可以保存、寫、擦除和與屏幕上的原有圖形進行疊加。

(一)像素函數(shù)56.putpixel()畫像素點函數(shù)

功能:函數(shù)putpixel()在圖形模式下屏幕上畫一個像素點。

用法:函數(shù)調(diào)用方式為voidputpixel(intx,inty,intcolor);

說明:參數(shù)x,y為像素點的坐標,color是該像素點的顏色,它可以是顏色符號名,也可以是整型色彩值。

此函數(shù)相應(yīng)的頭文件是graphics.h

返回值:無

例:在屏幕上(6,8)處畫一個紅色像素點:

putpixel(6,8,RED);57.getpixel()返回像素色函數(shù)

功能:函數(shù)getpixel()返回像素點顏色值。

用法:該函數(shù)調(diào)用方式為intgetpixel(intx,inty);

說明:參數(shù)x,y為像素點坐標。

函數(shù)的返回值可以不反映實際彩色值,這取決于調(diào)色板的設(shè)置情況(參見setpalette()函數(shù))。

這個函數(shù)相應(yīng)的頭文件為graphics.h

返回值:返回一個像素點色彩值。

例:把屏幕上(8,6)點的像素顏色值賦給變量color。

color=getpixel(8,6);(二)直線和線型函數(shù)

有三個畫直線的函數(shù),即line(),lineto(),linerel()。這些直線使用整型坐標,并相對于當前圖形視口,但不一定受視口限制,如果視口裁剪標志clip為真,那么直線將受到視口邊緣截斷;如果clip為假,即使終點坐標或新的當前位置在圖形視口或屏幕極限之外,直線截斷到屏幕極限。

有兩種線寬及幾種線型可供選擇,也可以自己定義線圖樣。下面分別介紹直線和線型函數(shù)。58.line()畫線函數(shù)

功能:函數(shù)line()使用當前繪圖色、線型及線寬,在給定的兩點間畫一直線。

用法:該函數(shù)調(diào)用方式為voidline(intstartx,intstarty,intendx,intendy);

說明:參數(shù)startx,starty為起點坐標,endx,endy為終點坐標,函數(shù)調(diào)用前后,圖形狀態(tài)下屏幕光標(一般不可見)當前位置不改變。

此函數(shù)相應(yīng)的頭文件為graphics.h

返回值:無

例:見函數(shù)60.linerel()中的實例。59.lineto()畫線函數(shù)

功能:函數(shù)lineto()使用當前繪圖色、線型及線寬,從當前位置畫一直線到指定位置。

用法:此函數(shù)調(diào)用方式為voidlineto(intx,inty);

說明:參數(shù)x,y為指定點的坐標,函數(shù)調(diào)用后,當前位置改變到指定點(x,y)。

該函數(shù)對應(yīng)的頭文件為graphics.h

返回值:無

例:見函數(shù)60.linerel()中的實例。60.linerel()相對畫線函數(shù)

功能:函數(shù)linerel()使用當前繪圖色、線型及線寬,從當前位置開始,按指定的水平和垂直偏移距離畫一直線。

用法:這個函數(shù)調(diào)用方式為voidlinerel(intdx,intdy);

說明:參數(shù)dx,dy分別是水平偏移距離和垂直偏移距離。

函數(shù)調(diào)用后,當前位置變?yōu)樵黾悠凭嚯x后的位置,例如,原來的位置是(8,6),調(diào)用函數(shù)linerel(10,18)后,當前位置為(18,24)。

返回值:無

例:下面的程序為畫線函數(shù)調(diào)用實例:

#include<graphics.h>

voidmain()

{

intdriver,mode;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

setcolor(15);

line(66,66,88,88);

lineto(100,100);

linerel(36,64);

getch();

restorecrtmode();

}61.setlinestyle()設(shè)置線型函數(shù)

功能:setlinestyle()為畫線函數(shù)設(shè)置當前線型,包括線型、線圖樣和線寬。

用法:setlinestyle()函數(shù)調(diào)用方式為voidsetlinestyle(intstly,unsignedpattern,intwidth);

說明:參數(shù)style為線型取值,也可以用相應(yīng)名稱表示,如表1-10中所示。

參數(shù)pattern用于自定義線圖樣,它是16位(bit)字,只有當style=USERBIT_LINE(值為1)時,pattern的值才有意義,使用用戶自定義線圖樣,與圖樣中“1”位對應(yīng)的像素顯示,因此,pattern=0xFFFF,則畫實線;pattern=0x9999,則畫每隔兩個像素交替顯示的虛線,如果要畫長虛線,那么pattern的值可為0xFF00和0xF00F,當style不為USERBIT_LINE值時,雖然pattern的值不起作用,但扔須為它提供一個值,一般取為0。

參數(shù)wigth用來設(shè)定線寬,其取值見表1-11,表中給出了兩個值,即1和3,實際上,線寬取值為2也是可以接受的。

若用非法參數(shù)調(diào)用setlinestyle()函數(shù),那么graphresult()會返回錯誤代碼,并且當前線型繼續(xù)有效。

TurboC提供的線型與線寬定義在頭文件graphics.h中,表1-10和1-11分別列出了參數(shù)的取值與含義。表1-10線型

-----------------------------------------------------

名稱取值含義

-----------------------------------------------------

SOLID_LINE0實線

DOTTED_LINE1點線

CNTER_LINE2中心線

DASHED_LINE3虛線

USERBIT_LINE4用戶自定義線型

-----------------------------------------------------表1-11線寬

-----------------------------------------------------------

名稱取值說明

-----------------------------------------------------------

NORM_WIDTH(常寬)1一個像素寬(缺省值)

THICK_WIDTH(加寬)3三個像素寬

-----------------------------------------------------------這個函數(shù)的頭文件是graphics.h

返回值:無

例:下面的程序顯示了BC中所提供的線型圖樣:

#include<graphics.h>

voidmain()

{

intdriver,mode;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

for(i=0;i<4;i++)

{

setlinestyle(i,0,1);

line(i*50,200,i*50+60,200)

}

getch();

restorecrtmode();

}62.getlinesettings()獲取線型設(shè)置函數(shù)

功能:函數(shù)getlinesettings()用當前設(shè)置的線型、線圖樣和線寬填寫linesettingstype型結(jié)構(gòu)。

用法:函數(shù)調(diào)用方式為voidgetlinesettings(structlinesettingstype*info);

說明:此函數(shù)調(diào)用執(zhí)行后,當前的線型、線圖樣和線寬值被裝入info指向的結(jié)構(gòu)里,從而可從該結(jié)構(gòu)中獲得線型設(shè)置。

linesettingstype型結(jié)構(gòu)定義如下:

structlinesettingstype{

intlinestyle;

unsignedupattern;

intthickness;

};

其中l(wèi)inestyle用于存放線型,線型值為表1-10中的各值之一。

upattern用為裝入用戶自定義線圖樣,這是16位字,每一位等于一個像素,如果哪個位被設(shè)置,那么該像素打開,否則關(guān)閉。

thickness為線寬值存放的變量,可參見表1-11。

getlinesettings()函數(shù)對應(yīng)的頭文件為graphics.h

返回值:返回的線型設(shè)置存放在info指向的結(jié)構(gòu)中。

例:把當前線型的設(shè)置寫入info結(jié)構(gòu):

structlinesettingstypeinfo;

getlinesettings(&info);

63.setwritemode()設(shè)置畫線模式函數(shù)

功能:函數(shù)setwritemode()設(shè)置畫線模式

用法:函數(shù)調(diào)用方式為voidsetwritemode()(intmode);

說明:參數(shù)mode只有兩個取值0和1,若mode為0,則新畫的線將復(fù)蓋屏幕上原有的圖形,此為缺省畫線輸出模式。如果mode為1,那么新畫的像素點與原有圖形的像素點先進行異或(XOR)運算,然后輸出到屏幕上,使用這種畫線輸出模式,第二次畫同一圖形時,將擦除該圖形。調(diào)用setwritemode()設(shè)置的畫線輸出模式只影響函數(shù)line(),lineto(),linerel(),recangle()和drawpoly()。

setwritemode()函數(shù)對應(yīng)的頭文件是graphics.h

返回值:無

例:設(shè)置畫線輸出模式為0:

setwritemode(0);(三)、多邊形函數(shù)

對多邊形,無疑可用畫直線函數(shù)來畫出它,但直接提供畫多邊形的函數(shù)會給用戶很大方便。最常見的多邊形有矩形、矩形塊(或稱條形)、多邊形和多邊形塊,我們還把長方形條塊也放到這里一起考慮,雖然它不是多邊形,但它的特例就是矩形(塊)。下面直接介紹畫多邊形的函數(shù)。64.rectangle()畫矩形函數(shù)

功能:函數(shù)rectangle()用當前繪圖色、線型及線寬,畫一個給定左上角與右下角的矩形(正方形或長方形)。

用法:此函數(shù)調(diào)用方式為voidrectangle(intleft,inttop,intright,intbottom);

說明:參數(shù)left,top是左上角點坐標,right,bottom是右下角點坐標。如果有一個以上角點不在當前圖形視口內(nèi),且裁剪標志clip設(shè)置的是真(1),那么調(diào)用該函數(shù)后,只有在圖形視口內(nèi)的矩形部分才被畫出。

這個函數(shù)對應(yīng)的頭文件為graphics.h

返回值:無

例:下面的程序畫一些矩形實例:

#include<graphics.h>

voidmain()

{

intdriver,mode;

driver=DETECT;

mode=0;

initgrpah(&driver,&mode,"");

rectangle(80,80,220,200);

rectangle(140,99,180,300);

rectangle(6,6,88,88);

rectangle(168,72,260,360);

getch();

restorecrtmode();

}65.bar()畫條函數(shù)

功能:函數(shù)bar()用當前填充圖樣和填充色(注意不是給圖色)畫出一個指定上左上角與右下角的實心長條形(長方塊或正方塊),但沒有四條邊線)。

用法:bar()函數(shù)調(diào)用方式為voidbar(intleft,inttop,intright,intbottom);

說明:參數(shù)left,topright,bottom分別為左上角坐標與右下角坐標,它們和調(diào)用函數(shù)rectangle()的情形相同,調(diào)用此函數(shù)前,可用setfillstyle()或setfillpattern()設(shè)置當前填充圖樣和填充色。

注意此函數(shù)只畫沒有邊線的條形,如果要畫有邊線的的條形,可調(diào)用下面的函數(shù)bar3d()來畫,并將深度參數(shù)設(shè)為0,同時topflag參數(shù)要設(shè)置為真,否則該條形無頂邊線。

這應(yīng)的頭文件為graphics.h

返回值:無

例:見函數(shù)bar3d()中的實例。

66.bar3d()畫條塊函數(shù)

功能:函數(shù)bar3d()使用當前繪圖色、線型及線寬畫出三維長方形條塊,并用當前填充圖樣和填充色填充該三維條塊的表面。

用法:此函數(shù)調(diào)用方式為voidbar3d(intleft,inttop,intright,intbottom,intdepth,inttopflag);

說明:參數(shù)left,top,right,bottom分另為左上角與右下角坐標,這與bar()函數(shù)中的一樣。參數(shù)depth為條塊的深度,以像素為單位,通常按寬度的四分之一計算。深度方向通過屏顯縱橫比調(diào)節(jié)為約45度(即這時x/y比設(shè)置為1:1)。

參數(shù)topflag相當于一個布爾參數(shù),如果設(shè)置為1(真)那么條塊上放一頂面;若設(shè)置為0(假),則三維條形就沒有頂面,這樣可使多個三維條形疊加在一起。

要使圖形更加美觀,可利用函數(shù)floodfill()或setfillpattern()來選擇填充圖樣和填充色(參見本小節(jié)(五)填充函數(shù))。

bar3d()函數(shù)對應(yīng)的頭文件為graphics.h

返回值:無

例:下面的程序畫一個條形和條塊:

#include<graphics.h>

voidmain()

{

intdriver,mode;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

setfillstyle(SOLID-FILL,GREEN);

bar(60,80,220,160);

setfillstyle(SOLID-FILL,RED);

bar3d(260,180,360,240,20,1);

getch();

restorecrtmode();

}67.drawpoly()畫多邊形函數(shù)

功能:函數(shù)drawpoly()用當前繪圖色、線型及線寬,畫一個給定若干點所定義的多邊形。

用法:此函數(shù)調(diào)用方式為voiddrawpoly(intpnumber,int*points);

說明:參數(shù)pnumber為多邊形的頂點數(shù);參數(shù)points指向整型數(shù)組,該數(shù)組中是多邊形所有頂點(x,y)坐標值,即一系列整數(shù)對,x坐標值在前。顯然整型數(shù)組的維數(shù)至少為頂點數(shù)的2倍,在定義了多邊形所有頂點的數(shù)組polypoints時,頂點數(shù)目可通過計算sizeof(polypoints)除以2倍的sizeof(int)得到,這里除以2倍的原因是每個頂點有兩個整數(shù)坐標值。另外有一點要注意,畫一個n個頂點的閉合圖形,頂點數(shù)必須等于n+1,并且最后一點(第n+1)點坐標必須等于第一點的坐標。

drawpoly()函數(shù)對應(yīng)的頭文件為grpahics.h

返回值:無

例:下面的程序畫一個封閉星形圖與一個不封閉星形圖:

#include<graphics.h>

voidmain()

{

intdriver,mode;

staticintpolypoints1[18]={100,100,110,120,100,130,120,125,140,140,130,120,

140,110,120,115,100,100};

staticintpolypoints2[18]={180,100,210,120,200,130,220,125,240,140,230,120,

240,110,220,115,220,110};

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

drawpoly(9,polypoints1);

drawpoly(9,polypoints2);

getch();

restorecrtmode();

}(四)、圓、弧和曲線函數(shù)

在一個屏幕上畫得很圓的圖形到另一個屏幕上可能被壓扁或拉長,這是因為每一種顯示卡與之相應(yīng)的顯示模式都有一個縱橫比??v橫比是指像素的水平方向大小與垂直方向大小的比值。如VGA顯示卡由于偈素基本上是正方形,所以縱橫比為1.000。

為了保證幾何圖形基本按預(yù)計情況顯示在屏幕上,用屏顯的縱橫比來計算和糾正不同硬件及顯示卡產(chǎn)生的畸變。計算縱橫比所需要的水平方向和垂直方向的比例系數(shù)可調(diào)用函數(shù)getaspectratio()獲得。68.getaspectratio()獲取縱橫比函數(shù)

功能:函數(shù)getaspectratio()返回x方向和y方向的比例系數(shù),用這兩個整型值可計算某一特定屏顯的縱橫比。

用法:此函數(shù)調(diào)用方式為voidgetaspectratio(intxasp,intyasp);

說明:參數(shù)xasp指向的變量存放返回的x方向比例系數(shù);參數(shù)yasp指向的變量存放返回的y方向比例系數(shù)。通常y方向比例系數(shù)為10000,x方向比例系數(shù)不大于10000(這是因為大多數(shù)屏幕像素高比寬長)。

注意縱橫比自動用作下面函數(shù)arc(),circle()和pieslice()中的標尺因子,使屏幕上圓或弧正常顯示。但用ellipse()函數(shù)畫橢圓必須調(diào)用本函數(shù)獲取縱橫比作為標尺因子,否則不予調(diào)整。縱橫比可用于其它幾何圖形,目的是校正和顯示圖形。

getaspectratio()函數(shù)對應(yīng)的頭文件為graphics.h

返回值:返回x與y方向比例系數(shù)分別存放在xasp和yasp所指向的變量中。

例:下面的程序顯示縱橫比:

intxasp,yasp;

floataspectratio;

getaspectratio(&xasp,&yasp);

aspectratio=xasp/yasp;

printf("aspectratio:%f",aspectratio);69.circle()畫圓函數(shù)

功能:函數(shù)circle()使用當前繪圖色并以實線畫一個完整的圓。

用法:該函數(shù)調(diào)用方式為voidcircle(intx,inty,intradius);

說明:參數(shù)x,y為圓心坐標,radius為圓半徑,用像素個素表示。注意,調(diào)用circle()函數(shù)畫圓時不用當前線型。

不同于ellipse()函數(shù),只用單個半徑radius參數(shù)調(diào)用circle()函數(shù),故屏顯縱橫比可以自動調(diào)節(jié),以產(chǎn)生正確的顯示圖。

此函數(shù)對應(yīng)的頭文件為graphics.h

返回值:無

例:畫六個同心圓,圓心在(100,100)。

#include<graphics.h>

voidmain()

{

intdriver,mode;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

circle(100,100,10);

circle(100,100,20);

circle(100,100,30);

circle(100,100,40);

circle(100,100,50);

circle(100,100,60);

getch();

restorecrtmode();

}70.arc()畫圓弧函數(shù)

功能:函數(shù)arc()使用當前繪圖色并以實線畫一圓弧。

用法:函數(shù)調(diào)用方式為voidarc(intx,inty,intstartangle,intendangle,intradius);

說明:參數(shù)x,y為圓心坐標,startangle與endangle分別為起始角與終止角,radius為半徑。圓心坐標和半徑以像素個數(shù)給出,起始角和終止角以度為單位,0度位于右邊,90度位于頂部,180度位于左邊,底部是270度。同往常一樣,360度與0度重合。角度按逆時針方向增加,但并不要求終止角一定比起始角大。例如指定300度和90度分別為起始角和終止角,與指定300度和450度分別為起始角和終止角可畫出相同的弧。大于360度可作為參數(shù),它將被化到0度 ̄360度范圍里。函數(shù)arc()能畫封閉圓,只要取起始角為0度,終止角為360度即可。此函數(shù)中,屏顯縱橫比可自動調(diào)節(jié)。

arc()函數(shù)對應(yīng)的頭文件為graphics.h

返回值:無

例:以(200,200)為圓心,100為半徑,從0度到120度畫圓?。?/p>

#include<graphics.h

voidmain()

{

intdriver,mode;

driver=DETECT;

mode=0;

initgraph(&drivwer,&mode,"");

setcolor(WHITE);

arc(200,200,0,120,100);

getch();

restorecrtmode();

}71.ellipse()畫橢圓弧函數(shù)

功能:函數(shù)ellipse()使用當前繪圖色畫一橢圓弧。

用法:該函數(shù)調(diào)用方式為voidellipse(intx,inty,intstartangle,intendangle,

intxradius,intyradius);

說明:參數(shù)x,y為橢圓中心坐標,startangle和endangle為給定的起始角和終止角,xradius與yradius為橢圓的x軸半徑與y軸半徑,如果startangle為0,endangle等于360度,那么畫出的是個完整的橢圓。ellipse()函數(shù)不同于arc()和circle()函數(shù),屏顯縱橫比不能自動調(diào)節(jié)。若需要的是成比例的半徑而不是特定的像素距離,則y軸距離必須調(diào)節(jié)為yradius*aspectratio(y軸半徑乘以縱橫比)。

此函數(shù)對應(yīng)的頭文件為graphics.h

返回值:無

例:在屏幕上畫一個雞蛋形的橢圓。

#include<graphics.h>

voidmain()

{

intdriver,mode;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

ellipse(200,100,0,360,80,40);

getch();

restorecrtmode();

}72.fillellipse()畫橢圓區(qū)函數(shù)

功能:函數(shù)fillellipse()使用當前繪圖色畫一橢圓,然后用當前填充色圖樣和填充色填充所畫的橢圓。

用法:此函數(shù)調(diào)用方式為voidfillellipse(intx,inty,intxradius,intyradius);

說明:參數(shù)x,y為橢圓中心坐標,xradius,yradius為水平軸半徑和垂直軸半徑。

這個函數(shù)對應(yīng)的頭文件為graphics.h

返回值:無

例:畫一填充橢圓:

#include<graphics.h>

#include<stdio.h>

#defineR60

voidmain()

{

intdriver,mode;

intxasp,yasp;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

fillellipse(getmaxx()/2,getaxy()/2,66,44);

getaspectratio(&xasp,&yasp);

fillellipse(R,R,R,R*(long)xasp/(long)yasp);

getch();

closegraph();

}73.pieslice()畫扇區(qū)函數(shù)

功能:函數(shù)pieslice()使用當前繪圖色畫一圓弧,并把弧兩端與圓心分別連一直線段(即半徑),然后用當前填圖樣和填充色進行填充,即得扇區(qū)。

用法:這個函數(shù)調(diào)用方式為voidpieslice(intx,inty,intstartangle,intendangle,intradius);

說明:函數(shù)pieslice()的操作類似于arc()函數(shù)(即同調(diào)用參數(shù)一樣,只是函數(shù)名不同),因此調(diào)用此函數(shù)的詳細說明參見函數(shù)arc()的相應(yīng)內(nèi)容。該函數(shù)對屏顯縱橫比能自動調(diào)節(jié)進行補償。

pieslice()函數(shù)對應(yīng)的頭文件為graphics.h

返回值:無

例:顯示一個扇形圖,每45度為一個不同的扇區(qū):

#include<graphics.h>

voidmain()

{

intdriver,mode;

inti,start,end;

driver=DETECT;

mode=0;

initgraph(&driver,mode,"");

start=0;

end=45;

for(i=0;i<8;i++)

{

setfillstyle(SOLID_FILL,i);

pieslice(260,200,start,end,100);

start+=45;

end+=45;

}

getch();

restorecrtmode();

}

74.sector()畫橢圓扇區(qū)函數(shù)

功能:函數(shù)sector()先用當前繪圖色畫橢圓扇形輪廓,然后用當前填充圖樣和填充色進行填充,即得橢圓扇區(qū)。

用法:該函數(shù)調(diào)用方式為voidsector(intx,inty,intstartangle,intendangle,intxradius,intyradius);

說明:參數(shù)x,y為橢圓中心坐標,startangle和endangle為起始角與終止角,xradius與yradius是水平軸半徑和垂直軸半徑即長短軸。當startangle為0,endangle為360度時,調(diào)用此函數(shù)可畫得一個完整的橢圓區(qū)。角度增加方向為反時針方向。設(shè)定填充圖樣和填充色,用setfillstyle()或setfillpattern()函數(shù),若畫輪廓線或填充扇區(qū)出現(xiàn)錯誤,則graphresult()函數(shù)返回值-6。對屏顯縱橫比,sector()函數(shù)不能自動調(diào)節(jié)補償。

返回值:無

例:畫出兩個橢圓扇區(qū):

#include<graphics.h>

#include<stdio.h>

#defineR80

voidmain()

{

intdriver,mode;

intxasp,yasp;

initgraph(&driver,&mode,"");

sector(getmaxx()/2,getmaxy()/2,0,656,R,R);

getaspectratio(&xasp,&yasp);

setctor(getmaxx()/2,getmaxy()/2,180,135,R,R*(long)xasp/(long)yasp);

getch();

closegraph();

}75.getarccoords()獲取圓弧坐標函數(shù)

功能:函數(shù)getarccoords()將最后一次調(diào)用arc()或ellipse()畫的圓弧或橢圓弧的起終點坐標和中心坐標填入arccoordstype型結(jié)構(gòu)里,進而從該結(jié)構(gòu)中獲取這些坐標值。

用法:getarccoords()函數(shù)調(diào)用方式為voidgetarccoords(structarccoordstype*coordsp);

說明:調(diào)用此函數(shù)填寫coordsp指向的結(jié)構(gòu),從而獲得起終點坐標和中心坐標值。它們可用于畫弦、半徑以及其它與圓弧端點相連的直線等。pieslice()函數(shù)就要用到這些值。如果最后一次調(diào)用的函數(shù)是circle(),那么getarccoords()將返回圓心坐標和起終點坐標即圓的位置。

arccoordstype型結(jié)構(gòu)定義如下:

structarccoordstype{

intx,y;

intxstart,ystart,xend,yend;

};

其中,x,y存放中心坐標;xstart,ystart,xend,yend分別存放起終點坐標。

值得注意的是,結(jié)構(gòu)里起終點(xstart,ystart)與(xend,yend)坐標是像素值,不是角度值,這和調(diào)用arc()或ellipse()函數(shù)所用的不一樣。當然中心坐標(x,y)與調(diào)用函數(shù)時所用的是一樣的。

這個函數(shù)的頭文件是graphics.h

返回值:返回最后一次調(diào)用圓或橢圓函數(shù)的相應(yīng)起終點與中心坐標值,并存放在coordsp指向的結(jié)構(gòu)里。

例:下面的程序畫圓心在(100,100)的四分之一圓弧,然后于弧兩端點之間連一直線。

#include<graphics.h>

voidmain()

{

intdriver,mode;

structarcccoordstypearcinfo;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

arc(100,100,0,90,88);

getarccoords(&arcinfo);

line(arcinfo.xstart,arcinfo.ystart,arcinfo.xend,arcinfo.yend);

getch();

restorecrtmode();

}(五)、填充函數(shù)

前面已經(jīng)涉及到了用填充圖樣和填充色填充圖形的問題,如調(diào)用pieslice()畫扇區(qū)就要用填充圖樣與填充色來填充區(qū)域。那么怎樣設(shè)置填充圖樣和填充色呢?我們只要簡單地學(xué)習(xí)并練習(xí)一下就會掌握其方法。下面介紹用于設(shè)置填圖樣與填充色、建立用戶自己的填充圖樣與填充封閉區(qū)域的幾個常用函數(shù)。76.setfillstyle()設(shè)置填充圖樣和顏色函數(shù)

功能:setfillstyle()設(shè)置填充圖樣和顏色函數(shù)

功能:函數(shù)setfillstyle()為各種圖形函數(shù)設(shè)置填充圖樣和顏色。

用法:函數(shù)調(diào)用方式為voidsetfillstyle(intpattern,intcolor);

說明:參數(shù)pattern的值為填充圖樣,它們在頭文件graphics.h中定義,詳見表1-12所示。

參數(shù)color的值是填充色,它必須為當前顯示模式所支持的有效值。

填充圖樣與填充色是獨立的,可以是不同的值。表1-12填充圖樣

-------------------------------------------------------------------

填充圖樣符號名取值說明

-------------------------------------------------------------------

EMPTy_FILL0用背景色填充區(qū)域(空填)

SOLID_FILL1用實填充色填充(實填)

LINE_FILL2----填充

LTSLASH_FILL3///填充

SLASH_FILL4///用粗線填充

BKSLASH_FILL5\\\用粗線填充

LTBKSLASH_FILL6\\\填充

HATCH_FILL7網(wǎng)格線填充

xHATCH_FILL8斜網(wǎng)格線填充

INTEREAVE_FILL9間隔點填充

WIDE_DOT_FILL10大間隔點填充

CLOSE_DOT_FILL11小間隔點填充

USER_FILL12用戶定義圖樣填充

-------------------------------------------------------------------除了EMPTy_FILL,所有填充圖樣都使用當前填充色,填充圖樣USER_FILL只有在用函數(shù)setfillpattern()已經(jīng)建立一個用戶定義的填充圖樣后才能使用。

此函數(shù)對應(yīng)的頭文件為graphics.h

返回值:無

例:下面的程序用HATCH_FILL填充一個矩形:

#include<graphics.h>

voidmain()

{

intdriver,mode;

driver=DETECT;

mode=0;

initgraph(&driver,mode,"");

setcolor(GREEN);

rectangle(80,200,200,300)

setfillstyle(HATCH_FILL,RED);

floodfill(160,240,GREEN);

getch();

restorecrtmode();

}77.setfillpattern()設(shè)置用戶圖樣函數(shù)

功能:函數(shù)setfillpattern()設(shè)置用戶的填充圖樣以供fllodfill(),fillpoly()填充函數(shù)等使用。

用法:此函數(shù)調(diào)用方式為voidsetfillpattern(char*pattern,intcolor);

說明:參數(shù)color設(shè)置填充圖樣的顏色。參數(shù)pattern指向一字符數(shù)組,該數(shù)組至少8個字節(jié)長,它定義了一個8像素*8像素的用戶填充圖樣。例如:

chardiamond[8]={0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x00};

diamond為8個字節(jié)的數(shù)組,每個字節(jié)對應(yīng)于填充圖樣中的8個像素,字節(jié)中的1位,畫出一個由color設(shè)定顏色的像素,字節(jié)中的0位則不畫。實際上,diamond數(shù)組定義了一個7*7的小鉆石圖樣,右邊和底部都留有一個像素的邊緣。

調(diào)用setfillpattern()設(shè)置用戶填充圖樣后,必須調(diào)用setfilstyle()函數(shù),使USER_FILL值成為當前填充圖樣。

這個函數(shù)對應(yīng)的頭文件為graphics.h

返回值:無

例:建立一個用戶填充圖樣,并用它填充一個矩形:

#include<graphics.h>

voidmain()

{

intdriver,mode;

staticcharp[8]={10,20,30,40,50,60,70,80};

driver=DETECT;

mode=0;

initgraph(&driver,mode,"");

setcolor(GREEN);

rectangle(80,200,220,300);

setfillpattern(p.RED);

floodfill(160,260,GREEN);

getch();

restorecrtmode();

}78.floodfill()填充閉域函數(shù)

功能:函數(shù)floodfill()用當前填充圖樣和填充色填充一個由特定邊界顏色(通常是當前繪圖色)定義的有界封閉區(qū)域。

用法:該函數(shù)調(diào)用方式為voidfloodfill(intx,inty,intbordercolor);

說明:這里參數(shù)(x,y)為指定填充區(qū)域中的某點,如果點(x,y)在該填充區(qū)域之外,那么外部區(qū)域?qū)⒈惶畛洌軋D形視口邊界的限制。如果直線定義的區(qū)域出現(xiàn)間斷,那么將導(dǎo)致泄漏,即使很小的間斷,也將導(dǎo)致泄漏。也就是說,間斷將引起區(qū)域外被填充。

參數(shù)bordercolor為閉區(qū)域邊界顏色,若可能的話,建議盡量用下面函數(shù)fillpoly()代替floodfill(),以便和將來的版本保持兼容。

如果出錯,graphresult()函數(shù)將返回錯誤代碼-7(flood填充內(nèi)存不足)。

此函數(shù)對應(yīng)的頭文件為graphics.h

返回值:無

例:用floodfill()函數(shù)填充一個具有交叉陰影線的品紅色橢圓:

#include<graphics.h>

voidmain()

{

intdriver,mode;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

ellipse(188,88,0,360,100,60);

setfillstyle(cHATCH_FILL,MAGENTA);

floodfill(188,88,WHITE);

getch();

restorecrtmode();

}79.fillpoly()填充多邊形函數(shù)

功能:函數(shù)fillpoly()用當前繪圖色、線型及線寬畫出給定點的多邊形,然后用當前填充圖樣和填充色填充這個多邊形。

用法:此函數(shù)調(diào)用方式為voidfillpoly(intpointnum,int*points);

說明:fillpoly()的調(diào)用形式與drawpoly()的一樣,其參數(shù)含義相同。該函數(shù)中pointnum為所填充多邊形的頂點數(shù),points指向存放所有頂點坐標的整型數(shù)組。有時頂點數(shù)目是通過過計算sizeof(整型數(shù)組)除以兩倍的sizeof(int)然后得到的,之所以除以兩倍的sizeof(int)是因為每個頂點需要兩個整型坐標。

注意,fillpoly()是通過連接起點和終點將圖形封閉起來,然后填充被包圍的區(qū)域。與floodfill()不同的是,fillpoly()所用的填充方法不依靠邊界連續(xù)的輪廓來確定填充區(qū)域。這樣間斷的線型是允許的,并且可以很簡單地填充多邊形確定的區(qū)域,包括在新的邊界范圍內(nèi)任何其它圖形上重畫。如果出錯,graphresult()函數(shù)將返回錯誤代碼-6(Scan填充內(nèi)存不足)。

這個函數(shù)對應(yīng)的頭文件為graphics.h

返回值:無

例:用紅色間隔點填充一個正方形:

#include<graphics.h>

voidmain()

{

intdriver,mode;

staticintpoints[]={100,100,100,200,200,200,100,100};

driver=DETECT

mode=0;

initgraph(&driver,mode,"");

setfillstyle(INTERLEAVE_FILL,RED);

fillpoly(4,points);

getch();

restorecrtmode();

}80.getfillsettings()獲取填充設(shè)置函數(shù)

功能:函數(shù)getfillsettings()將當前填充圖樣值(符號名或等價值)和填充顏色值(符號名或等價值)填入fillsettingstyle型結(jié)構(gòu)里,從而從該結(jié)構(gòu)中獲得當前填充設(shè)置(填充圖樣和填充色)。

用法:這個函數(shù)調(diào)用方式為voidgetfillsettings(structfillsettingstype*info);

說明:函數(shù)里fillsettingstype型結(jié)構(gòu)定義如下:

structfillsettingstype{

intpattern;

intcolor;

};

注意,結(jié)構(gòu)中變量pattern只用于存取一個預(yù)先定義的填充圖樣值,而不是填充圖樣元素,填充圖樣及等價值在前面表1-12中已經(jīng)列出。結(jié)構(gòu)變量color用來存儲填充顏色值,它是當前顯示模式的有效顏色值之一。

getfillsettings()函數(shù)相應(yīng)的頭文件是graphics.h

返回值:返回當前填充圖樣和填充色的值,并裝入info指向的結(jié)構(gòu)里。

例:下面的程序把當前填充圖樣和填充色的值寫入fillinfo結(jié)構(gòu)中:

structfillsettingstypefillinfo;

getfillsettings(&fillinfo);81.getfillpattern()獲取用戶圖樣設(shè)置函數(shù)

功能:函數(shù)getfillpattern()返回上一次調(diào)用setfillpattern()設(shè)置的用戶定義的填充圖樣。

用法:此函數(shù)調(diào)用方式為voidgetfillpattern(char*pattern);

說明:函數(shù)一旦調(diào)用,就會把定義當前用戶填充圖樣的8個字節(jié)填入pattern所指向的數(shù)組,該數(shù)組必須至少8字節(jié)長,用戶圖樣以8個8位字節(jié)的模式排列,如果還沒有調(diào)用setfillpattern()設(shè)置用戶定義的填充圖樣,那么函數(shù)將填入數(shù)組元素的值全為0xff。

getfillpattern()函數(shù)對應(yīng)的頭文件為graphics.h

返回值:返回用戶定義填充圖樣的8個字節(jié)數(shù)據(jù)(注意不是填充圖樣元素),并存放在pattern指向的數(shù)組里。

例:顯示組成當前用戶填充圖樣的各字節(jié)內(nèi)容:

#include<graphics.h>

voidmain()

{

intdriver,mode;

charfp[8];

inti;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

getfillpattern(fp);

for(i=0;i<8;i++)printf("%d",fp[i]);

getch();

restorecrtmode();

}

(六)、圖像函數(shù)

圖像復(fù)制、擦除以及一般對屏幕圖像的操作,這對應(yīng)用程序是非常有用的,對動畫制作是必不可少的。BC提供了以下幾個圖像操作函數(shù)。82.imagesize()圖像存儲大小函數(shù)

功能:函數(shù)imagsize()返回存儲一塊屏幕圖像所需的內(nèi)存大小(即字節(jié)數(shù))。

用法:此函數(shù)調(diào)用方式為unsignedimagsize(intleft,inttop,intright,intbottom);

說明:參數(shù)(left,top)為所定義的一塊圖像屏幕左上角,(right,bottom)為其右下角。

函數(shù)調(diào)用執(zhí)行后,返回存儲該塊屏幕所需要的字節(jié)數(shù)。如果所需要字節(jié)數(shù)大于64KB,那么將返回-1。imagesize()函數(shù)一般與下面getimage()函數(shù)聯(lián)用。

這個函數(shù)對應(yīng)的頭文件為graphics.h

返回值:返回一塊圖像屏幕存儲所需的字節(jié)數(shù),如果大于64KB,則返回-1。

例:確定左上角(10,10)與右下角(100,100)所定義的屏幕圖像所需的字節(jié)數(shù):

unsignedsize;

size=imagesize(10,10,100,100);83.getimage()保存圖像函數(shù)

功能:函數(shù)getimage()保存左上角與右下角所定義的屏幕上像素圖形到指定的內(nèi)存區(qū)域。

用法:該函數(shù)調(diào)用方式為voidgetimage(intleft,inttop,intright,intbottom,void*buf);

說明:函數(shù)中參數(shù)(left,top)為要保存的圖像屏幕的左上角,(right,bottom)為其右下角,buf指向保存圖像的內(nèi)存地址。調(diào)用getimage()保存屏幕圖像,可用imagesize()函數(shù)確定保存圖像所需字節(jié)數(shù),再用malloc()函數(shù)分配存儲圖像的內(nèi)存(內(nèi)存分配必須小于64KB),還可以用下面函數(shù)putimage()輸出getimage()保存的屏幕圖像。

這個函數(shù)對應(yīng)的頭文件為graphics.h

返回值:無

例:把帶有兩對角線的矩形拷貝到屏幕其它位置上:

#include<garphics.h>

#include<stdlib.h>

#include<conio.h>

voidmain()

{

intdriver,mode;

unsignedsize;

void*buf;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"");

sector(15);

rectangle(20,20,200,200);

setcolor(RED);

line(20,20,200,200);

setcolor(GREEN);

line(20,200,200,20);

getch();

size=imagesize(20,20,200,200);

if(size!=-1){

buf=malloc(size);

if(buf){

getimage(20,20,200,200,buf);

putimage(100,100,buf,COPy_PUT);

putimage(300,50,buf,COPy_PUT);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論