intTypePromotion=1
Array
(
    [0] => Array
        (
            [banner_id] => 143
            [banner_name] => KM - Normal
            [banner_picture] => 316_1568104393.jpg
            [banner_picture2] => 413_1568104393.jpg
            [banner_picture3] => 967_1568104393.jpg
            [banner_picture4] => 918_1568188289.jpg
            [banner_picture5] => 
            [banner_type] => 6
            [banner_link] => https://alada.vn/uu-dai/nhom-khoa-hoc-toi-thanh-cong-sao-ban-lai-khong-the.html
            [banner_status] => 1
            [banner_priority] => 0
            [banner_lastmodify] => 2019-09-11 14:51:45
            [banner_startdate] => 2019-09-11 00:00:00
            [banner_enddate] => 2019-09-11 23:59:59
            [banner_isauto_active] => 0
            [banner_timeautoactive] => 
            [user_username] => minhduy
        )

)

Đồ họa máy tính - Chương 2: Công cụ đồ họa của Turbo Pascal

Chia sẻ: Nguyễn Nhi | Ngày: | Loại File: PDF | Số trang:35

0
166
lượt xem
32
download

Đồ họa máy tính - Chương 2: Công cụ đồ họa của Turbo Pascal

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Công cụ đồ họa của Turbo Pascal (TP) 1. Giới thiệu - Thiết bị phần cứng điều khiển việc hiển thị hình ảnh lên màn hình có tên là Video Card (chúng ta hay gọi là “card màn hình”). - Có nhiều loại Card màn hình với khả năng mạnh yếu khác nhau, mỗi loại cần driver (trình điều khiển) riêng. Bảng sau là các file driver của TP. File driver CGA HERC.BGI EGAVGA.BGI Kiểu Video card IBM CGA , chỉ hiển thị được 4 màu HERCULES MONOCHROME, 2 màu VGA và đại đa số các card màn hình hiện...

Chủ đề:
Lưu

