Giáo trình lập trình nâng cao - Chương 6
lượt xem 24
download
Tài liệu tham khảo Giáo trình lập trình nâng cao trên ngôn ngữ Pascal soạn theo chương trình đã được Bộ giáo dục và đào tạo phê chuẩn - Chương 6 Đồ họa
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Giáo trình lập trình nâng cao - Chương 6
- Chương 6 ð ho ð ho trong Pascal không ph i là công c chuyên dùng ñ thi t k hình nh. Tuy nhiên n u bi t t n d ng các công c s n có trong Unit Graph chúng ta có th làm ñư c nhi u vi c, ñ c bi t là v ñ th các hàm s . Trong chương này b n ñ c ti p c n các khái ni m sau: Các th t c v hình ñơn gi n Các th t c vi t ch trong ch ñ ñ ho Các th t c tô màu Các phương pháp x lý nh Bitmap Phương pháp v ñ th hàm s Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 143
- 1. Khái ni m chung Màn hình máy vi tính có th dùng m t trong hai ch ñ : ch ñ TEXT - hi n th văn b n và ch ñ GRAPHIC - hi n th ñ ho . Trong ch ñ TEXT màn hình thư ng ñư c chia thành 25 dòng và 80 c t, n u vi t kín màn hình ta có th vi t ñư c 2000 ký t . Chúng ta có th thay ñ i ñ phân gi i ñ vi t ra 25 dòng x 40 c t, 50 dòng x 80 c t ho c 132 dòng x 43 c t. Mu n v hình, tô màu các hình ta ph i chuy n sang ch ñ ñ ho , trong ch ñ này màn hình ñư c xem là m t ma tr n ñi m, tuỳ thu c ñ phân gi i ta có th có ma tr n 640x480 ñi m ho c 1024x720 ñi m.... M i ñi m trên màn hình ñư c g i là 1 Pixel t c là m t ph n t nh ( Picture Element ), ta có th hoàn toàn ch ñ ng trong vi c thay ñ i màu s c c a t ng ñi m ñ t o ra m t b c tranh theo ý mu n. V trí c a m i ñi m trên màn hình ñư c bi u di n b i hai to ñ : Hoành ñ và Tung ñ . G c to ñ (0,0) là ñi m góc trên bên trái màn hình. Như ñã nêu trong chương 1 ph n cài ñ t Pascal, mu n chuy n sang làm vi c ch ñ ñ ho , trong thư m c hi n hành (thư m c ch a chương trình Pascal) ph i có các t p GRAPH.TPU, *.BGI và *.CHR. L i g i ñơn v chương trình ñ ho ph i ñ t ñ u chương trình ngay sau t khoá PROGRAM như ví d 6.1. Ví d 6.1 Program Ve_hinh; Uses GRAPH; ....... Trong ph n thân chương trình c n ph i ñưa vào các thông báo v ki u màn hình, ch ñ ñ ho (MODE) tương ng. Nh ng ngư i làm tin h c ng d ng thư ng không quan tâm l m ñ n các thông s này do v y d lúng túng khi c n khai báo. ð kh c ph c như c ñi m ñó trong Pascal ñã thi t k s n m t th t c kh i t o ch ñ ñ ho là: Initgraph(var GD,GM: Integer, DP:string[n]); Khi g i th t c này v i các tham s h p l Initgraph s t xác ñ nh ki u màn hình và Mode ñ ho t i ưu . ð g i th t c Initgraph c n ph i khai báo trư c các tham s GD, GM thu c ki u Integer (Trong ñó GD: Graph Driver - là m t s nguyên xác ñ nh ki u màn hình; GM: Graph Mode - cũng là m t s nguyên xác ñ nh Mode ñ ho ). N u ngay sau t khoá Begin c a ph n thân chương trình chúng ta khai báo GD:= Detect; thì Initgraph hi u là nó ph i t ñi xác ñ nh ki u màn hình và Mode ñ ho sao cho ñ t k t qu t i ưu. Nói chung tr nh ng trư ng h p ñ c bi t, chúng ta không nên t xác ñ nh nh ng thông s này làm gì. Tham s DP ( Driver Path ) là ñư ng d n t i thư m c ch a các t p ñi u khi n ki u màn hình ñ ho , thông thư ng Pascal ñ ơc cài ñ t trong trong ñĩa c ng nên DP s là 'C:\tp\bgi' nghĩa là ñĩa C, thư m c con BGI trong thư m c TP. Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 144
- Ví d 6.2 là chương trình v m t ñư ng tròn có tâm t i chính gi a màn hình và bán kính là 50 Pixel. Ví d 6.2 Program Ve_hinh_tron; Uses graph; Var GD,DM: Integer; Begin GD:= detect; Initgraph(GD,GM,'c:\tp\bgi'); If graphresult grok then halt(1); Circle(320,240,50); Readln; CloseGraph; End. Dòng th 8 trong ví d 6.2 If graphresult grok then halt(1); là câu l nh ki m tra giá tr c a hàm graphresult (k t qu ki m tra ñ ho ), n u hàm này nh n giá tr 0 thì ñ ho không có l i, chương trình ti p t c làm vi c, còn n u giá tr c a graphresult khác 0 ch ng t vi c ki m tra phát hi n ra l i, chương trình ph i d ng l i. B ng 6.1 cho mã l i mà hàm graphresult tr v . Thông thư ng l i x y ra ch y u là do ngư i s d ng khai báo không ñúng tham s GD, nghĩa là không ch ra cho Pascal bi t các t p ñi u khi n ñ ho n m ñâu, mu n s a ch a ch c n khai báo l i tham s này theo ñúng v trí mà nó ñư c cài ñ t. 2. M t s th t c cơ b n ñ v hình 2.1. MOVETO(x,y) : Di chuy n con tr ñ n to ñ x,y (x là hoành ñ , y là tung ñ ) x,y là các giá tr ki u Integer, v i màn hình VGA thì 0
- 2.4. LINEREL(dX,dY) : V ñư ng th ng t v trí hi n th i ( to ñ x,y) t i to ñ x+dx, y+dy. B ng 6.1 Mã l i Tên l i Nghĩa c a l i 0 Grok T t, không có l i 1 GrnoInitgraph Không tìm th y ñơn v ñ ho 2 Grnotdetected Không có ph n c ng ñ ho 3 GrFilenotfound Không tìm th y các t p ñi u khi n ñ ho 4 GrInvalidDriver File ñi u khi n ñ ho (BGI) b h ng 5 GrNoloadMem Không ñ b nh ñ n p trình ñi u khi n ñ ho 6 GrNoscanMem Không ñ b nh khi duy t (ki m tra) 7 grNoFloodMem Không ñ b nh khi k t xu t ( ñưa ra) 8 grFontNotFound Không tìm th y Font (các t p ñuôi CHR) 9 grNoFontMem Không ñ b nh ñ n p Font 10 grInvalidMode Sai mod ñ ho khi l a ch n các ñi u khi n 11 grError L i ñ ho (l i t ng quát) 12 grIOerror Có l i vào/ra ñ ho 13 grInvalidFont L i các t p ch a Font 14 grInvalidFontNum L i s hi u Font 2.5. CIRCLE(x,y,r) : v ñư ng tròn tâm t i to ñ x,y bán kính b ng r Pixel 2.6. PUTPIXEL(x,y, n) : Th t c này s v m t ñi m sáng t i to ñ x,y v i màu là n. Giá tr n l y trong kho ng 0-15 ho c vi t tr c ti p tên màu theo ti ng Anh. 2.7. RECTANGLE(x1,y1,x2,y2) : V hình ch nh t to ñ góc trên bên trái là x1,y1 , to ñ góc dư i bên ph i là x2,y2. 2.8. BAR(x1,y1,x2,y2) : V m t hình ch nh t góc trên bên trái có to ñ x1,y1 góc dư i bên ph i có to ñ x2,y2. Khi dùng k t h p v i th t c s 9 s ñ ng th i cho phép k các vân hoa trên n n và tô màu cho n n. 2.9. SETFILLSTYLE(n1,n2) : Th t c ñ nh vân hoa và màu n n cho th t c BAR. n1 là m t giá tr nguyên v i 0
- 3.1. SETCOLOR(n) : ð nh màu cho các nét v (n là s hi u màu) 3.2. SETBKCOLOR(n) : ð nh màu n n ñ ng sau nét v Pascal s d ng m t Byte ñ lưu tr các thu c tính màu, trong ñó 4 bit th p là màu ch , 3 bit cao là màu n n, bit cao nh t dành cho thu c tính nh p nháy. Mã nh phân 4 bit có th bi u di n các s t 0 (s 0000) ñ n 15 (s 1111) do ñó thu c tính màu c a ch có 16 giá tr ng v i 16 màu, còn thu c tính màu n n ch có 8 giá tr . Chú ý: * Giá tr n trong th t c 10 có th ch n t 0 ñ n 15, còn trong th t c 11 ch ñư c ch n t 0 ñ n 7. * Thay vì ch n s hi u màu n, Pascal cho phép vi t tên h ng màu, như v y hai l nh sau ñây là tương ñương: Textcolor(4); Textcolor(Red); B ng giá tr n và màu tương ng xem trong m c 8.3 chương III (B ng 3.1) ð tô màu cho m t ñi m chúng ta ñưa ngay tham s màu vào th t c PutPixel, còn tô màu cho m t hình khép kín thì dùng th t c SetFillstyle. 3.3. GetBkcolor: cho bi t mã màu n n hi n dùng 4. Vi t ch trong ch ñ ñ ho Khi ñã chuy n sang làm vi c ch ñ ñ ho ta không th vi t ch bình thư ng như trong ch ñ văn b n. Mu n vi t ch trên màn hình ñ ho chúng ta s d ng m t s th t c sau ñây: 4.1. OUTTEXT(chu i) : Th t c này s cho hi n chu i ký t t i v trí con tr hi n th i. Chu i có th vi t tr c ti p ho c thông qua bi n chu i như trong ví d 6.3 sau ñây: Ví d 6.3 Uses Graph; Var chuviet : string[30] Begin outtext('Cong hoa xa hoi chu nghia Viet nam'); chuviet:='Viet nam dan chu cong hoa'; outtext(chuviet); End. 4.2. OUTTEXTXY(x,y,chuoi) : th t c này s vi t ra chu i ký t t i to ñ x,y. 4.3. SETTEXTSTYLE(Ki u ch , Chi u vi t, Kích thư c); Xác ñ nh ki u ch trong Mode ñ ho Ki u ch là m t tham s nguyên nh n giá tr trong kho ng 0-10 Chi u vi t ch nh n 1 trong hai giá tr : 0: ch n m ngang; 1: ch th ng ñ ng Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 147
- Kích thư c Là h s phóng to ch có th ch n t 0-10 Chú ý: Các phiên b n Pascal cũ ch có 5 ki u ch ñánh s t 0 ñ n 4, phiên b n 7 b xung thêm các ki u t 5 ñ n 10 (xem b ng 6.2) 4.4. CLOSEGRAPH; ch m d t ch ñ ñ ho tr v ch ñ văn b n. Sau ñó mu n quay l i ch ñ ñ ho ta l i ph i g i l i INITGRAPH. Trong m t s trư ng h p ñ chuy n nhanh gi a ch ñ ñ ho và văn b n chúng ta có th dùng hai th t c sau ñây: RESTORECRTMODE; ng ng ch ñ ñ ho chuy n sang ch ñ văn b n. SETGRAPHMODE(n) ; Ng t ch ñ văn b n ñã t o ra b i Restorecrtmode thi t l p tr l i ch ñ ñ ho . Tham s n có th l a ch n trong kho ng 0-2. Ví d 6.4 dư i ñây trình bày cách s d ng các th t c này. Giá tr Tên Font T p lưu tr (ñuôi CHR) 0 DefaultFont Không có 1 TriplexFont TRIP 2 SmallFont LITT 3 SansSerifFont SANS 4 GothicFont GOTH 5 ScriptFont SCRI 6 SimplexFont SIMP 7 TriplexScriptFont TSCR 8 ComplexFont LCOM 9 EuropeanFont EURO 10 BoldFont BOLD B ng 6.2 Ví d 6.4 Program dohoa_text; uses crt,graph; var gd,gm:integer; begin gd:=detect; initgraph(gd,gm,'c:\tp\bgi'); if graphresultgrok then halt(1); moveto(0,0); setcolor(5); Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 148
- lineto(300,300); delay(2500); circle(400,300,100); delay(1500); restorecrtmode; (* Chuy n v ch ñ văn b n *) gotoxy(20,20);textcolor(9); write('AAAAAAAA'); readln; setgraphmode(2); (* Tr v ch ñ ñ ho v i n=2 cho màn hình VEGA*) setcolor(blue); circle(100,100,50); delay(2000); restorecrtmode; (* Chuy n sang ch ñ văn b n l n th hai*) textcolor(3); gotoxy(20,0); write('NNNNNNNNNNNNNNNN'); readln; closegraph; (* K t thúc ch ñ ñ ho *) End. 5. Các ví d Vi c s d ng các th t c ñ ho không có gì ph c t p, v i m t chút c g ng b n có th v ñư c nh ng hình r t ñ p theo mong mu n. Trong ph n này chúng ta s s d ng các th t c ñã trình bày ñ v m t s hình. 5.1 V ñ th hình Sin Dư i ñây là m t chương trình v ñ th hình sin. Ch y chương trình ta s th y ba ñư ng hình sin v i các biên ñ và màu s c khác nhau. Ví d 6.5 Program Do_thi_hinh_sin; uses graph,crt; const m=0.1; Var t3,t4,t1,n,t2,gd,gm:integer; t,x,y,z:real; Begin gd:=detect; Initgraph(gd,gm,'C:\tp\bgi'); if graphresultgrok then Halt(1); x:=0; t3:=100; n:=0; t2:=10; while t2
- y:=sin(x); t1:=round(y*50); t3:=round(y*70); t4:=round(y*100); t1:=200-t1; t3:=200-t3; t4:=200+t4; moveto(10,200); lineto(620,200); line(10,80,10,300); settextstyle(3,0,3); outtextxy(610,205,'x'); settextstyle(3,0,3); outtextxy(15,75,'y'); settextstyle(4,0,3); setcolor(5); outtextxy(200,300,'do thi ham sin(x)'); setcolor(12); moveto(10,200); putpixel(t2,t1,11); putpixel(t2,t3,14); setcolor(red); putpixel(t2,t4,random(14)); setcolor(12); delay(5); x:=x+0.07; t2:=t2+1; end; repeat until keypressed; t1:=1; t2:=200; while t1
- 5.2 V các hình không gian ñơn gi n Chương trình sau ñây s v m t khung ch nh t bao quanh toàn b màn hình, sau ñó v hai ño n th ng chia màn hình thành 4 ph n. Trong góc ph n tư th nh t v m t hình chóp, các nét nhìn th y v li n, nét khu t v b ng nét ñ t. Trong góc ph n tư th hai v m t hình tr . Xin m i các b n nh p chương trình và sau ñó v thêm vào các góc ph n tư còn l i các hình không gian khác, ch ng h n hình h p ch nh t, hình nón... Ví d 6.6 Program vehinh; Uses crt,graph; var i,j:word; gd,gm:integer; Begin clrscr; gd:=detect; initgraph(gd,gm,'C:\tp\bgi'); if graphresultgrok then halt; rectangle(0,0,639,479); moveto(320,0); lineto(320,480); moveto(0,240); lineto(639,240); outtextxy(30,90,'Hinh chop'); setcolor(4); setlinestyle(0,1, normwidth); moveto(100,200); Linerel(120,0); Linerel(50,-40); setcolor(2); setlinestyle(3,1, normwidth); Linerel(-120,0); Linerel(-50,40); setcolor(4); setlinestyle(0,1, normwidth); Lineto(185,50); Lineto(220,200); moveto(270,160); Lineto(185,50); setcolor(2); setlinestyle(3,2, normwidth); Lineto(150,160); moveto(185,50); setcolor(14); Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 151
- lineto(185,180); circle(185,179,2); moveto(100,200); lineto(270,160); moveto(150,160); lineto(220,200); ellipse(480,50,0,360,60,25); ellipse(480,170,180,360,60,25); setlinestyle(0,15, normwidth); moveto(420,50); lineto(420,170); moveto(540,50); lineto(540,170); setlinestyle(2,15, normwidth); setcolor(5); ellipse(480,170,0,180,60,25); setcolor(9); outtextxy(330,90,'Hinh tru'); repeat until keypressed; closegraph; end. 5.3 Vi t ch trên màn hình S d ng các th t c ñã nêu chúng ta có th vi t ch trên màn hình ñ ho , ví d sau ñây s vi t lên màn hình dòng ch "Chuc mung nam moi" và cho dòng ch này ch y t ñáy lên ñ nh màn hình. Vi c cho m t dòng ch ch y ñư c th c hi n b ng cách vi t ch t i m t v trí nào ñó sau ñó xoá ch ñi và vi t l i ch t i to ñ khác. Tuy nhiên trong ch ñ ñ ho chúng ta không dùng ñư c l nh xoá CLRSCR do ñó có th dùng cách vi t l i dòng ch v i màu trùng màu n n. Ví d 6.7 Program chucchay; uses crt,graph; var i,j,gd,gm:integer; Begin clrscr; gd:=detect; Initgraph(gd,gm,'C:\tp\bgi'); if graphresultgrok then halt; settextstyle(0,0,2); For i:=439 downto 0 do Begin setbkcolor(3); Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 152
- setcolor(magenta); outtextxy(180,i,'Chuc mung nam moi'); delay(24); setcolor(3); outtextxy(180,i,'Chuc mung nam moi'); end; closegraph; end. Chương trình dư i ñây thi t k m t ñ ng h ba kim , t c ñ ch y c a kim giây tuỳ thu c vào l nh DELAY(n) , n u ch n DELAY(1000) thì c 1 giây kim giây chuy n m t v trí. Khi nh p chương trình vào máy c n lưu ý khai báo l i ñư ng d n ñ n thư m c ch a các t p *.BGI Ví d 6.8 Program Ve_dong_ho; uses crt,graph; var x,y, maxx,maxy, gd,gm,color,i,j,t:integer; N:real; LAM,TT:CHAR; begin gd:=detect; initgraph(gd,gm,'c:\tp\BGI'); setcolor(5); rectangle(30,20,610,450); rectangle(31,21,609,449); rectangle(32,22,608,448); setfillstyle(9,2); bar(33,23,607,447); setcolor(red); setbkcolor(red); for i:=1 to 10 do circle(320,240,i); setcolor(11); setbkcolor(white); for i:=11 to 80 do circle(320,240,i); setcolor(14); setbkcolor(white); for i:=80 to 160 do circle(320,240,i); setcolor(white); Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 153
- for i:=160 to 200 do circle(320,240,i); setcolor(11); circle(320,240,79); circle(320,240,80); setcolor(4); circle(320,240,159); circle(320,240,160); settextstyle(3,0,4); outtextxy(310,40,'XII'); outtextxy(405,60,'I'); outtextxy(470,120,'II'); outtextxy(490,200,'III'); outtextxy(480,290,'IV'); outtextxy(410,370,'V'); outtextxy(310,400,'VI'); outtextxy(210,370,'VII'); outtextxy(135,290,'VIII'); outtextxy(130,210,'IX'); outtextxy(155,130,'X'); outtextxy(220,60,'XI'); setcolor(blue); Settextstyle(4,0,5); outtextxy(230,100,'DIAMON'); setcolor(random(14)); for i:=1 to 20 do circle(320,360,i ); settextstyle(1,0,2); setcolor(5); outtextxy(200,450,'Copyright by Dr. Duong Xuan Thanh'); for i:=1 to 20 do begin setcolor(random(14)); circle(320,360,i ); end; for i:=1 to 20 do begin setcolor(random(14)); circle(320,360,i ); end; Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 154
- for t:=0 to 12 do {-------- Kim gio --------} begin setcolor(12); moveto(320,240); setlinestyle(0,0,3); SetWriteMode(xorput); linerel(round(110*cos((t*30-89)*pi/180)),round(110*sin((t*30-89)*pi/180))); moveto(320,240); linerel(round(110*cos((t*30-90)*pi/180)),round(110*sin((t*30-90)*pi/180))); moveto(320,240); linerel(round(110*cos((t*30-91)*pi/180)),round(110*sin((t*30-91)*pi/180))); moveto(320,240); linerel(round(110*cos((t*30-92)*pi/180)),round(110*sin((t*30-92)*pi/180))); for i:=0 to 60 do { ---------Kim phut -------} begin setcolor(12); moveto(320,240); setlinestyle(0,0,3); SetWriteMode(xorput); linerel(round(130*cos((i*6-89)*pi/180)),round(130*sin((i*6-89)*pi/180))); moveto(320,240); linerel(round(130*cos((i*6-90)*pi/180)),round(130*sin((i*6-90)*pi/180))); moveto(320,240); linerel(round(130*cos((i*6-91)*pi/180)),round(130*sin((i*6-91)*pi/180))); (*--------Kim giay--------*) for j:=0 to 360 do begin moveto(320,240); setlinestyle(0,0,3); SetWriteMode(XORPut); setcolor(12); linerel(round(150*cos((j-90)*pi/180)),round(150*sin((j-90)*pi/180))); moveto(320,240); linerel(round(150*cos((j-91)*pi/180)),round(150*sin((j-91)*pi/180))); delay(1000); moveto(320,240); linerel(round(150*cos((j-90)*pi/180)),round(150*sin((j-90)*pi/180))); moveto(320,240); linerel(round(150*cos((j-91)*pi/180)),round(150*sin((j-91)*pi/180))); end; Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 155
- moveto(320,240); linerel(round(130*cos((i*6-89)*pi/180)),round(130*sin((i*6-89)*pi/180))); moveto(320,240); linerel(round(130*cos((i*6-90)*pi/180)),round(130*sin((i*6-90)*pi/180))); moveto(320,240); linerel(round(130*cos((i*6-91)*pi/180)),round(130*sin((i*6-91)*pi/180))); end; moveto(320,240); linerel(round(110*cos((t*30-89)*pi/180)),round(110*sin((t*30-89)*pi/180))); moveto(320,240); linerel(round(110*cos((t*30-90)*pi/180)),round(110*sin((t*30-90)*pi/180))); moveto(320,240); linerel(round(110*cos((t*30-91)*pi/180)),round(110*sin((t*30-91)*pi/180))); moveto(320,240); linerel(round(110*cos((t*30-92)*pi/180)),round(110*sin((t*30-92)*pi/180))); end; repeat until keypressed; END. 6. X lý nh Bitmap M i hình v trên m t khu v c màn hình ñư c coi như m t nh và ñư c g i là Bitmap, các Bitmap ñư c lưu tr trong b nh b i t p h p các bit. M i nh l i bao g m nhi u ph n t nh (Pixel), m i Pixel ñư c lưu tr b i 4 bit và vi c x lý nh th c ch t là x lý t ng bit. Pascal ñã thi t k s n m t s th t c ñ lưu tr nh ho c ñ ñưa nh ra màn hình: 6.1 Hàm xác ñ nh kích thư c (dung lư ng) nh ImageSize(x1,y1,x2,y2); Hàm này cho ta kích thư c tính b ng Byte c a m t nh trong mi n ch nh t, góc trên bên trái x1,y1 và góc dư i bên ph i là x2,y2. 6.2 Th t c gán kích thư c vào bi n Getmem(bi n, Imagesize(x1,y1,x2,y2)); Gán vào bi n ñã l a ch n kích thư c nh trong vùng ch nh t góc trên trái x1,y1 góc dư i ph i x2,y2, kích thư c ñư c tính b ng Byte 6.3 Th t c lưu tr nh GetImage(x1,y1,x2,y2, bi n); Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 156
- C t nh trong mi n ch nh t góc trên trái x1,y1 góc dư i ph i x2,y2 vào m t bi n, ñây là bi n không ñ nh ki u và ph i có kích thư c ñ l n ñ lưu nh, trong nhi u ng d ng ñ ho bi n này thu c ki u con tr và ñư c xác ñ nh kích thư c thông qua th t c Getmem. 6.4 Th t c cho hi n nh PutImage(x, y, bi n, phương th c); Cho hi n nh lưu tr trong "bi n" lên màn hình b t ñ u t i to ñ x,y, "Phương th c" là m t s giá tr mà Pascal ñã thi t k nh m ñưa nh Bitmap ra màn hình. Dư i ñây là b ng các giá tr c a "Phương th c" Tên phương th c Phép toán tác ñ ng CopyPut ho c NormalPut MOV (màu nh ñè lên trên màu n n) XorPut XOR OrPut OR AndPut AND NotPut NOT ð hi u rõ hơn v khái ni m "Phương th c" chúng ta c n lưu ý ñ n các phép toán mà m i phương th c x d ng. Ch ng h n khi phương th c là XorPut thì có th hi u v ng nghĩa Put là ñưa nh ra, Xor là phép toán trên Bit. Còn v phương di n k thu t s thì XorPut ñư c hi u như sau: N u ñi m nh trong Bitmap có màu tr ng (s hi u màu là 15) và n n có màu xanh da tr i (s hi u màu là 1) thì khi ñưa ra màn hình ñi m nh này s có màu vàng b i vì 1510 = 11112 , 110 = 00012. Phép toán Xor ñư c th c hi n trên t ng bit 11112 xor 00012 = 11102 S 11102 =1410 ng v i màu vàng. Tương t như v y n u ch n phương th c ñưa nh ra màn hình là AndPut v i màu nh là xanh da tr i (0001) , còn n n có màu ñ (0100) thì: 00012 and 01002 = 00002 nghĩa là nh s có màu ñen. Thông thư ng chúng ta nên dùng "phương th c" là CopyPut nghĩa là màu nh s hi n ñè lên màu n n. Cách hi n màu này cho ta ñúng màu s c nh ñã ñư c lưu tr trong Bitmap. Các phương th c còn l i m c dù ñưa ñư c nh ra màn hình nhưng màu s c không trung th c, không ñúng v i màu nh ñã ñư c lưu tr trong Bitmap. X d ng phương th c XorPut chúng ta có th cho hi n nh và n nh m t cách d dàng. ð th y rõ hơn chúng ta xét ví d sau: Gi s nh Bitmap ñư c lưu trong m t bi n con tr P, nh có màu tr ng và n n màn hình có màu ñ . Th t c ñưa nh ra màn hình b t ñ u t v trí tâm màn hình theo phương th c XorPut: PutImage(320,240,P^,XorPut); V i th t c trên nh ñưa ra màn hình s có màu xanh ng c (s hi u màu là 11) vì 11112 xor 01002 = 10112 = 1110 Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 157
- N u bây gi chúng ta l i ñưa ti p nh ñó ra màn hình t i cùng v trí v i nh ñã có thì nh trên màn hình s b xoá, nói ñúng hơn là nh ñưa ra l n th hai s có màu trùng v i màu n n. Tr l i ví d trên, nh trên màn hình ñang có màu là 1011 còn nh trong Bitmap v n là màu 1111, khi ñó màu nh trên màn hình s là 11112 xor 10112 = 01002 (nghĩa là màu ñ trùng màu n n) T ñây chúng ta có thu t toán v hình chuy n ñ ng như sau: 1- V hình t i to ñ x,y theo phương th c XorPut 2- Lưu hình trên màn hình n miligiây 3- Xoá hình (b ng cách l p l i bư c 1) 4- Thay ñ i to ñ x := x+dx; y:=y+dy; 5- Quay l i bư c 1 Chú ý: khi v hình chuy n ñ ng c n ph i t o các các ñi m d ng ñ khi không mu n chuy n ñ ng có th ng t ngay chương trình. Dư i ñây là chương trình v m t b u tr i sao, s ngôi sao trên b u tr i là 100 trong ñó có 40 ngôi sao nh p nháy, 20 ngôi sao nh p nháy nhanh và 20 sao nh p nháy ch m, các ngôi sao ñư c phân b ng u nhiên. Trong chương trình còn thi t k m t ñĩa bay, ñĩa bay có 25 kích thư c khác nhau, m i hình v ñĩa bay ñư c c t vào m t bi n con tr P, các bi n con tr này n m trong m t m ng con tr . Các ñĩa bay xu t hi n ng u nhiên trên b u tr i, chuy n ñ ng nh d n và bi n m t, sau ñó l i hi n lên t i m t to ñ nào ñó. Chương trình d ng l i khi b m m t phím b t kỳ. V i các máy tính có dung lư ng b nh l n (128 ho c 256 Mb) chúng ta có th tăng s hình ñĩa bay lên 50 hình khi ñó ñĩa bay s chuy n ñ ng m n màng hơn. Ví d 6.9 Program Bautroi_diabay; Uses graph,crt; Var i,j,gd,gm:integer; a,x,y,xx,yy:word; p: array[1..30] of pointer; m,n :array[1..40] of word; Procedure bautroi(a:word); var i,j:word; m,n :array[1..40] of word; ch:char; Begin for j:= 1 to 5 do Begin for i:= 1 to a do begin Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 158
- x:=random(639); y:=random(479); if i
- for r:= 25 downto 1 do {ch n 25 ñĩa v i các kích thư c gi m d n} Begin r1:=round(r/2); r2:=round(r/3); r3:=round(r/5); r4:=2*r2; r5:=round(r/10); Ellipse(x,y,0,360,r,r1); Ellipse(x,y-r3,194,346,r,r2); Line(x+r2,y-r2,x+r4,y-r4); circle(x+r4,y-r4,r5); line(x-r2,y-r2,x-r4,y-r4); circle(x-r4,y-r4,r5); x1:=x-r; y1:=y-r4-r5; x2:=x+r; y2:=y+r1; Getmem(p[i], imagesize(x1,y1,x2,y2));(*xac dinh kich thuoc anh*) getimage(x1,y1,x2,y2,p[i]^); (*cat anh vao bien con tro*) putimage(x1,y1,p[i]^,xorput); (*xoa anh*) i:=i+1; End; i:=1; While not keypressed do Begin (*hien dia bay voi cac kich thuoc khac nhau*) putimage(x,y,p[i]^,xorput); delay(100); xx:=x; yy:=y; x:=x+random(25); y:=y+random(25); putimage(xx,yy,p[i]^,xorput); (*xoa dia bay*) for j:= 1 to 40 do (*tao su nhap nhay cua ngoi sao*) begin setcolor(random(15)); circle(m[j],n[j],1); end; i:=i+1; if i>25 then {da hien het cac hinh dia bay} begin x:=random(500); Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 160
- y:=random(400); i:=1; end; end; end; BEGIN {than chuong trinh chinh} gd:=detect; a:=100; {a la so ngoi sao tren bau troi} initgraph(gd,gm,'C:\tp\bgi'); if graphresultgrok then halt; bautroi(a); {hien bau troi sao} while not keypressed do begin nhapnhay; {thiet ke cac ngoi sao nhap nhay} vedia; {goi dia bay} end; closegraph; END. 7. ð th hàm s Gi thi t hàm y = f(x) xác ñ nh và liên t c trên ño n [a,b], c n v ñ th hàm trong m t khu v c nào ñó trên màn hình. H to ñ quen thu c mà chúng ta s d ng là h xoy v i g c to ñ n m góc dư i bên trái, tr c x hư ng sang ph i, tr c y hư ng lên trên. Màn hình máy vi tính tuỳ theo kích thư c và ch ñ làm vi c có th là ma tr n ñi m t 640x480 ñ n 1024x720. G c to ñ c a màn hình l i góc trên bên trái và tr c x hư ng theo chi u t trên xu ng dư i. ð thu n ti n cho vi c v và quan sát ñ th chúng ta c n ph i chuy n ñ i t to th c (như trong toán h c) sang to ñ màn hình. Ký hi u to ñ th c c a mi n v ñ th ñi m góc dư i trái là xmin, ymin và góc trên ph i là xmax, ymax. To ñ màn hình góc trên trái là cmin , dmin, góc dư i ph i là cmax, dmax. M t ñi m b t kỳ trên ñ th có to ñ th c là x, y và to ñ màn hình là c, d. Có th ch ng minh r ng: c = m*(x - xmin) + cmin d = n*(y - ymin) + dmin xmax, ymax xmin, ymin Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 161
- Trong ñó: p = (cmax - cmin)/(xmax - xmin) q = (dmin - dmax)/(ymax- ymin) Hi u s (dmin - dmax) mang d u âm cho bi t chi u bi n thiên c a tr c th ng ñ ng gi a to ñ màn hình và to ñ th c là ngư c nhau. Khi v ñ th trên màn hình chúng ta s dùng các công th c trên ñ chuy n ñ i to ñ tính ñư c t th c t sang to ñ màn hình. Phương pháp v ñ th là xác ñ nh to ñ t ng ñi m sau ñó n i các ñi m v i nhau b ng các ño n th ng. ð ñ th trơn tru thì s ñi m ph i th t nhi u, tuy nhiên chúng ta không th tăng vô h n s ñi m. Gi s chia ño n [a,b] thành n ño n nh , chúng ta s có n+1 ñi m ñánh s t 0 ñ n n. Khi ñó chi u r ng m i ño n s là h = (b - a)/n. Hoành ñ c a m t ñi m b t kỳ trong to ñ th c: xi = a + h*i, và tung ñ tương ng s là f(xi). ði u c n chú ý khi ch n các to ñ th c và to ñ màn hình là mi n trên màn hình ph i bao kín mi n to ñ th c. Mu n v y chúng ta ch n: xmin = a, xmax = b, ymin = min(yi), ymax = max(yi). Vi c kh o sát hàm s f(x) ñ tìm max và min theo ki u toán h c là không th c t trong Pascal, do v y có th thay th vi c tìm min(yi) và max(yi) b ng vi c lưu các giá tr f(xi) vào m t m ng, sau ñó tìm c c tr trong m ng. ð chương trình có th ng d ng cho t t c các hàm s chúng ta s xây d ng m t chương trình con l y tên là HAM khai báo hàm và tính giá tr c a hàm t i các to ñ xi. M t chương trình con l y tên là TOADO ñ tính các h s m, n, và tung ñ các ñi m chia (t c là giá tr c a hàm f(x) t i các to ñ xi). Ví d 6.10 Program vedothi; Uses graph; Const n=200; cmin=3; dmin=3;cmax=200; dmax=140;{ve o goc phan tu thu nhat} xmin=-5; xmax=5; Var gd,gm:integer; ymin,ymax,h,m,p,q:real; y:Array[0..n] of real; Function F(x:real) : real; Begin {f:=x*x;} F:=x*x*x-2*x; End; Procedure Toado; Var i:integer; xi,yi:real; Begin h:=(xmax-xmin)/n; For i:= 0 to n do Begin Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 162
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Kỹ thuật lập trình nâng cao - Trần Hoàng Thọ
109 p | 522 | 263
-
Giáo trình Lập trình nâng cao - Trần Uyên Trang
154 p | 483 | 136
-
Giáo trình lập trình nâng cao - Chương 1
19 p | 262 | 57
-
Giáo trình lập trình nâng cao - Chương 2
49 p | 149 | 44
-
Giáo trình lập trình nâng cao - Chương 3
26 p | 121 | 37
-
Giáo trình lập trình nâng cao - Chương 4
38 p | 116 | 35
-
Giáo trình lập trình nâng cao - Phụ lục
42 p | 156 | 35
-
Giáo trình lập trình nâng cao - Chương 5
10 p | 130 | 33
-
Giáo trình Lập trình nâng cao (Trên ngôn ngữ Pascal) - ĐH Nông Nghiệp I - Hà Nội
207 p | 65 | 13
-
Giáo trình Lập trình nâng cao (Nghề Lập trình máy tính): Phần 1 - Tổng cục dạy nghề
133 p | 32 | 6
-
Giáo trình Lập trình nâng cao (Nghề Lập trình máy tính): Phần 2 - Tổng cục dạy nghề
169 p | 27 | 6
-
Giáo trình Lập trình nâng cao: Phần 1 - Nguyễn Văn Vinh
126 p | 14 | 5
-
Giáo trình Lập trình nâng cao: Phần 2 - Nguyễn Văn Vinh
153 p | 17 | 5
-
Giáo trình Lập trình Macro (VBA) trên Ms Office (Ngành: Tin học văn phòng – Trình độ Trung cấp) - Trường Cao đẳng Hòa Bình Xuân Lộc
124 p | 3 | 3
-
Giáo trình Lập trình căn bản (Ngành: Quản trị mạng máy tính - Trình độ Cao đẳng) - Trường Cao đẳng Hòa Bình Xuân Lộc
99 p | 5 | 2
-
Giáo trình Lập trình quản lý (Ngành: Tin học văn phòng – Trình độ Trung cấp) - Trường Cao đẳng Hòa Bình Xuân Lộc
156 p | 2 | 1
-
Giáo trình Lập trình căn bản (Ngành: Tin học văn phòng – Trình độ Trung cấp) - Trường Cao đẳng Hòa Bình Xuân Lộc
58 p | 4 | 1
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn