版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保理企業(yè)員工培訓(xùn)制度
- 會計事務(wù)所人力資源制度
- 企業(yè)有關(guān)離職的制度
- 深度學(xué)習(xí)算法解析
- 無障礙網(wǎng)頁設(shè)計要點解讀
- 義務(wù)教育階段學(xué)生請假制度
- XX中學(xué)2026年春季學(xué)期初一年級數(shù)學(xué)教學(xué)計劃(分層教學(xué))
- 2026年春季學(xué)期開學(xué)初校園防暴恐應(yīng)急演練方案
- 職業(yè)噪聲聾助聽器適配效果隨訪
- 電阻元件生產(chǎn)與精度控制手冊
- 2025年急診科面試常見問題及答案
- 北師大版初中九年級下冊數(shù)學(xué)3.2圓的對稱性課件
- 建筑起重司索信號工安全操作規(guī)程
- 青光眼病人的健康宣教
- 2024-2025學(xué)年天津市河西區(qū)七年級下英語期中考試題(含答案和音頻)
- 商業(yè)地產(chǎn)運營管理手冊
- 哈鐵面試試題及答案
- 質(zhì)量小品完整版本
- 《家禽的主要傳染病》課件
- 試用期員工轉(zhuǎn)正申請書(匯編15篇)
- DB22-T5026-2019雙靜壓管樁技術(shù)標準
評論
0/150
提交評論