Thuật ngữ “Đồ họa máy tính – Computer Graphics” được đề xuất bởi một nhà khoa học Mỹ tên là Wiliam Fetter vào năm 1960 khi ông đang nghiên cứu xây dựng mô hình buồng lái máy bay cho hãng Boing. Đồ họa máy tính có thể được hiểu như là tất cảnhững gì liên quan đến việc tạo ra ảnh (image) bằng máy tính. Chúng bao gồm: tạo, lưu trữ, thao tác trên các mô hình và các ảnh. W. Fetter đã dựa trên các hình ảnh ba chiều của mô hình người phi công trong buồng lái để xây dựng nên mô hình tối ưu cho buồng lái máy bay Boing.
94 trang |
Chia sẻ: haohao89 | Lượt xem: 3081 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Bài giảng môn đồ hoạ máy tính, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Môn Đồ họa máy tính
Thời lượng: 60 tiết (lý thuyết + thực hành trên máy)
Tài liệu tham khảo:
[1] Nhập môn đồ họa, Lương Chi Mai, Huỳnh Thị Thanh Bình, 2000
[2] Kỹ thuật đồ họa máy tính, Lê Tấn Hùng, Huỳnh Quyết Thắng, 2004
[3] Cơ sở đồ họa máy tính, Hoàng Kiếm, 1999
[4] Đồ họa vi tính, Huỳnh Văn Đức, Nguyễn Quốc Cường, Hoàng Đức Hải
[5] Computer Graphic, J.D. Foley, A.V. Dam
Đánh giá:
- Câu hỏi trên lớp
- Bài kiểm tra điều kiện
- Thi: vấn đáp / viết
1
Phần mở đầu: Giới thiệu về đồ họa máy tính
Thuật ngữ “Đồ họa máy tính – Computer Graphics” được đề xuất bởi một nhà khoa học Mỹ
tên là Wiliam Fetter vào năm 1960 khi ông đang nghiên cứu xây dựng mô hình buồng lái
máy bay cho hãng Boing. Đồ họa máy tính có thể được hiểu như là tất cả những gì liên quan
đến việc tạo ra ảnh (image) bằng máy tính. Chúng bao gồm: tạo, lưu trữ, thao tác trên các
mô hình và các ảnh. W. Fetter đã dựa trên các hình ảnh ba chiều của mô hình người phi
công trong buồng lái để xây dựng nên mô hình tối ưu cho buồng lái máy bay Boing.
1. Tổng quan về một hệ đồ họa
Các thành phần phần cứng:
• Thiết bị hiển thị: màn hình, máy in
• Thiết bị nhập: bàn phím, chuột
Cấu tạo của màn hình dạng điểm (raster – scan display): chùm tia điện tử được quét ngang
qua màn hình mỗi lần 1 dòng và quét tuần tự từ trên xuống dưới. Việc bật tắt các điểm sáng
trên màn hình phụ thuộc vào cường độ của tia điện tử và đây là cơ sở cho việc tạo ra hình
ảnh trên màn hình,
Mỗi điểm sáng trên màn hình được gọi là pixel. Các thông tin về hình ảnh trên màn hình
được lưu trữ trong vùng nhớ đệm gọi là bộ nhớ màn hình (refresh buffer). Để thay đổi hình
ảnh trên màn hình, cần làm thay đổi thông tin trong vùng nhớ đệm. Vùng này có thể nằm
trên Video card hay trích ra từ bộ nhớ chính.
Để tạo ra ảnh Đen - Trắng, chỉ cần lưu thông tin của mỗi pixel bẳng 1 bit( 1/0 = bật/tắt điểm
ảnh). Trong trường hợp ảnh nhiều màu, người ta cần nhiều bit hơn. Nếu ta dùng b bit thì có
thể lưu trữ được 2b giá trị màu khác nhau.
Các công cụ phần mềm:
• Công cụ ứng dụng (application package):được thiết kế cho người sử dụng để tạo ra
ảnh trong những lĩnh vực chuyên nghiệp nào đó mà không cần quan tâm tới các thao
tác bên trong hoạt động ra sao. Ví dụ: AutoCAD, Adobe Photoshop, ...
• Công cụ lập trình: (programming package): cung cấp một thư viện các hàm đồ họa để
dùng trong các ngôn ngữ lập trình cấp cao. Ví dụ: GRAPH.TPU (Pascal), Open GL
2. Các ứng dụng của đồ họa máy tính (computer graphics)
Công cụ hỗ trợ thiết kế (CAD/CAM)
Hỗ trợ thiết kế được xem là một ứng dụng chính của đồ họa máy tính, trong đó đối tượng
được xây dựng trực tiếp là mô hình thiết kế. Hiện nay đồ họa máy tính được ứng dụng trong
việc thiết kế
• các chi tiết cơ khí
• hệ thống điện
• thiết bị điện tử
• thiết kế thân ô tô
• hệ thống cáp quang
2
• mạng truyền thông
• và rất nhiều thứ khác ...
Các chi tiết sẽ được vẽ trên màn hình nhờ các công cụ đồ họa ban đầu dưới dạng phác thảo,
sau đó được chỉnh sửa bằng kinh nghiệm của người kỹ sư cũng như khả năng trợ giúp thông
minh của phần mềm thiết kế.Khác với các bản vẽ trên giấy, người thiết kế có thể xem mô
hình thiết kế trên máy tính từ mọi góc độ, dễ dàng thay đổi mọi chi tiết và quan sát hiệu ứng
của sự hiệu chỉnh đó.
Giao diện Người - Máy
Ngày nay hầu hết các chương trình ứng dụng trên PC đều có giao diện với người dùng dựa
trên hệ thống tương tác đồ họa: Cửa sổ, Biểu tượng, Con trỏ chuột, Menu .... Giao diện đồ
họa thực sự mang lại sự thoải mái cho người sử dụng
Biểu diễn thông tin
Các trình ứng dụng sử dụng công cụ đồ họa để tạo ra các biểu đồ, đồ thị ... minh họa tương
quan giữa các đối tượng trong kinh doanh, khoa học, các dữ liệu tài chính, thống kê ... Các
máy tính, máy ATM, máy bán hàng, máy bán vé tàu ... ở nơi công cộng đều sử dụng giao
diện đồ họa để biểu diễn những mục thông tin hướng dẫn khách hàng
Giải trí, nghệ thuật
Đối với các nhà tạo mẫu, người chụp ảnh, những chương trình trợ giúp thiết kế mẫu hay
chỉnh sửa ảnh như PhotoShop, 3DMax, ... đã giúp họ thiết kế các hình ảnh sống động. Đồ
họa máy tính cung cấp phương tiện cho các nhà làm phim tạo ra những bộ phim nổi tiếng
như Công viên Khủng long, Xác ướp Ai cập ... nhờ những kỹ xảo điện ảnh thực hiện trên
máy tính
Giáo dục và đào tạo
Đồ họa máy tính cũng góp phần quan trọng trong nghiên cứu các thực thể trừu tượng, mô
phỏng cấu trúc vật thể, tiến trình của các phản ứng hóa học, hạt nhân, hoạt động của các hệ
thống sinh lý. Trong đào tạo, các ứng dụng mô phỏng được dùng để kiểm tra trình độ người
lái, huấn luyện phi công, điều khiển giao thông ...
Bản đồ học, nghiên cứu địa lý
Đồ họa máy tính được sử dụng để tạo ra các sơ đồ địa lý và các đối tượng tự nhiên một cách
chính xác từ những số liệu đo được. Ví dụ như bản đồ địa lý, bản đồ thời tiết, bản đồ mật độ
dân số, sơ đồ khoan thăm dò, biểu đồ hải dương học.
3
Chương I: 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 Kiểu Video card
CGA IBM CGA , chỉ hiển thị được 4 màu
HERC.BGI HERCULES MONOCHROME, 2 màu
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
Chúng ta sẽ
chỉ dùng loại
mạnh nhất
này
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 Crt,Graph;
Var
gd,gm: integer;
Begin
gd:=detect;
InitGraph(gd,gm,”);
hằng đ/n
sẵn
xâu rỗng
..........
..........
.......... /* 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
...)
4
- 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
--- VGAMed 640 * 350
--- VGAHi 640 * 480
HercMono HercMonoHi 720 * 348
...
có tổng cộng 8 giá
trị GraphDriver
khác nhau
...
có tổng cộng 30 giá
trị GraphMode khác
nhau
...
Chúng ta sẽ
chỉ dùng loại
mạnh nhất
này
3. Hệ trục tọa độ màn hình
(639,0)
(0,479)
(0,0)
(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ị
5
B
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 ;
0,0 1,0 2,0 ... 639,0
0,1
0,2
...
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
D
C
Màn hình
A
mỗi điểm ảnh là
1 ô vuông
6
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 Crt,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.
VNhữ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 ?
VViế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
VChương trình trên lấp kín màn hình bằng cách tô theo dòng hay cột ?
7
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
x:=random(100); y:=random(100);
if GetPixel(x,y) 0 then
Putpixel(x,y,0)
else PutPixel(x,y,random(GetmaxColor));
delay(2);
Until Keypressed;
closegraph;
end.
VHàm GetPixel làm chức năng gì trong ví dụ trên ?
VThử 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.
VHã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);
Hàm trả lại số màu
hiện có (16)
8
d:=0.001; x:=0; tx:=20; ty:=40;
while x<4*pi do
begin
putpixel(round(tx*x),-round(ty*sin(x)),yellow);
x:=x+d;
end;
readln;
closegraph;
End.
VHãy giải thích ý nghĩa của tx,ty,d ?
VNếu gán d:=0.5 thì kết quả thay đổi ra sao ?
VVì sao phải có dấu trừ trong tham số thứ 2 của PutPixel ? Nếu bỏ dấu trừ đi thì kết quả ra
sao ?
VHãy vẽ đồ thị hàm số y = x2 – 2x +1 trong khoảng [-3,3]
VHãy vẽ đồ thị hàm số y = sin 2x trong khoảng [-2π, 2π]
6. Vẽ đoạn thẳng
Line(x1,y1,x2,y2) /* x1,x2,y1,y2: integer */
Vẽ đoạn thẳng nối (x1,y1) với (x2,y2) bằng màu vẽ hiện thời ấn định bởi lệnh SetColor gần
nhất. Nếu không có lệnh SetColor nào thì màu vẽ mặc định luôn là màu Trắng (white).
Trước lệnh vẽ đoạn thẳng ta nên đặt màu vẽ cho lệnh Line bằng lệnh
SetColor (c); /* c: word */
Chú ý: SetColor chỉ đặt màu vẽ cho các lệnh vẽ đoạn thẳng, hình chữ nhật, đa giác, đường
tròn ...mà không có đặt màu tô cho miền khép kín.
VHãy vẽ thêm 2 trục tọa độ cho ví dụ mẫu vẽ đồ thị hàm sin ở mục trên
VHãy làm lại ví dụ “Tô toàn màn hình bằng màu đỏ” nhưng dùng lệnh Line thay cho
PutPixel
VHãy tô kín hình chữ nhật (50,50,100,100) bằng cách dùng lệnh Line
100,100
50,50
VVẽ và lấp đầy một hình bình hành bằng các đoạn thẳng xiên như hình (a). Có thể lấp đầy
bằng các đoạn thẳng nằm ngang như hình (b) được không ?
9
(a) (b)
VBiế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) ?
VHã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:
10
SolidLn 0 Nét Đặc
DottedLn 1 Nét chấm chấm
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 crt, 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.
11
VSau lệnh Readkey thứ nhất chương trình dừng lại, lúc đó trên màn hình có gì ?
VSau 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 ?
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)
VGiả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)
(x2,y2)
(x1,y1)
12
y
x
O
Moverel (dx,dy)
dx
dy
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;
13
const stop=50;
var
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.
VGiả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ì ?
VĐ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;
VVẽ 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)
VVẽ 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)
14
VHã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;
(b)
(a)
15
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 */
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.
VCá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));
16
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;
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,c); /* 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 đồng màu (ký hiệu màu là c)
- đ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