Giáo trình C++ - Chương 6: Đồ họa trong C

Ch−¬ng 6 : ®å ho¹ trong c  
§1. Kh¸i niÖm chung  
Turbo C cã kho¶ng 100 hµm ®å ho¹ . C¸c hµm nµy ®−îc chia lµm hai kiÓu :  
ꢀLo¹i theo kiÓu v¨n b¶n ( vÝ dô hµm t¹o cöa sæ )  
ꢀLo¹i theo kiÓu ®å ho¹  
§2. Hµm theo kiÓu v¨n b¶n  
C¸c hµm nµy ®−îc dïng víi mµn h×nh ®¬n s¾c hay mµn h×nh ®å ho¹ . Ta ph¶i ®Æt vµo  
®Çu ch−¬ng tr×nh dßng #include <conio.h> .  
1. Cöa sæ : Môc ®Ých cña c¸c hµm ®å ho¹ theo kiÓu v¨n b¶n lµ t¹o ra c¸c cöa sæ . Cöa sæ lµ  
vubgf h×nh ch÷ nhËt trªn mµn h×nh dïng ®Ó giíi h¹n vïng xuÊt d÷ liÖu . NÕu ta so¹n th¶o  
v¨n b¶n trong cöa sæ th× con nh¸y chØ di chuyÓn trong ph¹m vi cña cöa sæ chø kh«ng ph¶i  
toµn bé mµn h×nh . Ta xÐt mét ch−¬ng tr×nh t¹o ra cöa sæ vµ ®iÒn ®Çy vµo ®ã dßng “ Xin  
chao “  
Ch−¬ng tr×nh 6-1 :  
#include <conio.h>  
#include <dos.h>  
#define left 10  
#define top 8  
#define right 52  
#define bot 21  
void main()  
{
int i;  
clrscr();  
window(left,top,right,bot);  
textcolor(RED);  
textbackground(GREEN);  
for (i=0;i<100;i++)  
{
cputs(" Xin chao ");  
delay(100);  
}
gotoxy(15,8);  
cputs("Ket thuc");  
getche();  
}
Trong ch−¬ng tr×nh ta cã hµm :  
window(x1,y1,x2,y2) dïng ®Ó Ên ®Þnh mét cöa sæ cã to¹ ®é gãc trªn tr¸i lµ x1,y1 vµ  
gãc d−íi ph¶i lµ x2,y2  
textcolor(RED) ®Ó Ên ®Þnh mµu ch÷ lµ ®á  
textbackcolor(GREEN) ®Ó Ên ®Þnh mµu nÒn v¨n b¶n lµ xanh l¸ c©y  
gotoxy(x,y) ®Ó di chuyÓn con nh¸y vÒ to¹ ®é x,y  
60  
cputs(string) ®Ó ®Æt chuçi string trong mét cöa sæ . Khi gÆp biªn cña cöa sæ chuçi sÏ  
®−îc xuèng dßng . Mµu trong chÕ ®é ®å ho¹ ®−îc quy ®Þnh nh− sau :  
Sè  
0
1
2
3
Mµu  
BLACK  
BLUE  
GREEN  
CYAN  
RED  
4
5
6
MAGENTA  
BROWN  
7
8
9
10  
11  
12  
13  
14  
15  
LIGHTGRAY  
DARKGRAY  
LIGHTBLUE  
LIGHTGREEN  
LIGHTCYAN  
LIGHTRED  
LIGHTMAGENTA  
YELLOW  
WHITE  
2. Dêi chç v¨n b¶n : Muèn dêi chç mét vïng h×nh ch÷ nhËt cña v¨n b¶n tõ n¬i nµy sang n¬i  
kh¸c ta dïng hµm movetext() . Ta xÐt ch−¬ng tr×nh sau t¹o ra mét cöa sæ , ®iÒn ®Çy cöa sæ  
b»ng mét ®o¹n v¨n b¶n vµ dêi cöa sæ sang vÞ trÝ kh¸c trªn mµn h×nh  
Ch−¬ng tr×nh 6-2 :  
#include <conio.h>  
#include <dos.h>  
#define left 26  
#define top 7  
#define right 65  
#define bot 20  
#define desleft 1  
#define destop 1  
#define numcolor 16  
void main()  
{
int i;  
clrscr();  
window(left,top,right,bot);  
textbackground(GREEN);  
for (i=0;i<100;i++)  
{
textcolor(i%numcolor);  
cputs(" Xin chao ");  
delay(200);  
}
delay(2000);  
movetext(left,top,right,bot,desleft,destop);  
61  
getche();  
}
Hµm movetext(x1,y1,x2,y2,x0,y0) dïng di chuyÓn cöa sæ x1,y1,x2,y2 ®Õn vÞ trÝ míi  
mµ to¹ ®é gãc trªn tr¸i b©y giê lµ x0,y0 .  
3.L−u tr÷ vµ phôc håi mµn h×nh v¨n b¶n : Ta cã thÓ l−u tr÷ mét vïng v¨n b¶n h×nh ch÷  
nhËt trªn mµn h×nh vµ sau ®ã phôc håi l¹i t¹i mét vÞ trÝ nµo ®ã trªn mµn h×nh . Nhê vËy ta cã  
thÓ t¹o mét cöa sæ nhá trªn ®Çu v¨n b¶n hiÖn hµnh . Ta xÐt vÝ dô sau  
Ch−¬ng tr×nh 6-3 :  
#include <conio.h>  
#include <dos.h>  
#define left 1  
#define top 1  
#define right 80  
#define bot 25  
int buf[80][25];  
void main()  
{
int i,x,y;  
clrscr();  
for (i=0;i<300;i++)  
cputs(" Turbo C ");  
getche();  
gettext(left,top,right,bot,buf);  
clrscr();  
getch();  
puttext(left,top,right,bot,buf);  
getch();  
}
Ch−¬ng tr×nh l−u toµn bé mµn h×nh vµo vïng ®Öm cã tªn lµ buf nhí hµm  
gettext(x1,y1,x2,y2,buf) l−u vn trong h×nh ch÷ nhËt x1,y1,x2,y2 vµo biÕn buf . Hµm  
puttext(x1,y1,x2,y2,buf) ®Æt l¹i v¨n b¶n trong h×nh ch÷ nhËt x1,y1,x2,y2 l−u bëi biÕn buf ra  
mµn h×nh .  
3. Mét sè hµm ®å ho¹ v¨n b¶n kh¸c :  
• void clreol(void) : xo¸ ®Õn cuèi dßng  
• int cprintf(const char *format) ®−a kÝ tù ra mét cöa sæ  
• void textattr(int newattr) Ên ®Þnh mµu cïng lóc cho v¨n b¶n vµ nÒn  
• void gettextinfo(struct text_info *r) : ®äc c¸c th«ng tin nh− kiÓu mµn h×nh , vÞ trÝ vµ kÝch  
th−íc cöa sæ , mµu nÒn vµ v¨n b¶n ,vÞ trÝ con nh¸y  
• void normvideo(void) tr¶ l¹i ®é s¸ng cò  
• void insline(void) : chÌn thªm mét dßng  
• void delline(void) xo¸ mét dßng  
• void hightvideo(void) t¨ng ®é s¸ng  
• void lowvideo(void) : gi¶m ®é s¸ng  
• void textmode(int newmode) chuyÓn ®æi gi÷a c¸c kiÓu v¨n b¶n . Hµm dïng c¸c ®èi sè sau  
:
TrÞ  
H»ng  
ý nghÜa  
62  
-1  
0
1
LASTMODE  
BW40  
C40  
KiÓu v¨n b¶n tr−íc ®ã  
§en tr¾ng 40 cét  
Mµu 40 cét  
2
3
BW80  
C80  
§en tr¾ng 80 cét  
Mµu 80 cét  
7
MONO  
§¬n s¾c 80 cét  
§3. C¸c hµm ®å ho¹  
1. Khëi t¹o kiÓu ®å ho¹ : §Ó khëi t¹o ®å ho¹ ta dïng hµm initgraph() ®−îc khai b¸o trong  
graphics.h víi có ph¸p :  
void far initgraph(int *graphdrive , int *graphmode , char *path);  
víi c¸c biÕn graphdrive chøa tr×nh ®iÒu khiÓn ®å ho¹  
graphmode kiÓu ®å ho¹  
path ®−êng dÉn ®Õn th− môc chøa c¸c drive ®å ho¹ . Trong phÇn nµy ta ph¶i  
dïng hai dÊu \\ v× dÊu \ ®· ®−îc dïng cho kÝ tù escape .  
§Ó thuËn tiÖn ta khëi t¹o ®å ho¹ tù ®éng b»ng c¸ch viÕt :  
graphdrive = detect;  
initgraph(graphdrive , graphmode , path);  
Ta cã ch−¬ng tr×nh vÏ ®−êng th¼ng vµ ®−êng trßn nh− sau :  
Ch−¬ng tr×nh 6-4 :  
#include <graphics.h>  
#include <conio.h>  
void main()  
{
int gd,gm;  
gd=DETECT;  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
line(0,0,100,100);  
circle(100,100,50);  
getche();  
closegraph();  
}
2. Lçi ®å ho¹ : §Ó biÕt lçi ®å ho¹ ta dïng hµm int far graphresult(void) . Sau khi biÕt m· lçi  
ta chuyÓn nã sang cho hµm grapherrormsg() . Hµm nµy tr¶ vÒ con trá chØ ®Ðn lçi . Sau ®©y lµ  
ch−¬ng tr×nh minh ho¹  
Ch−¬ng tr×nh 6-5 :  
#include <graphics.h>  
#include <conio.h>  
#include <stdio.h>  
#include <stdlib.h>  
void main()  
{
int gd,gm,ge;  
char *ep;  
gd=DETECT;  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
ge=graphresult();  
63  
if (ge)  
{
printf("Ma loi %d",ge);  
ep=grapherrormsg(ge);  
puts(ep);  
getch();  
exit(1);  
}
line(0,0,100,100);  
circle(100,100,50);  
getche();  
closegraph();  
}
3. §−êng th¼ng vµ mµu s¾c : §Ó thiÕt lËp d¹ng , mÉu vµ bÒ dµy cña ®−êng th¼ng ta dïng  
hµm void far setlinestyle(int style,int pattern, int thickness) . Tham biÕn style cã thÓ lµ :  
TrÞ  
0
H»ng  
SOLID_LINE  
Y nghÜa  
§−êng ®Æc  
1
2
DOTTED_LINE §−êng chÊm  
CENTER_LINE §−êng g¹ch  
3
4
DASHED_LINE §−êng g¹ch dµi  
USERBIT_LINE §−êng tù t¹o  
Tham biÕn thickness cã thÓ nh©n mét trong hai gi¸ trÞ sau :  
TrÞ  
1
2
H»ng  
Y nghÜa  
NORM_WIDTH d·y 1 ®iÓm ¶nh  
THICK_WIDTH d·y 3 ®iÓm ¶nh  
§Ó x¸c ®Þnh mµu cho ®−êng th¼ng ta dïng hµm void setcolor(int color) . Ta cã ch−¬ng tr×nh  
sau  
Ch−¬ng tr×nh 6-6 :  
#include <graphics.h>  
#include <conio.h>  
#include <stdio.h>  
#include <stdlib.h>  
void main()  
{
int gd,gm,ge;  
int x1=0,y1=0;  
int x2=199,y2=199;  
int xc=100,yc=100;  
int r=90;  
char *ep;  
gd=DETECT;  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
ge=graphresult();  
if (ge)  
64  
{
}
printf("Ma loi %d",ge);  
ep=grapherrormsg(ge);  
puts(ep);  
getch();  
exit(1);  
setlinestyle(1,1,1);  
setcolor(LIGHTGREEN);  
line(x1,y1,x2,y2);  
circle(xc,yc,r);  
getche();  
closegraph();  
}
4. Ellipse vµ ®a gi¸c : §Ó vÏ ellipse ta dïng hµm  
void far ellipse(int x,int y , int gd,int gc,int xr , int yr)  
x,y - to¹ ®é t©m ellipse  
gd,gc - gãc b¾t ®Çu vÏ vµ gãc kÕt thóc vÏ  
xr,yr - to¹ ®é t©m ellipse  
Ch−¬ng tr×nh 6-7 : VÏ mét lo¹t ellipse  
#include <graphics.h>  
#include <conio.h>  
#include <stdio.h>  
#include <stdlib.h>  
void main()  
{
int gd,gm,ge;  
int x=150,y=150;  
int g1=0,g2=360;  
int xr=150,yr;  
char *ep;  
gd=DETECT;  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
ge=graphresult();  
if (ge)  
{
printf("Ma loi %d",ge);  
ep=grapherrormsg(ge);  
puts(ep);  
getch();  
exit(1);  
}
setcolor(RED);  
for (yr=0;yr<100;yr+=10)  
ellipse(x,y,g1,g2,xr,yr);  
getche();  
closegraph();  
}
§Ó vÏ ®a gi¸c ta dïng hµm  
65  
void far drawpoly(int number , int far *addrlist)  
number - sè ®Ønh ®a gi¸c céng thªm 1  
addrlist - m¶ng chøa to¹ ®é c¸c ®Ønh , to¹ ®é ®iÓm ®Çu vµ cuèi ph¶i trïng nhau  
Ch−¬ng tr×nh 6-8 : VÏ mét h×nh hép ch÷ nhËt  
#include <graphics.h>  
#include <conio.h>  
#define left 50  
#define top 50  
#define right 150  
#define bot 180  
int a[]={150,50,180,20,180,135,150,180};  
int b[]={50,47,150,47,180,17,95,17,50,47};  
void main()  
{
int gd,gm;  
gd=DETECT;  
clrscr();  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
setcolor(RED);  
rectangle(left,top,right,bot);  
setcolor(2);  
drawpoly(4,a);  
drawpoly(5,b);  
getche();  
closegraph();  
}
5. T« mµu vµ mÉu t« : Turbo C cã nhiÒu hµm ®Ó t« mµu . Hµm th«ng dông nhÊt ®Ó t« bªn  
trong mét ®a gi¸c vµ mÉu t« hiÖn hµnh lµ void far fillpoly(int number , int far * addlist) .  
Mµu vµ mÉu t« ®−îc thiÕt lËp nhê hµm void far setfillstyle(int pattern , int color) . BiÕn  
pattern cã thÓ nhËn mét trong c¸c trÞ sau :  
TrÞ  
0
1
H»ng  
EMPTY_FILL  
SOLID_FILL  
ý nghÜa  
Rçng  
Mµu ®Æc  
2
3
4
5
6
7
8
LINE_FILL  
LTSLASH_FILL  
SLASH_FILL  
BKSLASH_FILL  
LTBKSLASH_FILL  
HATCH_FILL  
XHATCH_FILL  
§−êng ngang  
//// chÐo m¶nh  
//// chÐo dµy  
\\\\ chÐo ng−îc  
\\\\ chÐo ng−îc m¶nh  
Säc d−a th−a  
Säc d−a dµy  
9
INTERLEAVE_FILL §−êng xen kÏ  
10  
11  
12  
WIDE_DOT_FILL  
CLOSE_DOT_FILL  
USER_FILL  
ChÊm th−a  
ChÊm dµy  
MÉu tù do  
66  
BiÕn color ®−îc chän theo danh s¸ch ®· liÖt kª trong phÇn setcolor(). NÕu dïng gi¸ trÞ kh«ng  
hîp lÖ cho pattern vµ color th× hµm graphresult() sÏ tr¶ vÒ m· lçi lµ -11 . Hµm floodfill()  
dïng ®Ó to mµu mét h×nh kÝn . Nã cÇn biÕt ®iÓm b¾t ®Çu t« . Hµm sÏ t« cho ®Õn khi gÆp  
®−êng biªn cã mµu x¸c ®Þnh b»ng biÕn border . Cã thÓ t« bªn trong hay ngoµi h×nh vÏ tuú  
®iÓm b¾t ®Çu . NÕu t« mét vïng kh«ng kÝn th× mµu t« sÏ lan ra trong lÉn ngoµi vËt thÓ . Sau  
®©y lµ ch−¬ng tr×nh t« vßng trßn .  
Ch−¬ng tr×nh 6-9 :  
#include <graphics.h>  
#include <conio.h>  
#define x 200  
#define y 200  
#define r 150  
void main()  
{
int gd,gm;  
gd=DETECT;  
clrscr();  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
setcolor(RED);  
circle(x,y,r);  
setfillstyle(CLOSE_DOT_FILL,BLUE);  
floodfill(x,y,RED);  
getche();  
closegraph();  
}
Mµu dïng ®Ó t« cã thÓ gièng hay kh¸c víi mµu dïng cho ®−êng viÒn cña vïng . Tuy  
vËy mµu dïng cho tham biÕn border cña floodfill() ph¶i gièng mµu vÌ vËt thÓ (trong ch−¬ng  
tr×nh lµ mµu RED)  
6. §å thÞ : Turbo C cã nhiÒu hµm gióp ®¬n gi¶n ho¸ viÖc vÏ ®å thÞ c¸c hµm lµ bar() , bar3d()  
vµ pieslice() .  
void bar (int top , int left , int right , int bottom)  
void far bar3d(int left , int top , int right , int right , int bottom , int depth , int topflag)  
topflag = 0 - cã n¾p , topflag = 1 - kh«ng cã n¾p  
void far pieslice(int x , int y , int startangle , int endangle , int r)  
Ta cã ch−¬ng tr×nh minh ho¹  
Ch−¬ng tr×nh 6-10 :  
#include <graphics.h>  
#include <conio.h>  
#define n 10  
#define bwidth 10  
#define sep 12  
#define di (bwidth+sep)  
#define shft 15  
#define width ((n+1)*di)  
#define left 5  
#define depth 3  
#define topflag 1  
#define bot 170  
67  
#define top 5  
#define ppd (float)(bot-top)/100  
void main()  
{
int gd,gm,i;  
int data[n]={41,47,54,62,63,59,75,83,89,96};  
gd=DETECT;  
clrscr();  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
setcolor(RED);  
rectangle(top,left,left+width,bot);  
for (i=0;i<n;i++)  
{
setfillstyle(SOLID_FILL,1+i%3);  
bar3d(left+shft+i*di,bot-data[i]*ppd,left+shft+i*di+bwidth,bot,depth,topflag);  
}
getche();  
closegraph();  
}
Sau ®©y lµ ch−¬ng tr×nh dïng pieslice()  
Ch−¬ng tr×nh 6-11 :  
#include <graphics.h>  
#include <conio.h>  
#define n 6  
#define r 90  
int data[n]={11,19,44,32,15,7};  
void main()  
{
int gd,gm,i,x,y;  
float datasum,startangle,endangle,relangle;  
gd=DETECT;  
clrscr();  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
x=getmaxx()/2;  
y=getmaxy()/2;  
setcolor(RED);  
for (i=0,datasum=0;i<n;i++)  
datasum+=data[i];  
endangle=0;  
relangle=10;  
for (i=0;i<n;i++)  
{
startangle=(i+1)*relangle;  
setfillstyle(SOLID_FILL,i%4);  
pieslice(x,y,startangle,endangle,r);  
getch();  
}
68  
getche();  
closegraph();  
}
7. Viewport : Viewport lµ mét vïng nh× thÊy ®−îc cña mµn h×nh . Khi míi khëi ®éng  
viewport lµ toµn bé mµn h×nh . §Ó x¸c ®Þnh mét viewport ta dïng hµm setviewport() cã có  
ph¸p :  
void far setviewport(int left , int top , int right , int bot , int clip)  
Tham biÕn clip cho biÕt h×nh vÏ cã hiÖn ra ngoµi viewport hay kh«ng . NÕu clip <>0 th×  
kh«ng thÊy ®−îc h×nh bªn ngoµi viewport . §Ó xo¸ mét viewport ta dïng hµm void far  
clearviewport(void)  
Ch−¬ng tr×nh 6-12 :  
#include <graphics.h>  
#include <conio.h>  
void main()  
{
int gd,gm,i;  
int left=0,top=0,right=150,bot=150;  
int x1=0,y1=0,x2=199,y2=199;  
int x=100,y=100;  
int clip=1;  
int r=90;  
gd=DETECT;  
clrscr();  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
setviewport(left,top,right,bot,clip);  
setcolor(RED);  
rectangle(left,top,right,bot);  
line(x1,y1,x2,y2);  
circle(x,y,r);  
getch();  
closegraph();  
}
8. VÏ theo to¹ ®é t−¬ng ®èi : Trong C ta cã thÓ dïng to¹ ®é t−¬ng ®èi so víi ®iÓm hiÖn  
hµnh CP-current point . §Ó vÏ ®−êng th¼ng ta dïng hµm void far lineto(int x, int y) . Hµm  
nµy vÏ ®−êng th¼ng tõ ®iÓm CP ®Õn ®iÓm míi cã to¹ ®é lµ x,y . Hµm void far linerel(int dx ,  
int dy) vÏ ®−êng th¼ng tõ CP(xc,yc) ®Õn ®iÓm cã to¹ ®é (xc+dx,yc+dy) . Th−êng ta hay kÕt  
hîp víi hµm void far moveto(int x, int y) ®Ó di chuyÓn ®iÓm hiÖn hµnh tíi ®iÓm míi cã to¹  
®é (x,y)  
Ch−¬ng tr×nh 6-13 : VÏ mét bµn cê  
#include <graphics.h>  
#include <conio.h>  
#define max 160  
#define grid 20  
#define size 18  
void main()  
{
int gd,gm,i,j;  
void square(int );  
69  
gd=DETECT;  
clrscr();  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
for (i=0;i<max;i+=grid)  
for (j=0;j<max;j+=grid)  
{
moveto(j,i);  
square(size);  
}
getch();  
closegraph();  
}
void square(int side)  
{
linerel(side,0);  
linerel(0,side);  
linerel(-side,0);  
linerel(0,-side);  
}
9. §iÓm ¶nh : §Ó ®Æt mét ®iÓm ¶nh lªn mµn h×nh ta dïng hµm :  
void far putpixel(int x , in y, int color)  
Ch−¬ng tr×nh 6-14 : LËp ch−¬ng tr×nh vÏ h×nh sin b»ng putpixel  
#include <graphics.h>  
#include <conio.h>  
#include <math.h>  
void main()  
{
int gd,gm,x,y;  
double g,sg;  
gd=DETECT;  
clrscr();  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
line (1,100,200,100);  
for (x=0;x<200;x++)  
{
g=((double)x/200)*(2*3.14159);  
sg=sin(g);  
y=100-100*sg;  
putpixel(x,y,RED);  
}
getch();  
closegraph();  
}
§Ó x¸c ®Þnh mµu cña mét ®iÓm ta dïng hµm int getpixel(int x,int y)  
10 . nh bit vµ lµm ¶nh chuyÓn ®éng : §Ó cÊt g÷i mét h×nh ¶nh vµo bé nhí ta dïng hµm :  
void far getimage(int left , int top , int right , int bot , void far * addbuf)  
70  
left , top , right , bot - c¸c gãc cña h×nh ch÷ nhËt chøa ¶nh  
addbuf - ®Þa chØ bé nhí dïng chøa ¶nh  
Hµm nµy cÇn biÕt kÝch th−íc cña h×nh . KÝch th−íc nµy ®−îc x¸c ®Þnh theo hµm :  
unsigned far imagesize(int left , int top , int right , int bot)  
Gi¸ trÞ cña hµm ®−îc truyÒn cho hµm malloc() ®Ó cÊp ph¸t bé nhí . Con trá do hµm malloc()  
tr¶ vÒ ®−îc truyÒn cho hµm putimage ®Ó kh«i phôc l¹i h×nh ®· cÊt . Có ph¸p cña putimage()  
lµ :  
void far putimage(int left , int top , void far * addbuf,int putop)  
left,top lµ gãc trªn tr¸i cña vïng sÏ ®−a ¶nh ra  
addbuf - ®Þa chØ bé nhí dïng chøa ¶nh  
putop lµ c¸c ®−a ¶nh ra . C¸c h»ng putop lµ :  
TrÞ  
H»ng  
ý nghÜa  
0
1
2
3
5
COPY_PUT  
XOR_PUT  
OR_PUT  
AND_PUT  
NOT_PUT  
Thay h×nh cò b»ng h×nh míi  
XOR h×nh cò b»ng h×nh míi  
OR h×nh cò b»ng h×nh míi  
AND h×nh cò b»ng h×nh míi  
Thay h×nh cò b»ng ®¶o h×nh míi  
Ch−¬ng tr×nh 6-15 : LËp ch−¬ng tr×nh thÓ hiÖn qu¶ bãng déi  
#include <graphics.h>  
#include <conio.h>  
#include <alloc.h>  
#define left 0  
#define top 0  
#define right 639  
#define bottom 479  
#define r 8  
void main()  
{
int gd,gm,x,y;  
int dx,dy,oldx,oldy;  
void far *buf;  
unsigned size;  
gd=DETECT;  
clrscr();  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
rectangle(left,top,right,bottom);  
x=y=r+10;  
setcolor(LIGHTGREEN);  
setfillstyle(SOLID_FILL,LIGHTGREEN);  
circle(x,y,r);  
floodfill(x,y,LIGHTGREEN);  
size=imagesize(x-r,y-r,x+r,y+r);  
buf=malloc(size);  
getimage(x-r,y-r,x+r,y+r,buf);  
dx=1;  
dy=1;  
71  
while (!kbhit())  
{
putimage(x-r,y-r,buf,COPY_PUT);  
delay(5);  
oldx=x;  
oldy=y;  
x=x+dx;  
y=y+dy;  
if (x<=left+r+2||x>=right-r-2)  
dx=-dx;  
if (y<=top+r+1||y>=bottom-r-2)  
dy=-dy;  
putimage(oldx-r,oldy-r,buf,XOR_PUT);  
delay(5);  
}
closegraph();  
}
§4. V¨n b¶n trong ®å ho¹  
1. C¸c fonts : §Ó chän fonts ch÷ ta dïng hµm :  
void far settextstyle(int font , int direction , int charsize)  
C¸c fonts chøa trong c¸c tËp tin trong b¶ng sau  
TrÞ  
0
1
H»ng  
DEFAULT_FONT  
TRIPLEX_FONT  
SMALL_FONT  
TËp tin  
Cµi s½n  
trip.chr  
litt.chr  
2
3
4
5
6
7
8
9
10  
SANSERIF_FONT  
GOTHIC_FONT  
SCRIPT_FONT  
SIMPLEX_FONT  
TRIPLEX_SCR_FONT  
COMPLEX_FONT  
EUROPEAN_FONT  
BOLD_FONT  
sans.chr  
goth.chr  
scrip.chr  
simp.chr  
tscr.chr  
lcom.chr  
euro.chr  
bold.chr  
§èi direction cã thÓ nhËn mét trong hai trÞ :  
0 (HORIZ_DIR) - tõ tr¸i sang ph¶i  
1 (VERT_DIR) - tõ trªn xuèng d−íi  
Khi ®èi charsize cã trÞ lµ 1 , kÝch th−íc ch÷ lµ nhá nhÊt . Khi kÝch th−íc lµ 2 , ch÷ sÏ t¨ng  
gÊp ®«i v.v. §Ó in chuçi ra mµn h×nh trong chÕ ®é ®å ho¹ ta dïng c¸c hµm :  
void far outtext( char far * string);  
void far outtextxy(int x , int y , char far *string);  
Ch−¬ng tr×nh 6-16 : Dïng hµm settextstyle() ®Ó viÕt ch÷  
#include <graphics.h>  
#include <conio.h>  
72  
#define FONTSIZE 4  
void main()  
{
int gd,gm;  
gd=DETECT;  
clrscr();  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
settextstyle(GOTHIC_FONT,HORIZ_DIR,FONTSIZE);  
outtextxy(0,0,"Gothic");  
settextstyle(TRIPLEX_FONT,HORIZ_DIR,FONTSIZE);  
outtextxy(0,40,"Triplex");  
settextstyle(SMALL_FONT,HORIZ_DIR,FONTSIZE);  
outtextxy(0,80,"Small");  
settextstyle(SANS_SERIF_FONT,HORIZ_DIR,FONTSIZE);  
outtextxy(0,100,"Sanserif");  
settextstyle(DEFAULT_FONT,HORIZ_DIR,FONTSIZE);  
outtextxy(0,160,"Default");  
settextstyle(EUROPEAN_FONT,HORIZ_DIR,FONTSIZE);  
outtextxy(0,200,"Euro");  
settextstyle(BOLD_FONT,HORIZ_DIR,FONTSIZE);  
outtextxy(0,240,"Bold");  
settextstyle(COMPLEX_FONT,HORIZ_DIR,FONTSIZE);  
outtextxy(0,300,"Complex");  
settextstyle(SCRIPT_FONT,HORIZ_DIR,FONTSIZE);  
outtextxy(0,340,"Script");  
settextstyle(SIMPLEX_FONT,HORIZ_DIR,FONTSIZE);  
outtextxy(0,370,"Simplex");  
settextstyle(TRIPLEX_SCR_FONT,HORIZ_DIR,FONTSIZE);  
outtextxy(0,420,"Triplex script");  
getch();  
closegraph();  
}
2. Justify vµ ®Þnh kÝch th−íc v¨n b¶n : Hµm ®Þnh vÞ trÝ v¨n b¶n lµ ;  
void far settextjustify(int horiz , int vert);  
§èi horiz nhËn c¸c biÕn trong b¶ng sau  
TrÞ  
H»ng  
LEFT_TEXT  
CENTER_TEXT  
RIGHT_TEXT  
ý nghÜa  
0
1
2
CP n»m bªn tr¸i v¨n b¶n  
CP n»m bªn chÝnh gi÷a v¨n b¶n  
CP n»m bªn ph¶i v¨n b¶n  
§èi vert nhËn mét trong c¸c gi¸ trÞ sau :  
TrÞ  
H»ng  
ý nghÜa  
0
1
2
BOTTOM_TEXT  
CENTER_TEXT  
TOP_TEXT  
CP n»m ë ®¸y v¨n b¶n  
CP n»m bªn chÝnh gi÷a v¨n b¶n  
CP n»m ë ®Ønh v¨n b¶n  
73  
Ch−¬ng tr×nh 6-17 :  
#include <graphics.h>  
#include <conio.h>  
#define cl 150  
#define lead 40  
#define fontsize 3  
void main()  
{
int gd,gm,i;  
gd=DETECT;  
clrscr();  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
settextstyle(TRIPLEX_FONT,HORIZ_DIR,fontsize);  
line(cl,0,cl,200);  
for (i=0;i<lead*5;i+=lead)  
line(0,i,300,i);  
moveto(cl,0);  
outtext("Default");  
moveto(cl,lead);  
settextjustify(LEFT_TEXT,TOP_TEXT);  
outtext("Left-top");  
moveto(cl,lead*2);  
settextjustify(RIGHT_TEXT,TOP_TEXT);  
outtext("Right-top");  
moveto(cl,lead*3);  
settextjustify(CENTER_TEXT,TOP_TEXT);  
outtext("Center-top");  
moveto(cl,lead*4);  
settextjustify(CENTER_TEXT,BOTTOM_TEXT);  
outtext("Center-bottom");  
getch();  
closegraph();  
}
§Ó thay ®æi kÝch th−íc vµ tØ lÖ ch÷ ta dïng hµm :  
void far setusercharsize(int multx , int divx , int multy , int divy);  
multx - nh©n chiÒu réng cña kÝ tù  
divx - chia chiÒu réng cña kÝ tù  
multy - nh©n chiÒu cao cña kÝ tù  
divx - chia chiÒu cao cña kÝ tù  
Ch−¬ng tr×nh 6-18 : T¹o mét ®å thÞ cã ghi chó  
#include <graphics.h>  
#include <conio.h>  
#include <stdlib.h>  
#define n 12  
#define bwidth 20  
#define sep 24  
#define shft 30  
#define left 5  
74  
#define depth 6  
#define topflag 1  
#define bot 300  
#define top 5  
#define ticks 10  
#define twidth 10  
#define maxdata 100  
#define xtitle 40  
#define ytitle 40  
#define font SANS_SERIF_FONT  
#define di (bwidth+sep)  
#define width (((n+1)*di))  
#define pbt ((float)(bot-top))  
#define ppd ((float)(bot-top)/maxdata)  
void main()  
{
int gd,gm,i;  
float a,b,c,d;  
int data[n]={41,47,54,62,63,59,75,83,89,96,55,2};  
char month[12][4]={"Jan","Feb","Mar","Apr","May","Jun","Jul",  
"Aug","Sep","Oct","Nov","Dec"};  
char string[40];  
clrscr();  
gd=DETECT;  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
rectangle(left,top,left+width,bot);  
setusercharsize(4,3,4,3);  
settextstyle(font,HORIZ_DIR,0);  
moveto(xtitle,ytitle);  
outtext("1998 Sales");  
setusercharsize(2,3,2,2);  
settextstyle(font,HORIZ_DIR,0);  
for (i=0;i<ticks;i++)  
{
line(left,bot-i*pbt/10,left+twidth,bot-i*pbt/10);  
line(left+width-twidth,bot-i*pbt/10,left+width,bot-i*pbt/10);  
moveto(left+width+sep,bot-(i+1)*pbt/10);  
itoa(i*(maxdata/ticks),string,10);  
outtext(string);  
}
setusercharsize(2,3,2,2);  
settextstyle(font,VERT_DIR,0);  
for (i=0;i<n;i++)  
{
setfillstyle(SOLID_FILL,i);  
bar3d(left+shft+i*di,bot-data[i]*ppd,left+shft+i*di+bwidth,bot,depth,topflag);  
moveto(left+i*di+bwidth-1,bot+5);  
outtext(month[i]);  
}
75  
getch();  
closegraph();  
}
§5. VÝ dô kÕt thóc  
Ch−¬ng tr×nh 6-19 : LËp ch−¬ng tr×nh vÏ mét mÆt Mallbrot  
#include <graphics.h>  
#include <conio.h>  
#include <stdlib.h>  
#define ymax 400  
#define xmax 400  
#define maxcount 16  
void main()  
{
int gd,gm;  
int x,y,count;  
float xscale,yscale;  
float left,top,xside,yside,zx,zy,cx,cy,tempx;  
clrscr();  
gd=DETECT;  
initgraph(&gd,&gm,"c:\\bc\\bgi");  
left=-2.0;  
top=1.25;  
xside=2.5;  
yside=-2.5;  
xscale=xside/xmax;  
yscale=yside/ymax;  
rectangle(0,0,xmax+1,ymax+1);  
for (y=1;y<=ymax;y++)  
{
for (x=1;x<=xmax;x++)  
{
cx=x*xscale+left;  
cy=y*yscale+top;  
zx=zy=0;  
count=0;  
while((zx*zx+zy*zy<4) && (count<maxcount))  
{
tempx=zx*zx-zy*zy+cx;  
zy=2*zx*zy+cy;  
zx=tempx;  
count++;  
}
putpixel(x,y,count);  
if (kbhit())  
exit(0);  
}
76  
}
getch();  
closegraph();  
}
77  
pdf 18 trang Thùy Anh 15760 Free
Bạn đang xem tài liệu "Giáo trình C++ - Chương 6: Đồ họa trong C", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_c_chuong_6_do_hoa_trong_c.pdf