I. Một số lưu ý chung: * Yêu cầu tối thiểu phải có tập tin EGAVGABGI (Thông thường các tập tin hỗ trợ đồ họa nằm trong thư mục BGI). * Không nên dùng cá hàm liên quan đến màng hình trong chế độ văn bản như printf, cont, scantf, cin... trong khi dùng chế độ đồ họa. * Khi cần tham khảo cú pháp,cách sử dụng của bất kì một hàm đồ hoạ nào, ta đưa con trỏ về tên hàm trong chương trình sau đó nhấn tổ hợp phím CTRL + FI khi đó máy sẽ hiện...
Trang 1H NG D N S D NG TH VI N H A TRONG C/C++
I M t s l u ý chung:
Yêu c u t i thi u ph i có t p tin EGAVGA.BGI (Thông th ng các t p tin h
tr h a n m trong th m c BGI).
Không nên dùng các hàm liên quan n màn hình trong ch v n b n nh
printf, cout, scanf, cin, trong khi dùng ch h a.
Khi c n tham kh o cú pháp, cách s d ng c a b t k m t hàm h a nào, ta
a con tr v tên hàm trong ch ng trình sau ó nh t h p phím CTRL+F1
khi ó máy s hi n c u trúc c a hàm c n tham kh o.
Mu n tham kh o danh sách toàn b hàm c a th vi n h a, ta nh n t h p
phím CTRL+F1 ngay t i dòng ch graphics.h
II Các hàm kh i t o và óng ch h a
1 void initgraph(int &gdriver,int &gmode,String path); Hàm này có tác d ng kh i t o ch h a trong C/C++
Trong ó:
gmode : Không c n ph i kh i t o giá tr ban u
path : ng d n t i th m c ch a các t p tin h tr h a
gdriver: Là các giá tr t 0 n 10
H ng tr Giá tr DETECT 0 (Ng m nh máy t tìm ph n c ng thích h p)
EGAMONO 5 IBM8514 6 HERCMONO 7
2 int graphresult():
Tr v mã l i c a thao tác kh i t o h a ( sau khi s d ng hàm initgraph)
- N u kh i t o thành công thì tr v giá tr là 0 (ho c grOk ).
- N u không thành công thì tr v giá tr khác 0
3 void closegraph():
óng ch h a, tr v ch v n b n bình th ng.
Trang 2Ví d 1: Vi t ch ng trình xây d ng hàm kh i t o h a và v m t ng tròn ra màn hình.
#include <graphics.h> //th vi n ch a các hàm h a
#include <stdlib.h>
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
int main(void)
{
/* Kh i t o các gái tr ban u */
int gdriver = DETECT, gmode, errorcode;
/* Kh i t o ch h a */
initgraph(&gdriver, &gmode, "c:\\bc5\\BGI");
/* L y k t qu c a thao tác kh i t o */
errorcode = graphresult();
if (errorcode != grOk) /* Thao tác kh i t o g p l i */
{
cout<<"Khong khoi tao duoc che do do hoa!!!!";
getch(); // D ng l i ch n phím b t k
exit(1); // Thoát kh i ch ng trình
}
/* Thao tác các l nh h a t i v trí này */
/* V m t ng tròn */
circle(200, 250,200); //v ng tròn có t a tâm là (200,250)và bán kính r= 200
getch(); //d ng l i xem
closegraph(); // óng ch h a
return 0; //Thoát kh i hàm main()
}
III H th ng t a
M t i m nh khi hi n th trên màn hình u c xác inh qua hai thu c tính:
- T a c a i m ó (t a c xác nh c p s nguyên (x,y))
- Màu s c c a i m ó
1 int getx()
int gety()
Các hàm trên tr v t a x, y c a con tr
Trang 32 int getmaxx()
Tr v chi u r ng t i a c a màn hình (tính b ng s pixel- i m nh)
3 int getmaxy()
Tr v chi u cao t i a c a màn hình (tính b ng s pixel- i m nh)
Hình 1: Mô ph ng t a màn hình
4 void cleardevice()
Xóa toàn b màn hình h a b ng màu n n và a con tr v v trí (0,0) c a màn hình
Ví d 2: Vi t ch ng trình v m t ng tròn có tâm (150,200) và bán kính là 100 sau ó xóa hình này và v l i ng tròn khác có tâm là chính gi a màn hình và có bán kính là n a chi u cao màn hình.
#include <graphics.h> //th vi n ch a các hàm h a
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main(void)
{
/* Kh i t o các gái tr ban u */
int gdriver = DETECT, gmode, errorcode;
/* Kh i t o ch h a */
initgraph(&gdriver, &gmode, "C:\\bc5\\BGI");
/* L y k t qu c a thao tác kh i t o */
errorcode = graphresult();
if (errorcode != grOk) /* Thao tác kh i t o g p l i */
{
cout<<"Khong khoi tao duoc che do do hoa!!!!";
getch(); // D ng l i ch n phím b t k
exit(1); // Thoát kh i ch ng trình
getmaxx()
getmaxy()
(0,0)
Trang 4/* V m t ng tròn có t a tâm là (200,250) và bán kính r= 200*/
circle(150, 200,100);
getch(); //d ng l i xem
cleardevice(); //Xóa màn hình tr c ó
/* L y t a chính gi a c a màn hình */
int maxx,maxy,x,y,r;
maxx = getmaxx(); //L y chi u r ng l n nh t c a màn hình
maxy = getmaxy(); //L y chi u cao l n nh t c a màn hình
x = maxx/2; //L y i m chính gi a màn hình theo x
y = maxy/2; //L y i m chính gi a màn hình theo y
/*V ng tròn m i có t a chính gi a màn hình và bán r */
circle(x,y,r);
getch();
closegraph(); // óng ch h a
return 0; //Thoát kh i hàm main()
}
IV V i m, ng, vùng:
1 void putpixel(x, y, color)
Hi n th ra màn hình m t i m nh có màu s c là color , t i t a ( x,y )
Trong ó:
x,y: là các s nguyên không âm
color: có giá tr t 0 n 15
B ng giá tr c a color nh sau:
Trang 5LIGHTRED 12
Ví d : V m t i m nh có màu ra màn hình t i t a ( 20,15 )
putpixel( 20 , 15 , RED );
Ho c: putpixel( 20 , 15 , 4 );
2 int getpixel(x,y)
Tr v màu c a i m nh t i v trí có t a là (x,y)
ví d 3 : Vi t ch ng trình v th c a hàm s b t k
#include <dos.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
//T l phóng to
#define TL 50
void main()
{ int i;
int gr_drive = 0, gr_mode; //Kh i t o ch h a
initgraph(&gr_drive, &gr_mode, "C:\\BC5\\BGI");
setcolor(7); //V h tr c t a
line(0,getmaxy()/2,getmaxx(),getmaxy()/2);
line(getmaxx()/2,0,getmaxx()/2,getmaxy());
outtextxy(325,230,"0");
for(int i=320%TL;i<640;i+=TL)
circle(i,239,1);
for(i=240%TL;i<480;i+=TL)
circle(319,i,1);
setviewport(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy(),0);
for(float x=-255;x<255;x+=0.001) //V th Hàm s
{
//************************
float y=x*x*x-2*x+1; //Hàm s c n v
//************************
int X=TL*x,Y=-TL*(y);
putpixel(X,Y,2);
Trang 6getch();
closegraph(); // óng ch h a
}
3 void moveto(x, y)
Di chuy n v trí con tr t i i m có t a (x,y)
4 void line(x1, y1, x2,y2)
V ng th ng có t a i m u là (x1,y1) và t a i m cu i là (x2,y2)
5 void rectangle(x1,y1,x2,y2)
V hình ch nh t có t a góc trên bên trái là (x1,y1) và t a góc d i bên ph i là (x2,y2)
6 void circle(x, y, r)
V ng tròn có t a tâm là (x,y) và bán kính là r
ví d 4:
1 V ng th ng có t a i m u là (30,30) và t a i m cu i là (150,200)
2 V hình ch nh t có t a góc trên bên trái là (30,30) và góc d i bên ph i là (150,200)
3 V ng tròn có t a tâm là (90,121) và có bán kính là 90
line(30,30);
rectangle(30,30,150,200);
circle(90,121,90);
7 void drawpoly(n, poly);
V m t a giác có s nh là n, t a các nh ch a trong m ng poly.
Chú ý: T a c a i m u và i m cu i ph i trùng nhau
Ví d 6 : V a giác có 4 nh và t a các nh l n l t là:
(1,2), (9,10),(50,30),(1,1)
int poly[8];
poly[0]= 1; poly[1]= 2;
poly[2]= 9; poly[3]= 10;
poly[4]= 50; poly[5]= 30;
poly[6]= poly[0];
poly[8]= poly[1];
drawpoly(4,poly);
Trang 78 void ellipse(x, y, loaibo, Do, BtrucLonx, Btrucnhoy)
V ng elip t a tâm là (x,y), có bán tr c l n là BtrucLonx, bán tr c nh là
Btrucnhoy Vi c v Elíp ph thu c vào giá tr c a bi n Do
- N u Do = 90 thì ch v cung ph n t th I c a Elip
- N u Do = 180 thì ch v cung ph n t th I và II c a Elíp
- N u Do = 360 thì v toàn b Elíp
Bi n loaibo có ch c n ng ng c l i hòan toàn v i bi n Do (xóa)
t c là:
- N u loaibo = 0 cho hi n th h t ph n v Elíp (không xóa)
- N u loaibo = 90 thì cung ph n t th I c a Elip không c hi n th (xóa i cung ph n t th I)
- N u loaibo = 180 thì cung ph n t th I và II không c hi n th
Chú ý: N u giá tr c a BtrucLonx = Btrucnhoy thì tr thành v ng tròn có bán kính là BtrucLonx
Ví d 7 : V hình Elip có t a tâm là (150,140), bán tr c l n là 100 , bán tr c nh là
60
ellipse(150, 140, 0, 360, 100 , 60 );
9 void setcolor(color)
t màu v cho vi c v các ng, hình,
color là màu c n t
10 int getcolor()
Tr v màu v hi n hành
11.void setbkcolor(color)
t màu n n cho màn hình h a, color là màu c n t
12 int getbkcolor()
Tr v màu n n c a màn hình h a
Ví d 8 : Vi t ch ng trình th c hi n các công vi c sau:
- t n n màn hình là màu xanh da tr i
- V ng tròn có tâm là (200,220) bán kính 90 và có màu là màu tr ng
- V hình ch nh t có t a góc trên bên trái là (10,20) và t a c a góc d i bên
ph i là (100, 110) và có màu là màu vàng
V hình Elip có t a tâm là (150,140), bán tr c l n là 100 , bán tr c nh là 60 và có màu là màu
#include <graphics.h> //th vi n ch a các hàm h a
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
Trang 8int main(void)
{
/* Kh i t o các gái tr ban u */
int gdriver = DETECT, gmode, errorcode;
/* Kh i t o ch h a */
initgraph(&gdriver, &gmode, "BGI");
errorcode = graphresult();
if (errorcode != grOk) /* Thao tác kh i t o g p l i */
{
cout"Khong khoi tao duoc che do do hoa!!!!";
getch(); // D ng l i ch n phím b t k
exit(1); // Thoát kh i ch ng trình
}
/* t màu n n là màu xanh da tr i*/
setbkcolor(BLUE);
/* t màu v cho ng tròn là màu tr ng */
setcolor(WHITE);
/* V ng tròn */
circle(100, 120,90);
/* t màu v cho hình ch nh t là màu tr ng */
setcolor(YELLOW);
/* V hình ch nh t */
rectangle(10,20,100,110);
/* t màu v cho hình elip là màu */
setcolor(RED);
/* V hình Elip*/
ellipse(150, 140, 0, 360, 100 , 60 );
getch(); // Ch n 1 phím b t k
closegraph(); // óng ch h a
return 0; //Thoát kh i hàm main()
}
Trang 9V Tô màu vùng
1.void setfillstyle(parten, color);
Thi t l p m u parten tô và m u tô color
trong óparten có các giá tr sau:
EMPTY_FILL 0 SOLID_FILL 1 LINE_FILL 2 LTSLASH_FILL 3 SLASH_FILL 4 BKSLASH_FILL 5 LTBKSLASH_FILL 6 HATCH_FILL 7 XHATCH_FILL 8 INTERLEAVE_FILL 9 WIDE_DOT_FILL 10 CLOSE_DOT_FILL 11 USER_FILL 12
2 floodfill(x,y, color);
Tô m t vùng khép kín v i màu s c và m u tô ã c thi t l p b i l nh floodfill
Trong ó: x,y là t a c a m t i m n m trong vùng c n tô.
color là màu c a ng biên vùng c n tô
Ví d 9: Vi t ch ng trình v ng tròn tâm có t a là (250,200), bán kính là 100
có màu là tr ng Tô hình tròn ó v i màu
#include <graphics.h> //th vi n ch a các hàm h a
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
int main(void)
{
/* Kh i t o các gái tr ban u */
int gdriver = DETECT, gmode, errorcode;
/* Kh i t o ch h a */
initgraph(&gdriver, &gmode, "BGI");
errorcode = graphresult();
if (errorcode != grOk) /* Thao tác kh i t o g p l i */
{
cout<<"Khong khoi tao duoc che do do hoa!!!!";
getch(); // D ng l i ch n phím b t k
Trang 10exit(1); // Thoát kh i ch ng trình
}
/* Thi t l p màu v cho ng tròn */
setcolor(WHITE);
circle(250,200,100);
getch();
//Thi t l p màu tô và m u tô setfillstyle(1, RED);
//Tô hình tròn floodfill(250,200,WHITE);
getch();
closegraph(); // óng ch h a
return 0; //Thoát kh i hàm main()
}
VI Các hàm v ch
1 void outtextxy(x, y, St);
Hi n th chu i ký t St ra màn hình t i v trí có t a (x,y)
2 void far settextstyle(font, direction, size)
Thi t l p Font (font), h ng (direction)và l n (size) c a ch chocho vi c hi n th chu i
kí t c a hàm outtextxy.
Trong ó:
font : 0,1,2,3,4
direction : 0 Hi n th ch ngang
1 Hi n th ch d c size : l n c a ch
Ch ngang
3 void settextjustify(horiz, vert);
Thi t l p ch canh ch nh l cho vi c hi n th chu i ký t c a hàm outtext, outtextxy.
Trang 11horiz LEFT_TEXT 0 Canh l t trái sang ph i
CENTER_TEXT 1 canh l gi a RIGHT_TEXT 2 Canh l ph i vert BOTTOM_TEXT 0 Canh l phía d i c a dòng
CENTER_TEXT 1 Canh l gi a dòng TOP_TEXT 2 Canh l phía trên c a dòng
0 Canh l t trái
Canh l phía d i c a dòng
Canh l gi a dòng
" Xin chao cac ban " theo chi u d c
và dòng ch " Chuc moi dieu tot dep"theo chi u ngang
t i i m có t a (150,100)
#include <graphics.h>
#include <stdlib.h>
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
int main(void)
{
int gdriver = DETECT, gmode, errorcode;
char stdoc[40]=" Xin chao cac ban ";
char stngang[40] = " Chuc moi dieu tot dep ";
initgraph(&gdriver, &gmode, "c:\\bc5\\BGI");
errorcode = graphresult();
if (errorcode != grOk)
{
Trang 12getch();
exit(1);
}
// Thi t l p hi n th theo chi u d c
settextstyle(1,1,5);
// a ch ra màn hình
outtextxy(150, 100, stdoc);
getch();
// Thi t l p hi n th theo chi u ngang
settextstyle(1,0,5);
// a ch ra màn hình
outtextxy(150, 100, stngang);
getch();
closegraph();
return 0;
}
VII T o ho t hình
Ý t ng: V i t ng ra màn hinh, d ng l i m t lúc xem sau xóa i t ng
v a v , v l i i t ng t a khác Quá trình trên di n ra xen k v i nhau t o
ra c m giác i t ng ang chuy n ng.
Cách th c hi n
B1 t màu cho i t ng c n v
B2 V i t ng ra màn hình
B3 Ch vài giây
B4 Xóa i v a v b ng cách v l i i t ng ó v i màu là màu n n
B5 Thay i t a c a i t ng r i l p l i t B1
Ví d 11: V ng tròn chuy n ng qua l i trên màn màn hình
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <dos.h>
#define RADIUS 21
void banhxe()
{
double xc = 100, yc;
Trang 13yc = 448 - RADIUS;
int i=1;
while (!kbhit())
{
setcolor(YELLOW); // t màu v cho i t ng
circle(xc, yc, RADIUS);
/* Xóa i t ng v a v */
setcolor(BLACK); // t màu v cho i t ng là màu n n
circle(xc, yc, RADIUS); //V l i i t ng b ng màu n n
xc = xc + i; //Thay i t a c a i t ng
if ((xc+RADIUS >=getmaxx())|| (xc-RADIUS <=0))
i = -i; // i chi u chuy n ng c a bánh xe
}
}
void main()
{
int gr_drive = DETECT, gr_mode;
initgraph(&gr_drive, &gr_mode, "C:\\bc5\\bgi");
line(0, 450, getmaxx(), 450);
line(0, 451, getmaxx(), 451);
banhxe();
getch();
closegraph();
}
Ví d 12: Vi t ch ng trình minh h a bánh xe l a chuy n ng qua l i trên màn hình
/* Ve banh xe lua */
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <dos.h>
/* 1 / sqrt(2) */
#define FCT 0.7071067
/* H s i t sang radian */
#define RADS 0.017453293
Trang 14#define RADIUS 21 //Bán kính bánh xe
void banhxelua()
{
double angle = 45, xc = 100, yc, xl, yl;
yc = 448 - RADIUS;
int i = 2;
while (!kbhit())
{
setcolor(YELLOW); // t màu v cho bánh xe
xl = RADIUS * cos(angle * RADS);
yl = RADIUS * sin(angle * RADS);
circle(xc, yc, RADIUS);
circle(xc + 100, yc, RADIUS);
setcolor(RED); // t màu v cho tr c khu a
line(xc + xl, yc + yl, xc + xl + 100, yc + yl);
line(xc - xl, yc - yl, xc - xl + 100, yc - yl);
/* Xóa các i t ng v a v */
setcolor(BLACK); // t màu n n v các i t ng
circle(xc, yc, RADIUS);
circle(xc + 100, yc, RADIUS);
line(xc + xl, yc + yl, xc + xl + 100, yc + yl);
line(xc - xl, yc - yl, xc - xl + 100, yc - yl);
angle += 1;
xc += i * M_PI * RADIUS / 360; //Thay i t a c a các i t ng
if ((xc+100+RADIUS >=getmaxx()) ||(xc-RADIUS <=0))
i = -i; // i h ng chuy n ng c a bánh xe
}
}
void main()
{
int gr_drive = DETECT, gr_mode;
initgraph(&gr_drive, &gr_mode, "C:\\BC5\\BGI");
line(0, 450, getmaxx(), 450);
line(0, 451, getmaxx(), 451);
banhxelua();
getch();
closegraph();
}