[r]
(1)Chương 8 Đ h aồ ọ
Trong chương s gi i thi u hàm đ v đẽ ệ ể ẽ ường hình c b n nh ả ường trịn, cung elip, hình qu t, đạ ường g yẫ khúc, hình đa giác, đường th ng, đẳ ường ch nh t, hình ch nh t,ữ ậ ữ ậ hình h p ch nh t, Ngồi cịn đ c p t i v n đ ộ ữ ậ ề ậ ấ ề r t lý thúấ khác nh : x lý văn b n hình đ h a, c a s k thu tư ả ọ ổ ỹ ậ t o nh di đ ng Các hàm đ h a đạ ả ộ ọ ược khai báo t pệ graphics.h
§ Khái ni m đ h aệ ồ ọ
Đ hi u k thu t l p trình đ h a, đ u tiên ph i hi u y uể ể ỹ ậ ậ ọ ầ ả ể ế t c b n c a đ h a T trố ả ủ ọ ước đ n ch y u làmế ủ ế vi c v i ki u văn b n Nghĩa hình đệ ể ả ược thi t l p đ hi nế ậ ể ể th 25 dịng, m i dịng có th ch a 80 ký t Trong ki u văn b n,ị ỗ ể ứ ự ể ả ký t hi n th hình đự ể ị ược ph n c ng c a máy PCầ ứ ủ
n đ nh tr c ta không th
ấ ị ướ ể thay đ i đổ ược kích thước, ki uể ch ữ
hình đ h a, ta có th x lý đ n t ng ch m m (pixel)
ở ọ ể ế ấ ể
trên hình v y mu n v b t kỳ th đậ ố ẽ ấ ứ ược S bàiự trí s pixel hình đố ược g i đ phân gi i (resolution).ọ ộ ả Do m i ki u hình đ h a có m t cách x lý đ h a riêng nênỗ ể ọ ộ ọ TURBO C cung c p m t t p tin u n riêng cho t ng ki u đấ ộ ệ ề ể ể h a B ng 8-1 cho th y ki u đ h a t p tin u ả ấ ể ọ ệ ề ể chúng
Ngồi t p có BGI ch a chệ ứ ương trình u n đề ể h a, TURBO C cung c p t p tin đuôi CHR ch a Fontọ ấ ệ ứ ch đ v ki u ch khác hình đ h a Đó cácữ ể ẽ ể ữ ọ t p:ệ
GOTH.CHR LITT.CHR
SANS.CHR TRIP.CHR
B ng 8-1.ả Các t p tin u n đ h a c a TURBO C++ệ ề ể ọ ủ
Tên t p tinệ Ki u hình đ h aể ồ ọ
ATT.BGI ATT & T6300 (400 dòng)
CGA.BGI IBMCGA, MCGA máy tương thích EGAVGA.BGI IBM EGA, VGA máy tương thích HERC.BGI Hercules monochrome máy tương thích IBM8514.BGI IBM 8514 máy tương thích
PC3270.BGI IBM 3270 PC
Màn hình đ h a g m nhi u m nh đồ ọ ề ể ả ượ ắc s p x p cácế đường th ng ngang d c Đi u cho t t c ki uẳ ọ ề ấ ả ể hình đ h a c a máy tính Khác bi t ch y u gi a chúng làồ ọ ủ ệ ủ ế ữ kích thước s m nh Trong ki u CGA (đ phân gi iố ể ả ể ộ ả th p), m nh có kích thấ ể ả ướ ớc l n, chi u ngề ang có 320 m nh,ể ả cịn theo chi u d c có 200 m nh Màn hình VGA có đ phânề ọ ể ả ộ gi i cao h n: m nh nh h n, m i hàng có 640 m nhả ể ả ỏ ỗ ể ả m i c t có 480 m nh Đi m nh nh s mỗ ộ ể ả ể ả ỏ ố ể
nh hình nhi u ch t l ng đ h a cao
ả ề ấ ượ ọ
M i ki u đ h a dùng m t h t a đ riêng H t a đ cho mànỗ ể ọ ộ ệ ọ ộ ệ ọ ộ hình VGA 640 x 480 nh sau :ư
(0,0) (639,0)
(2)
(0,479) (639,479) Hình 8.1. H t a đ VGAệ ọ ộ
Nh h t a đ này, ta có th tác đ ng hay tham chi u đ n b tờ ệ ọ ộ ể ộ ế ế ấ kỳ m nh hình đ h a.ể ả ọ
N u dùng hình CGA góc dế ưới ph i có t a đ (319,ả ọ ộ 199) Đ c l p v i ki u đ h a s d ng, hàm getmaxx vàộ ậ ể ọ ụ getmaxy bao gi cho t a đ x y l n nh t ki u đờ ọ ộ ấ ể h a dùng.ọ
M t chộ ương trình đ h a thồ ọ ường g m ph n sau:ồ ầ - Kh i đ ng h th ng đ h a.ở ộ ệ ố ọ
- Xác đ nh m u n n (m u hình), m u đị ầ ề ầ ầ ường v , m u tô vàẽ ầ ki u (m u) tô.ể ẫ
- V , tô m u hình mà ta mong mu n.ẽ ầ ố
- Các thao tác đ h a khác nh cho hi n dòng ch ọ ệ ữ - Đóng h th ng đ h a đ tr v mode văn b n.ệ ố ọ ể ề ả
§ Kh i đ ng h đ h aở ộ ệ ọ
M c đích c a vi c kh i đ ng h th ng đ h a xác đ nh ụ ủ ệ ộ ệ ố ọ ị thi tế b đ h a (màn hình) m t đ h a s s d ng chị ọ ố ọ ẽ ụ ương trình Đ làm u ta dùng hàm:ể ề
void initgraph(int *graphdriver, int *graphmode,char *driverpath);
trong đó: driverpath đường d n c a th m c ch a t p tinẫ ủ ụ ứ ệ u n đ h a, graphdriver, graphmode cho bi t hình vàề ể ọ ế m t đ h a s s d ng chố ọ ẽ ụ ương trình B ng 8-2 cho th y cácả ấ giá tr kh dĩ c a graphdriver graphmode.ị ả ủ
Ví d 1.ụ Gi s máy tính c a ta có hình EGA, t p tinả ủ ệ đ h a ch a th m c C: \TC, ta có th kh i đ ng hồ ọ ứ ụ ể ộ ệ th ng đ h a nh sau:ố ọ
#include "graphics.h"
main() {
int mh=EGA, mode= EGALO; initgraph(&mh, &mode, "C:\TC");
}
B ng 8-2.ả Các giá tr kh dĩ c a graphdriver, graphmodeị ả ủ
graphdriver graphmode Đ phân gi iộ ả
Detect (0)
CGA (1) CGAC0 (0) 320 x 200
CGAC1 (1) 320 x 200 CGAC2 (2) 320 x 200 CGAC3 (3) 320 x 200 CGAHi (4) 640 x 200
MCGA (2) MCGA0 (0) 320 x 200
MCGA1 (1) 320 x 200 MCGA2 (2) 320 x 200 MCGA3 (3) 320 x 200 MCGAMed (4) 640 x 200 MCGAHi (5) 640 x 480
EGA (3) EGALO (0) 640 x 200
EGAHi (1) 640 x 350 EGA64 (4) EGA64LO (0) 640 x 200 EGA64Hi (1) 640 x 350 EGAMONO (5) EGAMONOHi (0) 640 x 350
VGA (9) VGALO (0) 640 x 200
VGAMED (1) 640 x 350 VGAHI (2) 640 x 480 HERCMONO (7) HERCMONOHI 720 x 348 ATT400 (8) ATT400C0 (0) 320 x 200 ATT400C1 (1) 320 x 200
(3)ATT400C2 (2) 320 x 200 ATT400C3 (3) 320 x 200 ATT400MED (4) 640 x 400 ATT400HI (5) 640 x 400 PC3270 (10) PC3270HI (0) 720 x 350
IBM8514 (6) IBM8514LO (0) 640 x 480, 256 m u ầ
IBM8514HI (1) 1024 x 768, 256 m uầ
Chú ý 1. B ng 8-2 cho tên h ng giá tr c a chúng mà cácả ằ ị ủ bi n graphdriver, graphmode có th nh n Ch ng h n h ngế ể ậ ẳ ằ DETECT có giá tr 0, h ng VGA có giá tr 9, h ng VGALO có giáị ằ ị ằ tr Khi l p trình ta có th dùng tên h ng ho c giá tr tị ậ ể ằ ặ ị ương ngứ c a chúng Ch ng h n phép gán ví d có th vi t theoủ ẳ ụ ể ế m t cách khác tộ ương đương nh sau:ư
mh=3; mode=0;
Chú ý 2. B ng 8.2 cho th y đ phân gi i ph thu c c vào mànả ấ ộ ả ụ ộ ả hình mode Ví d hình EGA n u dùng mode EGALOụ ế đ phân gi i 640 x 200, hàm getmaxx cho giá tr 639, hàmộ ả ị getmaxy cho giá tr 199 N u hình EGA mà dùng modeị ế EGAHI đ phân gi i 640x 350, hàm getmaxx cho giá tr 639,ộ ả ị hàm getmaxy cho giá tr 349.ị
Chú ý 3. N u khơng bi t xác ki u hình s d ngế ế ể ụ ta gán cho bi n graphdriver h ng DETECT hay giá tr Khi đóế ằ ị k t qu c a hàm initgraph s là:ế ả ủ ẽ
- Ki u c a hình s d ng để ủ ụ ược phát hi n, giá tr sệ ị ố c a đủ ược gán cho bi n graphdriver.ế
- Mode đ h a đ phân gi i cao nh t ng v i hình đangồ ọ ộ ả ấ ứ s d ng đử ụ ược phát hi n giá tr s c a đệ ị ố ủ ược gán cho bi n graphmode.ế
Nh v y vi c dùng h ng s DETECT ch ng nh ng có th kh iư ậ ệ ằ ố ẳ ữ ể đ ng độ ược h th ng đ h a c a hình hi n có theo mode cóệ ố ọ ủ ệ
đ phân gi i cao nh t, mà cịn giúp ta xác đ nh xác ki u mànộ ả ấ ị ể hình s d ng.ử ụ
Ví d 2.ụ Chương trình xác đ nh ki u hình sị ể d ng:ụ
#include "graphics.h" #include "stdio.h" main()
{
int mh=0, mode= 0;
initgraph(&mh, &mode, "");
printf("\n Giá tr s c a hình là: %d", mh);ị ố ủ closegraph();
}
N u chế ương trình cho k t qu :ế ả Giá tr s c a hình là: 3ị ố ủ
thì ta có th kh ng đ nh lo i hình dùng EGA.ể ẳ ị
Chú ý 4. N u chu i dùng đ xác đ nh driverpath m t chu iế ỗ ể ị ộ ỗ r ng (nh ví d 2) chỗ ụ ương trình d ch s tìm t p uị ẽ ệ ề n đ h a th m c ch ể ọ ụ ủ
§ L i đ h aỗ ọ
Khi kh i đ ng h th ng đ h a n u máy khơng tìm th y cácở ộ ệ ố ọ ế ấ chương trình u n đ h a s phát sinh l i đ h a vi cề ể ọ ẽ ỗ ọ ệ kh i đ ng coi nh không thành L i đ h a phát sinh dùở ộ ỗ ọ ng hàm đ ho Trong m i trồ ọ ường h p, hàm graphresult cho bi tợ ế có l i hay khơng l i l i B ng 8-3 cho mã l i màỗ ỗ ỗ ả ỗ hàm phát hi n đệ ược Ta có th dùng hàm grapherrormsg v iể mã l i hàm graphresult tr v đ bi t đỗ ả ề ể ế ược l i gì, ví d :ỗ ụ
int maloi;
(4)maloi = graphresult();
printf("\nL i đ h a là: %d", grapherrormsg(maloi));ỗ ọ
B ng 8-3.ả Các mã l i c a Graphresultỗ ủ
H ngằ Trị L i phát hi nỗ ệ
grOk Không có l iỗ
grNoInitGraph -1 Ch a kh i đ ng h đ h aư ộ ệ ọ
grNotDetected -2 Khơng có ph n c ng đ h a ầ ứ ọ
grFileNotFound -3 Khơng tìm th y trình u n đ h aấ ề ể ọ
grInvalidDriver -4 Trình u n không h p lề ể ợ ệ
grNoLoadMem -5 Không đ RAM cho đ h aủ ọ
grNoScanMem -6 Vượt vùng RAM Scan fill grNoFloodMem -7 Vượt vùng RAM flood fill grFontNoFound -8 Khơng tìm th y t p tin Fontấ ậ
grNoFontMem -9 Không đ RAM đ n p Fontủ ể
grInvalidMode -10 Ki u đ h a khơng h p l cho trình u nể ọ ợ ệ ề ể
grError -11 L i đ h a t ng quátỗ ọ ổ
grIOerror -12 L i đ h a vào raỗ ọ
grInvalidFont -13 T p tin Font không h p l ậ ợ ệ
grInvalidFontNum -14 S hi u Font không h p lố ệ ợ ệ
§ M u m uầ ẫ
1 Đ ch n m u n n ta s d ng hàmể ọ ầ ề ử ụ void setbkcolor(int color);
2 Đ ch n m u để ọ ầ ường v ta dùng hàmẽ void setcolor(int color);
3 Đ ch n m u (ki u) tô m u tô ta dùng hàmể ọ ẫ ể ầ void setfillstyle(int pattern, int color);
Trong c trả ường h p color xác đ nh mã c a m u Các giá trợ ị ủ ầ ị kh dĩ c a color cho b ng 8-4, pattern xác đ nh mã c a m uả ủ ả ị ủ ẫ tô (xem b ng 8-5).ả
M u tô m u tô s đẫ ầ ẽ ược s d ng hàm pieslice,ử ụ fillpoly, bar, bar3d floodfill (xem §5 đây)
4 Ch n gi i m uọ ả ầ
Đ thay đ i gi i m u để ổ ả ầ ược đ nh nghĩa b ng 8.4 taị ả dùng hàm
void setpalette(int colornum, int color);
Ví dụ câu l nhệ
setpalette(0, Lightcyan);
bi n m u đ u tiên b ng m u thành xanh l nh t Các m uế ầ ầ ả ầ ầ khác không b nh hị ả ưởng
B ng 8-4.ả Các giá tr kh dĩ c a colorị ả ủ
Tên h ngằ Giá tr sị ố M u hi n thầ ể ị
BLACK Đen
BLUE Xanh da tr iờ
GREEN Xanh
CYAN Xanh lơ
RED Đỏ
MAGENTA Tím
BROWN Nâu
LIHGTGRAY Xám nh tạ
DARKGRAY Xám s mẫ
LIGHTBLUE Xanh da tr i nh tờ
LIGHTGREEN 10 Xanh nh tạ
LIGHTCYAN 11 Xanh l nh tơ
LIGHTRED 12 Đ nh tỏ
LIGHTMAGENTA 13 Tím nh tạ
(5)YELLOW 14 Vàng
WHITE 15 Tr ng ắ
5 Đ nh n gi i m u hi n hành ta dùng hàmể ậ ả ầ ệ void getpalette (struct palettetype *palette); palettetype ki u đ nh nghĩa tr c nh sau:
ở ể ị ướ
#define MAXCOLORS 15 struct palettetype
{
unsigned char size;
unsigned char colors[MAXCOLORS+1]; };
đây: size s l ng m u palette, colors m ng ch a
ở ố ượ ầ ả ứ
m u v i ch s m ng ch y t đ n size - 1ầ ỉ ố ả ế
B ng ả 8-5. Các giá tr kh dĩ c a patternị ả ủ
Tên h ngằ Giá tr sị ố Mô t ki u tôả ể
EMPTY_FILL Tô b ng m u n nằ ầ ề
SOLID_FILL Tô b ng đằ ường nét li nề
LINE_FILL Tô b ng - - -ằ
LTSLASH_FILL Tô b ng ///ằ
SLASH_FILL Tô b ng /// in đ m ằ ậ
BKSLASH_FILL Tô b ng \\\ in đ mằ ậ
LTBKSLASH_FILL Tô b ng \\\ằ
HATCH_FILL Tô b ng đằ ường g ch bóng nh tạ
XHATCH_FILL Tơ b ng đằ ường g ch bóng chạ ữ
th pậ
INTERLEAVE_FILL Tô b ng đằ ường đ t quãngứ
WIDE_DOT_FILL 10 Tô b ng d u ch m th aằ ấ ấ
CLOSE_DOT_FILL 11 Tô b ng d u ch m mauằ ấ ấ
6 Hàm getcolor tr v m u xác đ nh trả ề ầ ị ước b ng hàmằ setcolor
7 Hàm getbkcolor tr v m u xác đ nh trả ề ầ ị ước b ng hàmằ setbkcolor
8 Hàm getmaxcolor tr v mã m u c c đ i thu c gi i m u hi nả ề ầ ự ộ ả ầ ệ có hi u l c Trên 256 K EGA, hàm getmaxcolor cho giáệ ự tr 15.ị
§ V tơ m uẽ ầ
Có th chia để ường hình thành b n nhóm chính:ố - Đường trịn ellipse
- Đường g p khúc hình đa giácấ - Đường th ngẳ
- Hình ch nh tữ ậ
A Đường trịn hình trịn
Nhóm g m cung tròn, đồ ường tròn, cung ellipse hình qu tạ
1 Cung trịn. Đ v m t cung tròn ta dùng hàmể ẽ ộ void arc(int x, int y, int gd, int gc, int r); đây:
ở
(x, y) t a đ c a tâm cung tròn,ọ ộ ủ r bán kính
gd góc đ uầ gc góc cu iố
Chú ý: Trong t t c hàm dấ ả ưới đây, góc tính theo đ cóộ giá tr t đ n 360.ị ế
2 Đường tròn. Đ v m t để ẽ ộ ường tròn ta dùng hàm void circle(int x, int y, int r);
đây:
(6){
static i=1; // L nh th c hi n m t l n d ch ệ ự ệ ộ ầ ị int j;
// Cho nh p nháy b ng cách đ i m u 50 saoấ ằ ổ ầ for (j=1;j<=50;++j)
{
putpixel(xx[i],yy[i],random(getmaxcolor())); ++i;
if (i>1000) i=1; }
}
§ 12 In nh t hình đ hoả ừ ồ ạ
Hàm in_anh s in nh mi n ch nh t (xt, yt, xd,ẽ ả ề ữ ậ yd) c a hình đ ho gi y máy in LQ1070, LQ1170ủ ấ FX1050
void in_anh(int dd,int xt,int yt,int xd,int yd);
Tham s dd đ đ m c a nét in Th c ch t dd s l n in l i.ố ộ ậ ủ ự ấ ố ầ Bình thường chon dd=1 N u mu n in rõ h n ta ch n dd b ng 2ế ố ọ ằ hay
Trong hàm in_anh có dùng hàm tao_mau, mơ t nhả sau:
int tao_mau(int k,int x,int y);
Hàm s dò k ch m m theo chi u d c b t đ u t toẽ ấ ể ề ọ ắ ầ đ (x,y) hình đ bi t xem ch m m tô m u.ộ ể ế ấ ể ầ Hàm s tr v m t giá tr nguyên t o b i bit ( ng v i mẽ ả ề ộ ị ứ ể tô m u) ( ng v i m ch a tô m u).ầ ứ ể ầ
Hàm in_anh s dùng hàm tao_mau đ t mi n ch nh tẽ ể ệ ề ữ ậ (xt,yt,xd,yd) M i l n t s nh n đỗ ầ ệ ẽ ậ ược m t m u ch mộ ẫ ấ m (giá tr nguyên) m u để ị ẫ ược in gi y.ấ
Dưới n i dung c a hàm nói trên.ộ ủ // in nh ả
#include "stdio.h" #include "graphics.h"
int tao_mau(int k,int x,int y);
void in_anh(int dd,int xt,int yt,int xd,int yd); int tao_mau(int k,int x,int y)
{
int c=0,i;
for (i=0;i<k;++i)
if (getpixel(x,y+i)) c =c|(128>>i); return c;
}
void in_anh(int dd,int xt,int yt,int xd,int yd) {
//dd - so lan in lai mot dong char c,ch1;
int scot,m,mm,k,dong,cot,i,j,n1,n2; dong=(yd-yt+1)/6; mm=(yd-yt+1) % 6; cot=xd-xt+1;
for (i=0;i<=dong;++i) {
if (i<dong) m=6; else m=mm; if (m>0)
{
scot=0;
for (j=0;j < cot;++j)
(7)if (tao_mau(m,xt+j,yt+i*6)) scot=j+1; if (scot)
{
n1=scot % 256; n2= scot/256; for (k=0;k<dd;++k)
{
fprintf(stdprn,"%c%c%c%c%c%c",13,27,'*', 0,n1,n2); //LQ for (j=0;j < scot;++j)
{
if (kbhit())//bat phim {
if ((ch1=getch())==0) getch(); if (ch1==27) goto ket;
}
c=tao_mau(m,xt+j,yt+i*6); fprintf(stdprn,"%c",c); }
} }
fprintf(stdprn,"%c%c%c",27,'A',m); fprintf(stdprn,"\n");
} }
ket: fprintf(stdprn,"%c%c",27,'@'); }