intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Lập trình bằng Turbo Pascal part 9

Chia sẻ: Ashfjshd Askfaj | Ngày: | Loại File: PDF | Số trang:28

207
lượt xem
67
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

LËp tr×nh b»ng Turbo Pascal var Gd, Gm: integer; { Gd = Graphic Device } begin Gd:= detect; { Gm = Graphic Mode } InitGraph(Gd, Gm,' ®−êng dÉn \BGI'); if graphresult grOk then begin write ( 'lçi khëi t¹o ®å ho¹'); halt(1); end; end; 1.2.2 Gi¶I thÝch ý nghÜa. C¸c tham sè trong thñ tôc InitGraph: Gd, Gm lμ hai tham biÕn, nhËn c¸c gi¸ trÞ lμ c¸c h»ng sè nguyªn, ®−îc ®Þnh nghÜa trong Unit Graph. Gd, Gm cã thÓ nhËn c¸c gi¸ trÞ nμo vμ ý nghÜa cña chCác tham số trong thủ tục InitGraph: Gd, Gm là hai tham...

Chủ đề:
Lưu

Nội dung Text: Lập trình bằng Turbo Pascal part 9

  1. LËp tr×nh b»ng Turbo Pascal var Gd, Gm: integer; { Gd = Graphic Device } begin Gd:= detect; { Gm = Graphic Mode } InitGraph(Gd, Gm,' ®−êng dÉn \BGI'); if graphresult grOk then begin write ( 'lçi khëi t¹o ®å ho¹'); halt(1); end; end; 1.2.2 Gi¶I thÝch ý nghÜa. C¸c tham sè trong thñ tôc InitGraph : Gd, Gm lμ hai tham biÕn, nhËn c¸c gi¸ trÞ lμ c¸c h»ng sè nguyªn, ®−îc ®Þnh nghÜa trong Unit Graph. Gd, Gm cã thÓ nhËn c¸c gi¸ trÞ nμo vμ ý nghÜa cña chóng cã thÓ tham kh¶o trong Unit Graph. Tham sè ®−êng dÉn \ BGI: ph¶i thay b»ng ®−êng dÉn cô thÓ ®Õn th− môc BGI trong m¸y cña m×nh. Cã thÓ ®Ó cho Turbo Pascal tù ph¸t hiÖn vØ mμn h×nh vμ chän chÕ ®é ®å häa thÝch hîp nhÊt. §ã lμ c¸ch khëi t¹o tù ®éng, b»ng c¸ch ®Æt Gd:= Detect nh− trong vÝ dô trªn. Lóc nμy kh«ng cÇn g¸n gi¸ trÞ cho Gm. Trong tr−êng hîp n¾m v÷ng thiÕt bÞ mμn h×nh hiÖn cã vμ c¸c chÕ ®é ®å ho¹ t−¬ng øng, ta cã thÓ g¸n trùc tiÕp gi¸ trÞ cho Gd, Gm. VÝ dô: Gd:= VGA; Gm:= VGAHi ; Initgraph(Gd,Gm,'C:\TP\BGI' ); ... L−u ý kh«ng ®−îc viÕt trùc tiÕp Initgraph(VGA, VGAHi,'C:\TP\BGI'); Nh− thÕ sai có ph¸p v× c¸c Gd, Gm lμ tham biÕn chø kh«ng ph¶i tham trÞ. Sau khi gäi thñ tôc khëi t¹o ®å ho¹ cÇn kiÓm tra kÕt qu¶ xem viÖc khëi t¹o cã thμnh c«ng hay kh«ng th«ng qua gäi hμm GraphResult. GraphResult: lμ hμm cã s½n trong Unit Graph. GraphResult tr¶ vÒ kÕt qu¶ lμ mét sè nguyªn. §ã lμ m· lçi khëi t¹o ®å ho¹. B¶ng sau ®©y cho biÕt gi¸ trÞ vμ ý nghÜa cña c¸c m· lçi ®å ho¹. Gi¸ trÞ sè Tªn h»ng Y nghÜa 0 thμnh c«ng grOk -1 ch−a khëi t¹o ®−îc grNoInitgraph -2 kh«ng cã phÇn cøng; grNotDetected -3 kh«ng cã c¸c tÖp ®iÒu khiÎn grFileNotFound ®å ho¹. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 217
  2. LËp tr×nh b»ng Turbo Pascal 1.2.3 §ãng thñ tôc ®å ho¹ Dïng thñ tôc chuÈn CloseGraph. Thñ tôc CloseGraph kh«ng cã tham sè. CloseGraph; T¸c dông: - Kh«i phôc l¹i chÕ ®é hiÓn thÞ ban ®Çu cña mμn h×nh tr−íc khi gäi khëi t¹o ®å ho¹; - Gi¶i phãng bé nhí ®· cÊp trªn heap lμm vïng nhí ®Öm ®å ho¹; - Gi¶i phãng vïng nhí chøa c¸c tr×nh ®iÒu khiÓn thiÕt bÞ, c¸c font ch÷ nÕu ®· xin cÊp ph¸t th«ng qua sö dông c¸c thñ tôc GraphGetMem, GraphFreeMem. 1.3 Mét ch−¬ng tr×nh ®å ho¹ ®¬n gi¶n Ch−¬ng tr×nh sau ®©y khëi t¹o chÕ ®é ®å ho¹ vμ vÏ mét ®−êng chÐo mμu vμng trªn mμn h×nh nÒn mμu xanh. program ve_hinh; uses crt,graph; BEGIN KhoiTaoDoHoa; SetBkColor(blue); SetColor(yellow); Moveto(0,0); Lineto(GetmaxX, GetmaxY); repeat until keypressed; closeGraph; END. Ta cã thÓ bæ xung thªm vμo th©n ch−¬ng tr×nh c¸c thñ tôc vÏ h×nh ch÷ nhËt, ®−êng trßn , ®æi mμu nÐt vÏ ... Rectangle(100,100,200,200); SetColor(red); circle(200,150,50); 1.4 Mµu s¾c, kiÓu nÐt vÏ, kiÓu t« nÒn. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 218
  3. LËp tr×nh b»ng Turbo Pascal Trong ch−¬ng tr×nh trªn ta gÆp hai thñ tôc SetBKColor vμ SetColor. §ã lμ hai thñ tôc ®Æt mμu nÒn vμ mμu nÐt vÏ. Ta cã thÓ chän c¸c mμu s¾c kh¸c nhau, thay ®æi c¶ bé mμu ®ang dïng th«ng qua c¸c thñ tôc thiÕt lËp mμu s¾c. Ch−¬ng tr×nh trªn sÏ vÏ c¸c ®o¹n th¼ng, ®−êng trßn ... b»ng nÐt liÒn th«ng th−êng. Ta cã thÓ thay ®æi ®Ó nÐt vÏ thμnh ®−êng ®Ëm h¬n, ®−êng ®øt qu·ng, ®−êng chÊm g¹ch, chÊm chÊm ... §ã lμ kiÓu nÐt vÏ hay Line Style. Thñ tôc SetLineStyle cho phÐp thay ®æi kiÓu nÐt vÏ. Mét vÊn ®Ò kh¸c lμ t« mμu bªn trong mét ®−êng biªn ®ãng kÝn, vÝ dô nh− h×nh ch÷ nhËt, h×nh trßn... Ta cã thÓ t« mμu b»ng mét mμu kh¸c v¬Ý mμu ®−êng biªn (lμ mμu nÐt vÏ) vμ kh¸c víi mμu nÒn cña toμn mμn h×nh. H¬n n÷a cã thÓ trang trÝ phÇn bªn trong nμy b»ng c¸c mÉu trang trÝ kh¸c nhau nh− c¸c chÊm ®iÓm r¶i ®Òu, c¸c ®−êng th¼ng song song, h×nh « l−íi... §ã lμ c¸c mÉu nÒn hay FillPatern. C¸c thñ tôc SetFillPatern, SetFillStyle cho phÐp chän c¸c mÉu t« kh¸c nhau. Cã thÓ h¹n chÕ c¸c thao t¸c ®å ho¹ trong mét khung h×nh ch÷ nhËt gäi lμ ViewPort. Kh¸i niÖm ViewPort cã phÇn gièng nh− Window trong chÕ ®é v¨n b¶n. TÊt c¶ nh÷ng vÊn ®Ò trªn sÏ ®−îc tr×nh bμy kÜ h¬n trong phÇn m«i tr−êng ®å ho¹. 2. C¸c thñ tôc ®å ho¹ th−êng dïng. Trong Unit Graph cã hμng chôc thñ tôc vÏ c¸c h×nh kh¸c nhau. Tªn gäi cña c¸c thñ tôc nμy kh¸ gîi t¶ nªn viÖc sö dông chóng kh«ng mÊy khã kh¨n. D−íi ®©y sÏ ®iÓm l¹i nh÷ng thñ tôc hay dïng. Mçi thñ tôc sÏ ®−îc tr×nh bμy ng¾n gän néi dung gåm: tªn, danh s¸ch tham sè vμ c«ng dông v¾n t¾t. NghÜa lμ cung cÊp giao diÖn vμ chøc n¨ng ®Ó cho ng−êi lËp tr×nh biÕt mμ sö dông. Chi tiÕt h¬n cÇn tham kh¶o Unit Graph. 2.1 Di chuyÓn, vÏ mét ®iÓm, mét ®o¹n th¼ng. MoveTo (X,Y: integer); §Æt bót vÏ t¹i ®iÓm cã to¹ ®é (X,Y); L−u ý trªn mμn h×nh ®å ho¹ kh«ng cã con ch¹y nhÊp nh¸y t¹i vÞ trÝ hiÖn t¹i. PutPixel(X,Y: integer; Color: word); VÏ mét ®iÓm cã mμu Color t¹i vÞ trÝ X,Y. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 219
  4. LËp tr×nh b»ng Turbo Pascal GetPixel(X,Y: integer): word; Tr¶ l¹i mμu cña ®iÓm cã to¹ ®é X,Y. C¸c thñ tôc vÏ ®o¹n th¼ng. LineTo (X,Y: integer); KÎ ®o¹n th¼ng tõ vÞ trÝ hiÖn t¹i ®Õn ®iÓm X,Y. Sau khi vÏ, vÞ trÝ cña bót vÏ lμ X,Y. Line (X1, Y1, X2, Y2); KÎ ®o¹n th¼ng tõ ®iÓm X1,Y1 ®Õn ®iÓm X2,Y2. Sau khi vÏ, vÞ trÝ bót lμ X2,Y2. LineRel (Dx, Dy) ; KÎ ®o¹n th¼ng tõ X,Y ®Õn X+Dx, Y+Dy. 2.2 C¸c thñ tôc vÏ h×nh. Rectangle (X1,Y1, X2, Y2: integer ); VÏ h×nh ch÷ nhËt, kh«ng t« mμu trong ruét. X1,Y1 lμ gãc trªn tr¸I, X2,Y2 lμ gãc d−íi ph¶i. Bar(X1,Y1,X2,Y2: integer ); VÏ h×nh ch÷ nhËt vμ t« mμu trong ruét b»ng mμu vÏ. Bar3D(X1, Y1, X2, Y2: Integer; Depth: Word; Top: Boolean); VÏ h×nh hép khèi ch÷ nhËt 3-chiÒu, cã t« bªn trong theo mÉu vμ mμu x¸c ®Þnh bëi SetFillStyle hoÆc SetFillPattern. Depth lμ ®é s©u tÝnh b»ng sè ®iÓm ¶nh. NÕu Top lμ TopOn th× h×nh hép cã c¶ n¾p bªn trªn. NÕu TopOff th× kh«ng cã n¾p. Lùa chän TopOff ®Ó cã thÓ xÕp chång vμi hép mμu s¾c kh¸c nhau t¹o biÓu ®å h×nh hép ®øng. §é s©u hay dïng lμ 25% cña ®é réng, vÝ dô Bar3D(X1, Y1, X2, Y2, (X2 - X1 + 1) div 4, TopOn); DrawPoly(NumPoints: Word; var PolyPoints); VÏ ®−êng gÊp khóc khÐp kÝn, dïng mμu vμ nÐt vÏ hiÖn hμnh. NumPoints lμ sè ®Ønh, PolyPoints lμ m¶ng c¸c ®Ønh. Mét ®Ønh gåm hai to¹ ®é X,Y. Circle (X,Y: integer; R: word ) ; VÏ ®−êng trßn t©m X,Y b¸n kÝnh R. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 220
  5. LËp tr×nh b»ng Turbo Pascal Arc (X,Y; Integer; StAngle, EndAngle, Radius; Word); VÏ mét cung trßn cã b¸n kÝnh Radius vμ t©m lμ (X,Y), b¾t ®Çu tõ gãc StAngle (start angle) kÕt thóc t¹i gãc EndAngle. C¸c sè ®o gãc StAngle, EndAngle tÝnh theo ®é. Ellipse(X, Y: Integer; StAngle, EndAngle: Word; XRadius, YRadius: Word); VÏ cung ellipse b¾t ®Çu tõ gãc StAngle (start angle), kÕt thóc t¹i gãc EndAngle, víi hai b¸n trôc lμ Xradius, Yradius vμ (X,Y) lμ t©m. PieSlice(X, Y: Integer; StAngle, EndAngle, Radius: Word); VÏ vμ t« nÒn h×nh qu¹t cã b¸n kÝnh Radius, t©m t¹i (X,Y), b¾t ®Çu tõ gãc StAngle, kÕt thóc t¹i gãc EndAngle. Kh¸c víi Arc chØ vÏ ra mét cung cong, thñ tôc nμy vÏ ra h×nh qu¹t v× cã t« nÒn bªn trong. Sector(X,Y: Integer; StAngle,EndAngle, XRadius, YRadius: Word); VÏ vμ t« nÒn mét h×nh qu¹t ellipse. (X, Y) lμ t©m, XRadius vμ YRadius lμ hai b¸n trôc, b¾t ®Çu tõ gãc StAngle, kÕt thóc t¹i gãc EndAngle. 2.3 Tû lÖ biÓu kiÕn. Khi tû lÖ biÓu kiÕn gi÷a hai trôc X,Y kh«ng ph¶i lμ 1:1 th× ®−êng trßn cã thÓ trë thμnh ellipse, h×nh vu«ng cã thÓ thμnh h×nh ch÷ nhËt. Cã thÓ thay ®æi tû lÖ nμy, co gi·n hai trôc thÝch hîp ®Ó kh¾c phôc ®iÒu ®ã GetAspectRatio(var Xasp, Yasp: Word): Word; LÊy tû lÖ biÓu kiÕn hiÖn hμnh gi÷a hai chiÒu X,Y trªn mμn h×nh ®å ho¹. Hμm tr¶ vÒ Xasp / Yasp. SetAspectRatio(Xasp, Yasp: Word); Thay ®æi tû lÖ biÓu kiÕn mÆc ®Þnh. Phôc vô cho vÏ h×nh trßn, h×nh vu«ng. NÕu h×nh trßn bÞ mÐo cã thÓ hoÆc chØnh phÇn cøng hoÆc lμ chØnh b»ng tû lÖ biÓu kiÕn sö dông SetAspectRatio. VÝ dô: uses Graph; var Xasp, Yasp: Word; XSideLength, YSideLength: Integer; begin KhoiTaoDoHoa; GetAspectRatio(Xasp, Yasp); XSideLength:= 20; {ChØnh tû lÖ trôc Y theo tû lÖ biÓu kiÕn} YSideLength:= Round( (Xasp / Yasp) * XSideLength); NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 221
  6. LËp tr×nh b»ng Turbo Pascal {VÏ h×nh thùc sù "vu«ng"} Rectangle(0, 0, XSideLength, YSideLength); Readln; CloseGraph; end. 2.4 ViÕt ch÷ ra mµn h×nh ®å ho¹ Trong chÕ ®é ®å ho¹ chØ cho phÐp in x©u kÝ tù ra mμn h×nh. Kh«ng thÓ dïng c¸c thñ tôc Write ®Ó viÕt trùc tiÕp c¸c kiÓu gi¸ trÞ sè ra mμn h×nh nh− ®èi víi chÕ ®é v¨n b¶n. Do ®ã ph¶i sö dông c¸c hμm, thñ tôc chuyÓn ®æi gi¸ trÞ sè thμnh x©u kÝ sè, vÝ dô Str(Val, St). Trªn mμn h×nh ®å ho¹, vÞ trÞ hiÖn t¹i cña bót vÏ gäi lμ CP - current pointer - sÏ ë t¹i mét ®iÓm ¶nh nμo ®ã. Kh¸c víi chÕ ®é v¨n b¶n cã con ch¹y mμn h×nh nhÊp nh¸y, CP trong chÕ ®é ®å ho¹ kh«ng hiÓn thÞ trªn mμn h×nh. VÞ trÞ nμy sÏ thay ®æi sau mçi thñ tôc ®å ho¹. CÇn t×m hiÓu ®Ó biÕt sù di chuyÓn cña bót vÏ ®èi víi tõng thñ tôc. CP liªn quan ®Õn mét sè thñ tôc mμ kh«ng chØ râ to¹ ®é b¾t ®Çu cña thao t¸c ®å ho¹. OutText(TextString: String); In x©u kÝ tù TextString ra mμn h×nh, b¾t ®Çu tõ vÞ trÝ CP. OutTextXY(X,Y: Integer; TextString: String); In x©u kÝ tù TextString ra mμn h×nh b¾t ®Çu tõ vÞ trÝ (X,Y). TextString lμ x©u kÝ tù cÇn in ra. NÕu dïng font vec t¬ th× x©u kÝ tù bÞ c¾t bít khi qu¸ dμi, v−ît qu¸ khung cña Viewport. NÕu sö dông font bitmap th× TextString qu¸ dμi sÏ kh«ng ®−îc in ra. MÆc ®Þnh lμ dïng font bitmap. C¸c thñ tôc tr×nh bμy d−íi ®©y sÏ thiÕt lËp c¸ch thøc in ra x©u kÝ tù: theo h−íng n»m ngang hay th¼ng ®øng, c¨n lÒ tr¸i, ph¶i, kÝch th−íc con ch÷ ... SetTextJustify(Horiz, Vert: Word); X¸c lËp c¸ch c¨n vÞ trÝ dßng ch÷ cho c¸c thñ tôc OutText , OutTextXY. C¸c tham sè Horiz, Vert cã thÓ nhËn c¸c gi¸ trÞ h»ng sè nh− trong b¶ng d−íi Horiz - H−íng n»m ngang Vert - H−íng th¼ng ®øng Tªn h»ng Gi¸ trÞ Tªn h»ng Gi¸ trÞ NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 222
  7. LËp tr×nh b»ng Turbo Pascal 0 0 LeftText BottomText 1 1 CenterText CenterText 2 2 RightText TopText VÞ trÞ ban ®Çu cña CP lÊy lμm mèc. VÝ dô, sau 2 lÖnh TextJustify(CenterText, CenterText); OutTextXY(100, 100, 'ABC'); th× vÞ trÝ (100, 100) sÏ lμ ë chÝnh gi÷a ch÷ B. MÆc ®Þnh lμ SetTextJustify(LeftText, TopText). NÕu tham sè cã gi¸ trÞ kh«ng hîp lÖ, GraphResult sÏ tr¶ vÒ mét m· lçi grError vμ c¸ch c¨n vÞ trÝ kh«ng thay ®æi. SetTextStyle(Font, Direction: Word; CharSize: Word); X¸c ®Þnh phong c¸ch (Style) hiÓn thÞ ch÷ ra mμn h×nh. Style gåm kiÓu ch÷, h−íng, kÝch th−íc. Tªn h»ng Gi¸ trÞ Y nghia VÒ font ch÷ 0 8x8 font bitmap DefaultFont 1 font vect¬ (Stroked font) TriplexFont 2 " SmallFont 3 " SansSerifFont 4 " GothicFont VÒ h−ãng viÕt 1 Tõ tr¸i sang ph¶i HorizDir 0 Tõ d−íi lªn trªn VertDir VÒ kÝch th−íc 1..10 Lμ hÖ sè phãng to lªn UserCharSize VÝ dô: Ch−¬ng tr×nh d−íi ®©y sÏ in ra 4 dßng ch÷, Size = 1 víi kÝch th−íc 1, Size = 2 víi kÝch th−íc 2, Size = 3 víi kÝch th−íc 3, Size = 4 víi kÝch th−íc 4. uses Graph; var Y, Size: Integer; Begin KhoiTaoDoHoa; NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 223
  8. LËp tr×nh b»ng Turbo Pascal Y:= 0; for Size:= 1 to 4 do begin SetTextStyle(DefaultFont, HorizDir, Size); OutTextXY(0, Y, 'Size = ' + Chr(Size + 48)); {48 lμ m· cña sè 0 } Inc(Y, TextHeight('H') + 1); end; Readln; CloseGraph; end. 3. C¸c thñ tôc vÒ m«i tr−êng ®å ho¹ 3.1 C¸c thñ tôc thiÕt lËp mµu. 3.1.1 B¶ng tªn mμu Tªn mμu vμ c¸c gi¸ trÞ sè t−¬ng øng: Tªn h»ng M« t¶ Gi¸ trÞ sè §en 0 Black Xanh 1 Blue Xanh l¸ c©y 2 Green Cèm th¹ch 3 Cyan §á 4 Red TÝa 5 Margenta N©u 6 Brown X¸m nh¹t 7 LightGray X¸m ®Ëm 8 DarkGray Xanh nh¹t 9 LightBlue Xanh l¸ c©y nh¹t 10 LightGreen CÈm th¹ch nh¹t 11 LightCyan §á nh¹t 12 LightRed TÝa nh¹t 13 LightMargenta Vμng 14 Yellow Tr¾ng 15 White 3.1.2 B¶ng mμu – Palette. B¶ng mμu lμ tËp hîp c¸c mμu ta cã thÓ vÏ lªn mμn h×nh. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 224
  9. LËp tr×nh b»ng Turbo Pascal Mét b¶ng mμu x¸c ®Þnh bëi: - Sè l−îng mμu. - Bé nh÷ng mμu g×. VÝ dô: - B¶ng mμu CGA0 (b¶ng mμu sè 0 dïng cho mμn h×nh CGA): cã 4 mμu. C¸c mμu lμ: mμu nÒn, LightGreen, LightRed, Yellow. - B¶ng mμu CGA1 (b¶ng mμu sè 1 dïng cho mμn h×nh CGA): cã 4 mμu. C¸c mμu lμ: mμu nÒn, LightCyan, LightMargenta, White. Trong Unit Graph cã ®Þnh nghÜa s½n kiÓu Palette ®Ó thÓ hiÖn c¸c th«ng tin vÒ b¶ng mμu. PaletteType = Record size: byte; colors: array [0..maxColor-1] of shortInt; end; Trong ®ã quy −íc mμu nÒn lμ Palette.Colors[0], mμu sè 0 trong bé mμu. SetAllPalette (var PaletteName); Thay ®æi sang mét b¶ng mμu míi. SetPalette( N: word; Color: shortInt); §æi « mμu thø N trong m¶ng mμu cña b¶ng mμu sang mμu míi. GetPalette( Palette) ; Ghi c¸c gi¸ trÞ cña b¶ng mμu ®ang dïng vμo mét cÊu tróc kiÓu PaletteType. SetColor( Color: word ); §Æt mμu vÏ hiÖn t¹i SetBkColor( Color: word) ; §Æt mμu nÒn. GetMaxColor; Hμm tr¶ vÒ sè l−îng mμu cña chÕ ®é ®å ho¹ hiÖn t¹i (tøc lμ gi¸ trÞ cña biÕn MaxColor) 3.2 C¸c thñ tôc vÒ mÉu t«, mÉu nÐt vÏ 3.2.1 C¸c mÉu t« nÒn . C¸c mÉu t« nÒn dïng trong c¸c thñ tôc GetFillSettings, SetFillStyle. Tªn h»ng Gi¸ trÞ Y nghÜa 0 Dïng mμu nÒn EmptyFill 1 Dïng mμu vÏ SolidFill 2 -------- LineFill NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 225
  10. LËp tr×nh b»ng Turbo Pascal 3 ////////// LtSlashFill 4 ////////// (nÐt ®Ëm h¬n) SlashFill 5 \\\\\\\\\\ (nÐt ®Ëm h¬n) BkSlashFill 6 \\\\\\\\\\ LtBkSlashFill 7 l−íi « vu«ng ®øng # HatchFill 8 l−íi « chÐo XHatchFill 9 l−íi ®−êng chÐo dÇy sÝt nhau InterleaveFill 10 ...... WideDotFill 11 ............ CloseDotFill 12 MÉu do ng−êi lËp tr×nh ®Þnh UserFill nghÜa b»ng SetFillPatern SetFillStyle(Pattern: Word; Color: Word); §Æt mÉu t« vμ mμu t« (bªn trong mét h×nh ®ãng kÝn). Thñ tôc nμy x¸c ®Þnh mÉu vÏ vμ mμu t« bªn trong h×nh vÏ bëi c¸c thñ tôc FillPoly, Bar, Bar3D, PieSlice. Cã nhiÒu mÉu lμm s½n nh− nªu trong b¶ng trªn. NÕu tham sè cho SetFillStyle kh«ng hîp lÖ th× GraphResult sÏ tr¶ vÒ grError vμ Style hiÖn hμnh kh«ng thay ®æi. NÕu Pattern = UserFill th× sÏ lμ dïng mÉu do ng−êi lËp tr×nh tù x©y dùng (xem thñ tôc SetFillPattern) VÝ dô. uses Graph; var FillInfo: FillSettingsType; begin KhoiTaoDoHoa; GetFillSettings(FillInfo); {Ghi l−u mÉu t« vμ mμu t« hiÖn hμnh} Bar(0, 0, 50, 50); SetFillStyle(XHatchFill, GetMaxColor); {t« b»ng mÉu míi, mμu míi} Bar(50, 0, 100, 50); with FillInfo do SetFillStyle(Pattern, Color); {Kh«i phôc l¹i mÉu vμ mμu t« lóc tr−íc} Bar(100, 0, 150, 50); Readln; CloseGraph; end. 3.2.2 Tù x©y dùng mÉu t« nÒn NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 226
  11. LËp tr×nh b»ng Turbo Pascal MÉu nÒn UserFill nghÜa lμ mÉu nÒn do ng−êi lËp tr×nh tù x©y dùng. Ng−êi lËp tr×nh tù x©y dùng mÉu nÒn, dïng kiÓu FillPatternType ®· ®−îc ®Þnh nghÜa s½n trong Unit Graph nh− sau: Type FillPatternType = array[1..8] of byte; M¶ng 8 byte sÏ cho ta mét ma trËn ®iÓm 8 x 8. Ta cã thÓ vÏ mét mÉu tuú ý b»ng c¸ch g¸n bit t¹i vÞ trÝ t−¬ng øng lμ 0 hay 1. VÝ dô: mÉu vÏ ch÷ O. 11 $18 1 1 $24 1 1 1 1 $66 1 1 1 1 $66 1 1 1 1 $66 1 1 1 1 $66 1 1 $24 11 $18 SetFillPattern(Pattern: FillPatternType; Color: Word); §Æt mÉu t« nÒn lμ mÉu nÒn tù x©y dùng. Tham sè Pattern lμ tªn cña m¶ng 8 byte mμ ta võa tù vÏ ë trªn. 3.2.3 VÝ dô mÉu t« nÒn tù x©y dùng. Ch−¬ng tr×nh d−íi ®©y sÏ t¹o mÉu t« míi tªn lμ Gray50. Gray50 lμ m¶ng 8 * 8 bit, xen kÏ ®Òu ®Æn 0 vμ 1, do ®ã cã mμu x¸m. MÉu t« nμy ®−îc t« bªn trong mét h×nh ch÷ nhËt. uses Graph; const Gray50: FillPatternType = ($AA, $55, $AA, $55, $AA, $55, $AA, $55); var OldPattern: FillPatternType; begin KhoiTaoDoHoa; GetFillPattern(OldPattern); {Ghi l−u mÉu t« cò } SetFillPattern(Gray50, White); {§Æt mÉu t« míi lμ Gray50} Bar(0, 0, 100, 100); {vÏ h×nh ch÷ nhËt cã t« bªn trong} ReadLn; SetFillPattern(OldPattern,White);{Tr¶ l¹i mÉu t« cò} Bar(0, 0, 100, 100); NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 227
  12. LËp tr×nh b»ng Turbo Pascal ReadLn; CloseGraph; End. 3.2.4 Mét sè thñ tôc vÏ vμ t« nÒn bªn trong ®−êng ®ãng kÝn FillEllipse(X, Y: Integer; XRadius, YRadius: Word) VÏ vμ t« nÒn bªn trong mét h×nh ellipse. FillPoly(NumPoints: Word; var PolyPoints); VÏ vμ t« mμu ®a gi¸c. (So s¸nh víi DrawPoly, kh«ng t« nÒn bªn trong) §−êng biªn cña ®a gi¸c ®−îc vÏ b»ng nÐt vÏ, mμu vÏ hiÖn hμnh. FloodFill(X, Y: Integer; Border: Word); T« mμu mét vïng kÝn b»ng mÉu vμ mμu t« hiÖn hμnh. (X, Y) lμ ®iÓm mÇm n»m trong vïng kÝn. MÉu t« x¸c ®Þnh bëi SetFillStyle hay SetFillPattern. Mμu t« lμ mμu ®−êng biªn. NÕu ®iÓm mÇm n»m trong vïng th× vïng kÝn ®−îc t« mμu ®Çy. NÕu tr¸i l¹i, ®iÓm mÇm n»m ngoμi th× vïng ngoμi ®−îc t«. 3.2.5 C¸c kiÓu nÐt vÏ – Line Style Dïng trong c¸c thñ tôc GetLineSettings, SetLineStyle: Tªn h»ng Gi¸ trÞ sè Y nghÜa 0 NÐt liÒn SolidLn 1 ChÊm chÊm DottedLn 2 CenterLn 3 C¸c v¹ch chÐo DashedLn 4 Do ng−êi lËp tr×nh tù UserBitLn ®Þnh nghi·. §é réng cña nÐt vÏ: NormWidth =1 ThickWidth = 3. SetLineStyle(LineStyle: Word; Pattern: Word; Thickness: Word); Thñ tôc ®Æt kiÓu nÐt vÏ. Thñ tôc nμy sÏ ®Æt l¹i kiÓu nÐt vÏ míi. Sau lÖnh gäi thñ tôc nμy, c¸c kiÓu nÐt vÏ dïng trong c¸c thñ tôc Line, LineTo, Rectangle, DrawPoly, Arc, .. sÏ lμ kiÓu nÐt vÏ míi. NÕu gÝa trÞ tham sè ®Çu vμo kh«ng hîp lÖ, GraphResult sÏ tr¶ vÒ grError vμ kiªñ nÐt vÏ hiÖn t¹i kh«ng thay ®æi. Tham sè Pattern kh«ng cÇn thiÕt, nÕu dïng c¸c kiÓu nÐt vÏ ®· lμm s½n. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 228
  13. LËp tr×nh b»ng Turbo Pascal Tr¸i l¹i, nÕu dïng kiÓu nÐt vÏ do ng−êi lËp tr×nh tù ®Þnh nghÜa, LineStyle = UserBitLn, th× tham sè Pattern ®−îc thay b»ng mét gi¸ trÞ sè nhÞ ph©n 16 bit, thÓ hiÖn mÉu nÐt vÏ do ng−êi lËp tr×nh tù x©y dùng. VÝ dô: Thay tham sè Pattern b»ng gi¸ trÞ $AAAA cã nghÜa lμ nÐt vÏ mμu x¸m v× $AAAA = 1010101010101010. VÝ dô sö dông kiÓu nÐt vÏ. uses Graph; var X1, Y1, X2, Y2: Integer; begin KhoiTaoDoHoa; X1:= 10; Y1:= 10; X2:= 200; Y2:= 150; SetLineStyle(DottedLn, 0, NormWidth); Rectangle(X1, Y1, X2, Y2); SetLineStyle(UserBitLn, $C3, ThickWidth); Rectangle(Pred(X1), Pred(Y1), Succ(X2), Succ(Y2)); Readln; CloseGraph; end. 3.3 ViewPort. ViewPort lμ mét khung nh×n h×nh ch÷ nhËt, h¹n chÕ c¸c thao t¸c ®å ho¹ bªn trong nã. SetViewPort(X1, Y1, X2, Y2: Integer; Clip: Boolean); Thñ tôc nμy sÏ thiÕt lËp mét khung nh×n - viewport (hay window cho ®å ho¹). (X1, Y1) lμ vÞ trÝ gãc trªn tr¸i, (X2, Y2) lμ vÞ trÝ gãc d−íi ph¶i (0≤ X1 < X2 , 0 ≤ Y1 < Y2). To¹ ®é cña gãc trªn tr¸i sÏ trë thμnh (0, 0). Tham sè Clip = false / true cho phÐp hoÆc cÊm viÖc vÏ ra ngoμi khung. Tuy nhiªn vÞ trÞ cña CP vÉn cã thÓ v−ît ra ngoa× khung. Cã thÓ sö dông hai h»ng ClipOn = True, ClipOff = false ®· ®−îc ®Þnh nghÜa s½n. NÕu tham sè ®Çu vμo kh«ng hîp lÖ, GraphResult sÏ tr¶ vÒ mét grError vμ lÖnh kh«ng cã hiÖu qu¶. C¸c thñ tôc InitGraph, GraphDefaults, SetGraphMode ®Òu ®Æt l¹i khung nh×n lμ toμn bé mμn h×nh. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 229
  14. LËp tr×nh b»ng Turbo Pascal Cã thÓ lÊy c¸c gi¸ trÞ tham sè vÒ viewport ®ang hiÖn hμnh b»ng c¸ch gäi thñ tôc GetViewSettings. Gi¸ trÞ tr¶ vÒ cña thñ tôc GetViewSettings lμ mét biÕn kiÓu ViewPortType (chi tiÕt xem bªn d−íi). ClearViewPort; Huû t¸c dông cña thñ tôc ®Æt ViewPort tr−íc ®ã. ClearViewPort ®Æt mμu vÏ lμ mμu nÒn (Palette[0]) vμ ®−a CP vÒ ®iÓm (0, 0) lμ gãc trªn tr¸i mμn h×nh. ClearDevice; Xo¸, lμm s¹ch mμn h×nh b»ng mμu nÒn x¸c ®Þnh bëi SetBkColor vμ ®−a CP vÒ (0, 0). GetViewSettings (var ViewPort: ViewPortType); LÊy c¸c tham sè cña ViewPort. GetViewSettings tr¶ vÒ gi¸ trÞ kiÓu ViewPortType. KiÓu ViewPortType ®¨ ®−îc khai b¸o s½n nh− sau ViewPortType = record x1, y1, x2, y2: integer; {x1,y1 vμ x2,y2 lμ to¹ ®é tuyÖt ®èi} Clip: Boolean; end; C¸c ch−¬ng tr×nh con, nÕu ®Æt l¹i ViewPort th× cÇn ph¶i phôc håi l¹i tr¹ng th¸i cò tr−íc khi kÕt thóc. Khu«n mÉu chung ®Ó thùc hiÖn viÖc nμy lμ Var OldVp: ViewPortType; Begin GetViewSeting(OldVp ); SetViewPort(NewX1,NewY1,NewX2,NewY2, ClipOn ); .... With OldVp do SetViewPort(x1,y1,x2,y2, Clip); End; 4. VÏ ®å thÞ mét hµm sè Cã hμm sè mét biÕn y=f(x). CÇn vÏ ®å thÞ hμm sè trong mét khung h×nh ch÷ nhËt x¸c ®Þnh a ≤ x ≤ b , min = c ≤ f(x) ≤ d = max . NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 230
  15. LËp tr×nh b»ng Turbo Pascal 4.1 Ph©n tÝch thiÕt kÕ. ViÖc vÏ mét h×nh trªn mμn h×nh ®å ho¹ ®−îc thùc hiÖn b»ng c¸ch vÏ tõng ®iÓm ¶nh. Thùc chÊt viÖc vÏ ®å thÞ hμm sè trªn mét hÖ to¹ ®é §Ò c¸c vu«ng gãc còng lμ chÊm ra liªn tôc c¸c ®iÓm cã to¹ ®é (x, f(x)). Cã hai ®iÓm kh¸c biÖt cÇn l−u ý lμ: - Trªn mμn h×nh to¹ ®é y cña ®iÓm ¶nh sÏ t¨ng lªn khi di chuyÓn tõ trªn xuèng d−íi, ng−îc víi quy ®Þnh cña hÖ to¹ ®é th«ng th−êng. - To¹ ®é (0,0) trªn mμn h×nh øng víi ®iÓm gãc trªn-tr¸i, cßn trong khi vÏ ®å thÞ mét hμm sè, gèc to¹ ®é (0,0) th−êng lμ mét ®iÓm ë kho¶ng trung t©m khung h×nh vμ c¸c gi¸ trÞ x,y cã thÓ ©m. CÇn thùc hiÖn viÖc chuyÓn ®æi tõ to¹ ®é lμ gi¸ trÞ sè thùc cña x,y thμnh to¹ ®é sè nguyªn cña ®iÓm ¶nh trªn mμn h×nh. Gi¶ sö ta vÏ ®å thÞ trong khung ViewPort nh− trong h×nh vÏ d−íi ®©y. (0,0) (Xpixel_max, 0) (0, Ypixel_max) (Xpixel_max, Ypixel_max) H×nh 14.1: Khung ViewPort ®Ó vÏ ®å thÞ hμm sè. Khi x biÕn thiªn tõ a ®Õn b th× to¹ ®é ®iÓm ¶nh theo trôc x mμ ta gäi lμ Xpixel sÏ biÕn thiªn tõ 0 ®Õn Xpixel_max. Do ®ã biÕn thiªn gi¸ trÞ thùc cña x khi di chuyÓn trªn trôc x mét ®iÓm ¶nh lμ DeltaX = (b-a) / Xpixel_max. T−¬ng tù, biÕn thiªn gi¸ trÞ cña y khi di chuyÓn trªn trôc y mét ®iÓm ¶nh lμ DeltaY = (d-c) / Ypixel_max. §Ó vÏ ra c¸c ®iÓm trªn mμn h×nh cã to¹ ®é (Xpixel, Ypixel) n»m trªn ®å thÞ cña hμm f(x) ta ph¶i lμm nh− sau: - ChuyÓn ®æi Xpixel thμnh gi¸ trÞ thùc cña x, - TÝnh y = f(x), NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 231
  16. LËp tr×nh b»ng Turbo Pascal - ChuyÓn gi¸ trÞ thùc cña y thμnh to¹ ®é Ypixel. L−u ý c¸c to¹ ®é ®iÓm ¶nh lμ sè nguyªn nªn cã thÓ ph¶i lμm trßn kÕt qu¶. Cô thÓ: x:= a + Xpixel*DeltaX; y:= f(x); Ypixel:= Ypixel_max - Round(( y - c)/DeltaY); Ch−¬ng tr×nh chi tiÕt. 4.2 Ch−¬ng tr×nh d−íi ®©y sÏ vÏ ®å thÞ cña hμm sè y = exp (x) - 1. Gi¶ sö ta quan t©m ®Õn phÇn ®å thÞ n»m trong kho¶ng a = -2 < x
  17. LËp tr×nh b»ng Turbo Pascal LineTo(Lephai,Leduoi); LineTo(Letrai,Leduoi); LineTo(Letrai,Letren); SetViewPort(Letrai,Letren,Lephai,Leduoi,ClipOff); Xpixel_max:= Lephai - LeTrai; Ypixel_max:= Leduoi - Letren; SetBkColor(LightBlue); SetColor(LightGray); Xval_min:= -2; Xval_max:= 3; Yval_min:= exp(-2)-1; Yval_max:= exp( 3)-1; DeltaX:= (Xval_max - Xval_min) / Xpixel_max ; DeltaY:= (Yval_max - Yval_min) / Ypixel_max ; { ve duong cong do thi } For i:= 0 to Xpixel_max do begin Xpixel:= i; Xval:= Xval_min + Xpixel*DeltaX; Yval:= exp(Xval) - 1; Ypixel:= Ypixel_max - Round((Yval - Yval_min)/DeltaY); Putpixel(Xpixel,Ypixel,white); end; { ve truc toa do, neu nam trong khung } if (Xval_min < 0) and (Xval_max > 0) then begin Xpixel:= Round((- Xval_min) / DeltaX); MoveTo(Xpixel,Ypixel_max); LineTo(Xpixel,0); end; if (Yval_min < 0) and (Yval_max > 0) then begin Ypixel:= Ypixel_max - Round((- Yval_min)/DeltaY); MoveTo(0,Ypixel); LineTo(Xpixel_max,Ypixel); end; {ve cac vach chia tren khung} i_beg:= trunc(Xval_min)+1; i_end:= trunc(Xval_max); for i:= i_beg to i_end do begin Xpixel:= Round((i-Xval_min) / DeltaX); Str(i, Str3); OutTextXY(Xpixel,Ypixel_max+15,Str3); NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 233
  18. LËp tr×nh b»ng Turbo Pascal MoveTo(Xpixel,Ypixel_max+5); LineTo(Xpixel,Ypixel_max-5); end; i_beg:= trunc(Yval_min)-1; i_end:= trunc(Yval_max); for i:= i_beg to i_end do begin Ypixel:= Ypixel_max - Round((i-Yval_min)/DeltaY); Str(i, Str3); OutTextXY(-20,Ypixel,Str3); MoveTo(-5,Ypixel); LineTo(+5,Ypixel); end; repeat until KeyPressed; closeGraph; END. 4.3 ChuyÓn thµnh ch−¬ng tr×nh con. VÏ ®å thÞ lμ mét c«ng viÖc hay gÆp. Cã thÓ chuyÓn ch−¬ng tr×nh trªn thμnh mét thñ tôc vÏ ®å thÞ ®Ó sö dông l¹i sau nμy. NhËn thÊy r»ng c¸c d÷ liÖu ®Çu vμo ®Ó cã thÓ vÏ ®−îc ®å thÞ mét hμm sè lμ c¸c gi¸ trÞ a,b,c,d x¸c ®Þnh vïng ®å thÞ mμ ta quan t©m vμ quan träng h¬n lμ c«ng thøc tÝnh gi¸ trÞ hμm y=f(x). NÕu ta muèn vÏ chØ trong khung h×nh ViewPort th× cÇn cung cÊp thªm ®é réng c¸c lÒ bèn phÝa. Hμm cÇn vÏ ®å thÞ sÏ ®−îc gäi ®Õn bªn trong ch−¬ng tr×nh con ®Ó tÝnh gi¸ trÞ y. Do ®ã, c¸ch ®¬n gi¶n nhÊt lμ quy −íc dïng mét tªn gäi ®Þnh s½n, vÝ dô HamCanVeDoThi. .... function HamCanVeDoThi(x:real):real; begin .... end; procedure VeDoThi(Letrai, Lephai, Leduoi, Letren:word; Xval_min,Xval_max,Yval_min,Yval_max: real); var Xpixel_max, Ypixel_max: word; Xpixel,Ypixel, i, i_beg, i_end: integer; DeltaX, DeltaY, Xval,Yval: real; Str3: String[3]; begin NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 234
  19. LËp tr×nh b»ng Turbo Pascal { vÏ ®−êng cong ®å thÞ} For i:= 0 to Xpixel_max do Begin Xpixel:= i; Xval:= Xval_min + Xpixel*DeltaX; Yval:= HamCanVeDoThi(Xval); Ypixel:= Ypixel_max - Round((Yval - Yval_min)/DeltaY); Putpixel(Xpixel,Ypixel,white); end; repeat until KeyPressed; end; { thñ tôc vÏ ®å thÞ} Trong th©n ch−¬ng tr×nh chÝnh chØ cÇn gäi thñ tôc vÏ ®å thÞ víi c¸c tham trÞ a,b,c,d thÝch hîp vμ c¸c ®é réng lÒ mong muèn. VÝ dô BEGIN KhoiTaoDoHoa; VeDoThi(50,50,50,50, a,b,c,d)); CloseGraph; END. 5. Lµm ho¹t h×nh. Nguyªn lÝ ho¹t h×nh lμ hiÓn thÞ mét d·y h×nh vÏ liªn tiÕp, lμm cho ng−êi xem cã c¶m gi¸c nh− h×nh vÏ chuyÓn ®éng thùc sù. Cã ba ph−¬ng ph¸p lμm ho¹t h×nh trªn m¸y tÝnh. 1- VÏ-xo¸-vÏ l¹i ra chç kh¸c trªn mμn h×nh tr¬n. 2- Dïng GetImage vμ PutImage ®Æt h×nh ¶nh t¹i vÞ trÝ míi. 3- LËt trang mμn h×nh, 5.1 Di chuyÓn h×nh vÏ trªn nÒn tr¬n Mμn h×nh tr¬n lμ mμn h×nh chØ cã mét mμu nÒn. Khi cÇn t¹o h×nh di chuyÓn trªn mμn h×nh tr¬n cã thÓ thùc hiÖn ®¬n gi¶n b»ng c¸ch sau: 1- vÏ h×nh, 2- xo¸ h×nh võa vÏ b»ng c¸ch vÏ l¹i h×nh nh−ng b»ng mμu nÒn, 3- vÏ l¹i h×nh t¹i vÞ trÝ míi. LÆp l¹i c¸c b−íc 2, 3 nhiÒu lÇn ta sÏ cã h×nh chuyÓn ®éng. VÝ dô: h×nh vßng trßn l¨n tõ tr¸i sang ph¶i uses crt,graph; const radius = 50; NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 235
  20. LËp tr×nh b»ng Turbo Pascal step = 5; Var x,y: integer; Procedure KhoiTaoDoHoa; .... procedure DrawBall(color:word); begin setColor(color); circle(x,y,radius); end; BEGIN KhoiTaoDoHoa; x:=radius; y:=GetmaxY div 2; repeat DrawBall(Black); x:=x+step; DrawBall(white); delay(100); until keyPressed OR (x>GetmaxX - radius - step); readln; closegraph; END. 5.2 Di chuyÓn h×nh vÏ trªn nÒn h×nh ¶nh tÜnh. 5.2.1 C¸c thñ tôc hç trî Unit Graph cung cÊp c¸c hμm, thñ tôc thao t¸c víi mét vïng h×nh ch÷ nhËt c¸c ®iÓm ¶nh. Ta cÇn t×m hiÓu chóng tr−íc khi thùc hiÖn viÖc chuyÓn ®éng h×nh ¶nh trªn nÒn h×nh ¶nh kh¸c. GetImage(X1, Y1, X2, Y2: Integer; var BitMap); Ghi l−u l¹i mét vïng h×nh ch÷ nhËt cña mμn h×nh ®å ho¹ vμo bé ®Öm. X1, Y1, X2, Y2 x¸c ®Þnh khung h×nh ch− nhËt. BitMap lμ mét biÕn ®éng, kh«ng ®Þnh kiÓu, nh»m x¸c ®Þnh mét vïng nhí cÇn thiÕt ®Ó chøa vïng h×nh. Hai word ®Çu tiªn cña BitMap ghi chiÒu réng, chiÒu cao cña vïng h×nh tÝnh theo pixel. word thø ba dμnh riªng. PhÇn cßn l¹i cña BitMap chøa néi dung cña vïng h×nh theo tõng bit. KÝch th−íc (theo byte) cña vïng h×nh x¸c ®Þnh b»ng hμm ImageSize. PhÇn bé nhí dμnh ghi l−u vïng h×nh kh«ng ®−îc v−ît qu¸ 64K. ImageSize(X1, Y1, X2, Y2: Integer): Word; LÊy kÝch th−íc (theo byte) cña vïng ¶nh h×nh ch÷ nhËt. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 236
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2