Nội dung Text: Đồ họa máy tính - Chương 2: Công cụ đồ họa của Turbo Pascal

  1. Đồ họa máy tính - Khoa CNTT - ĐHSPHN Chương II: Công cụ đồ họa của Turbo Pascal (TP) 1. Giới thiệu - Thiết bị phần cứng điều khiển việc hiển thị hình ảnh lên màn hình có tên là Video Card (chúng ta hay gọi là “card màn hình”). - Có nhiều loại Card màn hình với khả năng mạnh yếu khác nhau, mỗi loại cần driver (trình điều khiển) riêng. Bảng sau là các file driver của TP. Chúng ta sẽ File driver Kiểu Video card chỉ dùng loại CGA IBM CGA , chỉ hiển thị được 4 màu mạnh nhất HERC.BGI HERCULES MONOCHROME, 2 màu này EGAVGA.BGI VGA và đại đa số các card màn hình hiện nay. Có 16 màu. Độ phân giải 640 * 480 2. Phải làm gì để khởi tạo chế độ đồ họa ? Chúng ta sẽ lập trình đồ họa bằng TP. Muốn vậy cần phải: - Có các file: EGAVGA.BGI, GRAPH.TPU (thư viện chứa các lệnh vẽ đồ họa) và các file cơ bản của TP. - Đặt chúng ở cùng 1 thư mục (nếu không thì phải lập đường dẫn cho GRAPH.TPU tại Option/Directory/Unit directory và cho EGAVGA.BGI bằng InitGraph) - Đặt lệnh khởi tạo chế độ đồ họa (InitGraph) vào trong chương trình Ví dụ: Cách đơn giản và hay dùng nhất để khởi tạo đồ họa Uses Graph; Var hằng đ/n gd,gm: integer; sẵn Begin xâu rỗng gd:=detect; InitGraph(gd,gm,”); .......... .......... .......... /* Các lệnh đồ họa vẽ, xóa ... */ CloseGraph; /* kết thúc đồ họa, quay về chế độ màn hình văn bản bình thường */ End. Vì sao lại là “đơn giản và hay dùng nhất” ? - Không cần gõ vị trí tệp BGI - Không cần nhớ bảng giá trị các chế độ màn hình (có khoảng hơn 10 cặp giá trị khác nhau tương ứng với các chế độ màn hình khác nhau như EGA, HERCULES, VGA ...) http://www.ebook.edu.vn 4
  2. Đồ họa máy tính - Khoa CNTT - ĐHSPHN - Luôn luôn khởi tạo được chế độ mạnh nhất VGA (16 màu, độ phân giải 640 * 480). Trong các phần tiếp theo ta luôn giả thiết rằng chế độ đồ họa là VGA Chỉ để tham khảo: bảng các loại graphics card và chế độ đồ họa tương ứng GraphDriver GraphMode Số dòng, cột CGA CGA0 320 * 200 --- CGAHi 640 * 200 EGA EGALo 640 * 200 --- EGAHi 640 * 350 VGA VGALo 640 * 200 Chúng ta sẽ --- VGAMed 640 * 350 chỉ dùng loại --- VGAHi 640 * 480 mạnh nhất HercMono HercMonoHi 720 * 348 này ... ... ... có tổng cộng 8 giá có tổng cộng 30 giá trị GraphDriver trị GraphMode khác khác nhau nhau 3. Hệ trục tọa độ màn hình (639,0) (0,0) (0,479) (639,479) Trong chế độ đồ họa, chúng ta phải làm việc với một hệ trục tọa độ khác thường: 1) Trục tung Oy quay xuống dưới (hệ trục Decac nghịch) 2) các giá trị tọa độ phải là các số nguyên 3) Nếu tọa độ vượt ra ngoài khoảng (0,639) đối với hoành độ và (0,479) đối với tung độ, thì những gì ta vẽ sẽ không hiển thị trên màn hình Giải thích: 1) Do cấu tạo của màn hình, ta phải chấp nhận. 2) Màn hình chia thành nhiều ô vuông nhỏ (pixel) sắp xếp theo từng dòng và cột như hình vẽ. 3) Giả sử ta vẽ đoạn thẳng AB, thì chỉ có đoạn CD nằm trong màn hình được hiển thị http://www.ebook.edu.vn 5
  3. Đồ họa máy tính - Khoa CNTT - ĐHSPHN B D C Màn hình A Chú ý: chúng ta không cần nhớ 2 giá trị 640 và 480 vì TP đã có 2 hàm GetMaxX và GetMaxY, chúng trả lại giá trị lớn nhất của hoành độ và tung độ đối với mode đồ họa hiện thời: GetMaxX = 639 ; GetMaxY = 479 ; 639,0 0,0 1,0 2,0 ... 0,1 0,2 ... mỗi điểm ảnh là 1 ô vuông 0,479 4. Bảng màu Với mode đồ họa VGA, bảng màu gồm 16 màu được đánh số từ 0 đến 15 như trong bảng sau. Ta có thể dùng số thứ tự hoặc tên hằng số chỉ màu Giá trị số Tên hằng số Màu 0 Black Đen 1 Blue Xanh da trời 2 Green Xanh lá cây 3 Cyan Xanh cẩm thạch 4 Red Đỏ 5 Magenta Tía 6 Brown Nâu 7 LightGray Xám nhạt 8 DarrkGray Xám đậm 9 LightBlue Xanh da trời nhạt http://www.ebook.edu.vn 6
  4. Đồ họa máy tính - Khoa CNTT - ĐHSPHN 10 LightGreen Xanh lá cây nhạt 11 LightCyan Xanh cẩm thạch nhạt 12 LightRed Đỏ tươi 13 LightMagenta Tía nhạt 14 Yellow Vàng 15 White Trắng 5. Vẽ điểm PutPixel(x,y,c); /* x,y : integer ; c: word (kiểu số nguyên dương) */ Vẽ 1 điểm ảnh tại tọa độ (x,y) với màu c, GetPixel(x,y):word Hàm GetPixel trả lại một số nguyên dương là màu của điểm ảnh ở tọa độ (x,y), nói cách khác nó cho biết màu của pixel(x,y) là màu gì. Ví dụ: Tô toàn màn hình bằng màu đỏ Uses Graph; Var gd,gm: integer; i,j:integer; Begin gd:=detect; InitGraph(gd,gm,”); for i:=0 to GetMaxX do for j:=0 to GetMaxY do PutPixel(i,j,red) ; Readkey; /* Gặp readkey chương trình sẽ dừng lại để ta quan sát màn hình. Xem xong ta bấm phím bất kỳ để qua lệnh này */ CloseGraph; End. Những hằng, biến nào trong chương trình trên có thể được thay bằng những giá trị tương đương mà không làm thay đổi chương trình ? Viết chương trình tô một phần tư màn hình (phía trên bên phải) bằng màu xanh da trời Chương trình trên lấp kín màn hình bằng cách tô theo dòng hay cột ? http://www.ebook.edu.vn 7
  5. Đồ họa máy tính - Khoa CNTT - ĐHSPHN Ví dụ: vẽ lưới điểm nhấp nháy uses crt,graph; var gd,gm,i,j:integer; x,y:integer; begin gd:=detect; initgraph(gd,gm,''); randomize; /* khởi tạo bộ sinh số ngẫu nhiên */ repeat Hàm trả lại số màu x:=random(100); y:=random(100); hiện có (16) if GetPixel(x,y) 0 then Putpixel(x,y,0) else PutPixel(x,y,random(GetmaxColor)); delay(2); Until Keypressed; closegraph; end. Hàm GetPixel làm chức năng gì trong ví dụ trên ? Thử thay đổi giá trị tham số của hàm delay() và random() và quan sát kết quả Ví dụ: Vẽ bầu trời sao đơn giản uses crt,graph; var gd, gm, i : integer; BEGIN gd := 0; initgraph(gd,gm,'C:\TP\BGI'); for i := 1 to 1000 do putpixel(random(640),random(480),random(15)+1); readkey; END. Hãy phối hợp những kỹ thuật trong 2 ví dụ trên ( hàm random, vòng lặp Repeat, lệnh GetPixel để tạo ra bầu trời sao đẹp hơn Ví dụ: Vẽ đồ thị hàm số y=sin(x) Uses crt,graph; Var tx,ty,gd,gm,i,j:integer; d,x,y:real; Begin gd:=detect; initgraph(gd,gm,'c:\tp\bgi'); setviewport(getmaxX div 2,getmaxY div 2,getmaxX,getmaxY,clipoff); http://www.ebook.edu.vn 8
  6. Đồ họa máy tính - Khoa CNTT - ĐHSPHN d:=0.001; x:=0; tx:=20; ty:=40; while x
  7. Đồ họa máy tính - Khoa CNTT - ĐHSPHN (a) (b) Biết rằng trên màn hình màu đen chỉ có 1 tam giác màu trắng có vị trí và hình dạng bất kỳ. Hãy đếm xem có bao nhiêu điểm ảnh nằm bên trong tam giác đó (không tính các cạnh) ? Hãy vẽ lại đồ thị hàm y = sin(x) nhưng thay vì chấm từng điểm ảnh như ở ví dụ trên thì ta nối điểm ảnh này với pixel tiếp theo. Ngoài ra còn có 2 lệnh vẽ đoạn thẳng khác LineTo(x,y) /* x,y: integer */ LineRel(dx,dy) /* x1,x2,y1,y2: integer */ Lệnh LineTo(x,y) vẽ đoạn thẳng nối CP hiện thời (xem khái niệm CP ở phần sau) với điểm (x,y), nói cách khác Line(x1,y1,x2,y2); tương đương với 2 lệnh: MoveTo(x1,y1); LineTo(x2,y2); Còn LineRel(dx,dy) vẽ đoạn thẳng từ CP đến 1 điểm có độ chênh là (dx,dy), nói cách khác: LineRel(dx,dy) tương đương với Line(GetX,GetY,GetX+dx,GetY+dy); Thiết lập dạng đoạn thẳng SetLineStyle(dạng,mẫu-tự-tạo,bềdày); { ta bỏ qua mẫu_tự_tạo bằng cách cho 1 giá trị nguyên tùy ý} Dạng: SolidLn 0 Nét Đặc DottedLn 1 Nét chấm chấm http://www.ebook.edu.vn 10
  8. Đồ họa máy tính - Khoa CNTT - ĐHSPHN CenterLn 2 Nét chấm gạch DashedLn 3 Nét đứt đoạn Bề dày có thể nhận giá trị từ 1 (bình thường) đến 3 (nét đậm). 7. Thiết lập chế độ vẽ đè SetWriteMode (mode); /* mode: word */ Mode Giá trị số Tác dụng CopyPut 0 Vẽ hình mới đè lên hình cũ (chế độ vẽ bình thường) XorPut 1 Màu của từng pixel sẽ được Xor với màu cũ Trong chế độ XorPut, giá trị màu vẽ và màu nền được nhị phân hóa, sau đó làm phép Xor với nhau để ra màu hiển thị. Xor 0 1 0 0 1 1 1 0 Lệnh SetWriteMode có tác động tới các lệnh vẽ đường như: Line, LineTo, LineRel, Rectangle, DrawPoly ... và không tác động tới các lệnh vẽ đường tròn, elip ... Ví dụ: Minh họa chế độ xorput Uses Graph; Var gd,gm: integer; i,j:integer; Begin gd:=detect; InitGraph(gd,gm,”); SetFillStyle(1,Brown); /* đặt chế độ tô đặc với màu tô là nâu */ Bar(100,100,200,200); /* Vẽ hình vuông màu nâu */ Readkey; SetColor(white); SetWriteMode(XorPut); for i:=100 to 200 do line(100,i,200,i) ; /* hình vuông đổi thành màu gì ? */ Readkey; CloseGraph; End. Sau lệnh Readkey thứ nhất chương trình dừng lại, lúc đó trên màn hình có gì ? Sau lệnh Readkey thứ 2 chương trình dừng lại, lúc đó trên màn hình có gì ? Tại sao ? http://www.ebook.edu.vn 11
  9. Đồ họa máy tính - Khoa CNTT - ĐHSPHN Chế độ XorPut đặc biệt hay được dùng để vẽ hình chuyển động vì dù hình mới là gì thì sau 2 lần vẽ đè với XorPut hình cũ cũng sẽ được khôi phục nguyên trạng (vẽ hình chuyển động không để lại vết) Giải thích nhận định trên 8. Cửa sổ ViewPort của TP ViewPort (của đồ họa Pascal) là 1 vùng hình chữ nhật trên màn hình. Để thiết lập ViewPort ta dùng lệnh: SetViewPort(x1,y1,x2,y2,clip); x1,x2,y1,y2: tọa độ của ViewPort; clip = true (không cho phép vẽ ra ngoài) hoặc false. Chú ý là sau khi đã thiết lập ViewPort thì gốc tọa độ được tự động chuyển về (x1,y1). ViewPort: clip=off ViewPort: clip=on Xóa nội dung bên trong ViewPort: ClearViewPort; Loại bỏ hẳn ViewPort, trở về chế độ làm việc toàn màn hình: ClearDevice; Lệnh này cũng dùng để xóa màn hình và đưa CP về (0,0) 9. Con trỏ trong chế độ đồ họa (CP: Current Pointer) Ta không nhìn thấy CP trên màn hình, nhưng TP luôn theo dõi vị trí của CP bằng cặp hàm GetX, GetY: trả lại tọa độ hiện thời của CP Moveto(x,y): di chuyển CP tới (x,y) MoveRel(dx,dy): di chuyển CP tới vị trí mới cách vị trí cũ 1 độ chênh là (dx,dy) dx x O Moverel (dx,dy) dy (x1,y1) (x2,y2) y http://www.ebook.edu.vn 12
  10. Đồ họa máy tính - Khoa CNTT - ĐHSPHN Lệnh có liên quan đến CP: - LineTo(x,y): vẽ đoạn thẳng nối từ CP đến (x,y), đồng thời chuyển CP đến đó. - LineRel(dx,dy): vẽ đoạn thẳng nối từ CP đến vị trí mới có độ chênh là (dx,dy) và kéo CP tới đó. 10. Vẽ hình chữ nhật Vẽ hình chữ nhật có đỉnh trên bên trái là (x1,y1), đỉnh dưới phải (x2,y2) và các cạnh song song với 2 trục: Rectangle(x1,y1,x2,y2); /* x1,y1,x2,y2: integer */ Để vẽ và tô hình chữ nhật đặc ta dùng Bar(x1,y1,x2,y2); /* x1,y1,x2,y2: integer */ màu tô và mẫu tô phải được thiết lập từ trước bằng lệnh SetFillStyle(Pattern, Color); Pattern Giá trị số Mẫu tô EmptyFill 0 Màu nền (= để trống) SolidFill 1 Màu đặc LineFill 2 Gạch dọc LtSlashFill 3 Tô sọc chéo thưa Slashfill 4 Tô sọc chéo dày .... ... UserFill 12 người lập trình tự định nghĩa bằng lệnh SetFillPattern() Lệnh SetFillStyle() đặt mẫu tô cho các lệnh tô hình kín như: • Rectangle: hình chữ nhật • Bar: hình chữ nhật đặc • Bar3D: hình hộp • FillPoly: đa giác • PieSlice: quạt tròn Ví dụ: Vẽ bàn cờ uses crt,graph; const stop=50; var http://www.ebook.edu.vn 13
  11. Đồ họa máy tính - Khoa CNTT - ĐHSPHN gd,gm,i,j,cạnh,a,màu:integer; Begin canh:=40; a:= 100; gd:=detect; initgraph(gd,gm,''); màu:=white; setlinestyle(1,1,3); rectangle(a,a,a+8*canh,a+8*canh); {vẽ khung bàn cờ bằng đường đứt đoạn} for i:=0 to 7 do for j:=0 to 7 do begin setfillstyle(1,mau); bar(a+i*canh,a+j*canh,a+(i+1)*canh,a+(j+1)*canh); {1} if j7 then {ô dưới cùng của một cột} if mau=white then mau:= black else mau:=white; {2} end; readkey; closegraph; end. Giải thích ý nghĩa của biến a, canh, i,j trong chương trình trên ? Các lệnh {1}, {2} có tác dụng gì ? Đoạn trình sau có vẽ được bàn cờ không ? for i:=0 to 7 do for j:=0 to 7 do begin if (i+j) mod 2 =0 then mau:=white else mau:= black; setfillstyle(1,mau); bar(a+i*canh,a+j*canh,a+(i+1)*canh,a+(j+1)*canh); end; Vẽ các hình chữ nhật có vị trí và kích thước ngẫu nhiên (có các cạnh nằm ngang hoặc thẳng đứng như hình (a) Vẽ các hình chữ nhật ngẫu nhiên (các cạnh có thể nghiêng tùy ý kiểu như hình (b) (b) (a) http://www.ebook.edu.vn 14
  12. Đồ họa máy tính - Khoa CNTT - ĐHSPHN Hãy vẽ một hình vuông ở tâm màn hình, cho nó từ từ phình to ra đến khi chạm rìa màn hình thì dừng lại. Sau đó co lại để trở về kích thước ban đầu. 11. Đa giác Vẽ đa giác DrawPoly(n,P); n: số đỉnh đa giác +1 P: tham số chứa tọa độ các đỉnh của đa giác Tô đa giác bằng lệnh sau: FillPoly(n,P); /* n và P như trên. Chú ý là n không cần cộng 1*/ Xem các ví dụ sau để hiểu rõ Ví dụ: Vẽ các ngũ giác ngẫu nhiên Uses crt,graph; Type Dinh = Record /* Đỉnh đa giác */ x,y:integer; End; Var gd,gm:integer; i:integer; dagiac: array[1..6] of Dinh; Begin gd:=detect; InitGraph(gd,gm,''); Randomize; Repeat SetColor(random(GetMaxColor)); /* màu được chọn ngẫu nhiên */ http://www.ebook.edu.vn 15
  13. Đồ họa máy tính - Khoa CNTT - ĐHSPHN for i:=1 to 5 do begin dagiac[i].x:=random(getMaxX); /* tọa độ đỉnh được chọn ngẫu nhiên */ dagiac[i].y:=random(getMaxY); end; dagiac[6]:=dagiac[1]; DrawPoly(6,dagiac); Delay(1000); Until KeyPressed; CloseGraph; End. Chú ý lệnh dagiac[6]:=dagiac[1] . Để vẽ đa giác kín N đỉnh ta phải tạo ra đỉnh thứ N+1 trùng với đỉnh đầu. Các đa giác trong chương trình trên đè chồng lên nhau và làm đầy màn hình. Hãy sửa chương trình để chúng hiện lên rồi tự tắt. Hãy sửa để luôn luôn lưu lại trên màn hình 3 đa giác mới nhất. Ví dụ: Vẽ và tô các ngũ giác ngẫu nhiên Uses crt,graph; Type Dinh = Record x,y:integer; End; Var gd,gm:integer; i:integer; dagiac: array[1..6] of Dinh; Begin gd:=detect; InitGraph(gd,gm,''); Randomize; Repeat SetColor(random(GetMaxColor)); SetFillStyle(SolidFill,random(GetMaxColor)); for i:=1 to 5 do begin dagiac[i].x:=random(getMaxX); dagiac[i].y:=random(getMaxy); end; dagiac[6]:=dagiac[1]; DrawPoly(6,dagiac); FillPoly(6,dagiac); Delay(2000); Until KeyPressed; CloseGraph; http://www.ebook.edu.vn 16
  14. Đồ họa máy tính - Khoa CNTT - ĐHSPHN End. Chú ý quan sát ta thấy, với các đa giác lõm lệnh FillPoly tính toán tất cả các chỗ tự cắt và sau đó tô riêng từng phần. Màu tô và mẫu tô xác định bởi SetFillStyle. Dưới đây là 1 ngũ giác lõm với các cạnh tự cắt được tô bởi FillPoly 12. Tô màu miền kín FloodFill(x,y,color); /* x,y : integer; c: word */ Vùng cần tô được nhận dạng nhờ 2 yếu tố: - đường biên khép kín có màu color - điểm (x,y) là một điểm bất kỳ nằm bên trong vùng cần tô. Màu tô và mẫu tô được ấn định bởi SetFillStyle (x,y) (x,y) Ví dụ: VẼ LÁ CỜ ĐỎ SAO VÀNG uses crt,graph; var gd, gm, i, goc, r : integer; p : array[1..5,1..2] of integer; { toạ độ các đỉnh ngôi sao } BEGIN gd := 0; initgraph(gd,gm,''); goc := 18; r := 100; for i := 1 to 5 do begin p[i,1] := round(r*cos(goc*pi/180)); { hoành độ của đỉnh thứ i } p[i,2] := - round(r*sin(goc*pi/180)); { tung độ của đỉnh thứ i } goc := goc + 2*72; end; http://www.ebook.edu.vn 17
  15. Đồ họa máy tính - Khoa CNTT - ĐHSPHN SetFillStyle(1,red); {vẽ lá cờ là hình chữ nhật màu đỏ} Bar(100,100,540,380); SetViewPort(320,240,600,400,false); {chuyển gốc toạ độ ra giữa màn hình} SetColor(yellow); SetFillStyle(1,yellow); FillPoly(5,p); {2 lệnh này tô hình ngôi sao vàng } FloodFill(0,0,yellow); readkey; END. Vì sao trong công thức tính tung độ đỉnh thứ i của ngôi sao lại có dấu trừ ? Nếu bỏ dấu trừ này đi thì hiện tượng gì xảy ra ? Vì sao phải cần 2 lệnh mới tô được ngôi sao ? Nếu bỏ lệnh FloodFill đi thì kết quả sẽ ra sao ? Hoặc nếu chỉ bỏ đi lệnh FillPoly thì trên màn hình sẽ có gì ? Lệnh FillPoly ở trên tô màu một ngũ giác, đó là ngũ giác nào ? Giải thích các lệnh: goc := 18; goc := goc + 2*72; Vì sao không vẽ và tô đa giác 10 đỉnh (123456789-10) ? thay vào đó ví dụ trên vẽ đa giác nào ? y 1 A B E 3 2 10 9 180 O 4 8 x 6 C D 5 7 13. Vẽ cung, đường tròn A Vẽ cung tròn: Arc(x,y, g1,g2,r); B g2 g1 x,y: integer - tọa độ tâm đường tròn O g1,g2: word – góc bắt đầu và góc cuối của cung tròn (tính bằng độ) r: word – bán kính Để vẽ hình quạt tròn, đầu tiên ta vẽ cung tròn, sau đó gọi thủ tục GetArcCoords(VAR ArcCoords: ArcCoodsType); để lấy tọa độ 2 đầu mút (A,B) của cung.Cuối cùng ta vẽ hai đoạn thẳng nối chúng với tâm O của đường tròn Với kiểu ArcCoodsType được định nghĩa như sau: Type http://www.ebook.edu.vn 18
  16. Đồ họa máy tính - Khoa CNTT - ĐHSPHN ArcCoodsType = RECORD x,y:integer; xStart,yStart:integer; xEnd,yEnd:integer; END trong đó (x,y) là tọa độ tâm O, (xStart,yStart) là tọa độ điểm đầu B của cung, (xEnd,yEnd) là điểm cuối A. Ví dụ: Vẽ quạt tròn uses crt,graph; var gd,gm:integer; a:ArcCoordsType; x,y,g1,g2,r: integer; Begin gd:=detect; initgraph(gd,gm,''); x:=GetMaxX div 2; y:=GetMaxY div 2; { tâm đặt chính giữa màn hình } g1:=30; g2:=330; {góc bắt đầu, góc kết thúc } r:=100; arc(x,y,30,330,100); GetArcCoords(a); line(x,y,a.xStart,a.yStart); line(x,y,a.xEnd,a.yEnd); readkey; closegraph; End. Cải tiến chương trình trên để vẽ đầu cá đóng - mở miệng liên tục Viết chương trình vẽ hình trăng lưỡi liềm và khuyên Vẽ đường tròn tâm (x,y) bán kính r : Circle(x,y,r); /* x,y: integer; r: word */ Vẽ cung elip tâm (x,y), bán trục lớn xr, bán trục bé yr, góc bắt đầu và góc kết thúc là g1,g2 Ellipse(x,y,g1,g2,xr,yr) http://www.ebook.edu.vn 19
  17. Đồ họa máy tính - Khoa CNTT - ĐHSPHN yr xr Vẽ và tô hình quạt tròn: PieSlice(x,y, g1,g2, r); Ý nghĩa các tham số giống như lệnh Arc Để tô màu ellip, cũng như đường tròn, ta dùng thủ tục: FillEllipse(x,y,xr,yr); {x,y:integer; xr,yr: word} Để tô một cung ellip ta gọi thủ tục Sector(x,y,StAngle,EndAngle,xr,yr); {x,y: integer; StAngle,EndAngle, xr,yr: word} Ví dụ: VẼ BÓNG CHUYỂN ĐỘNG KIỂU BẬT TƯỜNG uses crt,graph; var gd,gm,x,y,dx,dy,r : integer; BEGIN gd := 0; initgraph(gd,gm,''); x := 100; y := 100; dx := -6; dy := 5; r := 30; repeat setcolor(yellow); circle(x,y,r); {vẽ đường tròn màu vàng} delay(20); setcolor(0); circle(x,y,r); {vẽ đường tròn màu trùng màu nền xoá } http://www.ebook.edu.vn 20
  18. Đồ họa máy tính - Khoa CNTT - ĐHSPHN if (x>=640-r) or (x=480-r) or (y
  19. Đồ họa máy tính - Khoa CNTT - ĐHSPHN Ý nghĩa các biến a,b,x,y, r, d là gì ? Chương trình trên dùng kỹ thuật gì để vẽ kim giây chuyển động ? Nếu là vẽ kim phút thì phải sửa chương trình trên như thế nào ? Hãy vẽ đồng hồ với 2 kim cùng chuyển động: kim giây và kim 1/10 giây 14. Viết chữ (x,y) OutText(s); {s: string} ABCDEFG OutTextXY(x,y,s); {x,y:integer; s: string} Lệnh OutText(s) hiển thị xâu ký tự s tại vị trí CP, không di chuyển CP. Lệnh OutTextXY hiển thị xâu ký tự s tại vị trí (x,y) Các phông chữ (font) khác nhau nằm trên các file *.CHR, nên để chúng tại cùng vị trí với file *.BGI. Chọn kiểu font chữ bằng lệnh sau: SetTextStyle(Font, Direction, Size); Tham số Direction nhận các giá trị sau Tham số font nhận các giá trị sau Tên font Giá trị số Chiều viết Giá trị Tác dụng số DefaultFont 0 HorizDir 0 viết ngang TriplexFont 1 VertDir 1 viết theo chiều SmallFont 2 thẳng đứng SansSerifFont 3 GothicFont 4 Hệ số phóng to Size nhận các giá trị từ 1 đến 10. Ví dụ: Vẽ chữ có bóng uses crt,graph; Var gd,gm,i:integer; Begin gd:=detect; initgraph(gd,gm,''); setTextStyle(GothicFont,0,10); SetColor(DarkGray); {1} for i:=1 to 10 do outTextxy(100+i,100-i,'Graphic'); SetColor(LightGray); {2} outTextxy(100,100,'Graphic'); readln; http://www.ebook.edu.vn 22
  20. Đồ họa máy tính - Khoa CNTT - ĐHSPHN closegraph; End. Màu chữ và màu bóng có giống nhau không ? giải thích tác dụng của lệnh {1} và {2} ? nếu hoán vị 2 lệnh đó thì sao ? Làm sao để điều khiển chữ đổ bóng sang hướng trái/phải, lên trên/xuống dưới như các hình dưới đây? Viết chương trình để các dòng chữ chuyển động từ hai bên ra giữa / rơi từ trên xuống ... 15. Cắt dán hình Để lưu một hình vào bộ nhớ, ta phải lưu cả diện tích hình chữ nhật bao nó Memory (x1,y1) (x2,y2) ABC Để tính toán kích thước vùng nhớ cần dùng để chứa hình, ta gọi hàm ImageSize(x1,y1,x2,y2) ; {x1,y1,x2,y2: integer } với (x1,y1,x2,y2) là tọa độ hình chữ nhật bao quanh hình cần lưu trữ. Chú ý là TP không cho phép lưu trữ một hình có diện tích quá lớn. Sau đó, ta xin trình dịch cấp phát vùng nhớ này bằng cách gọi thủ tục GetMem(p: pointer, n: word) ; Thủ tục này xin cấp phát 1 vùng nhớ n byte (n phải được dự trù trước bằng cách gọi hàm ImageSize), rồi lưu địa chỉ vùng nhớ đó vào con trỏ p. Chú ý: sau khi dùng xong nên giải http://www.ebook.edu.vn 23

CÓ THỂ BẠN MUỐN DOWNLOAD

Đồng bộ tài khoản