1. Trang chủ
  2. » Mẫu Slide

Lập trình hướng đối tượng - Đồ họa

7 7 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

[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,'@'); }

Ngày đăng: 09/03/2021, 05:01

Xem thêm:

w