Kỹ thuật Đồ hoạ máy tính 89 Các hình thang cơ bản sẽ là các hình giới hạn bởi các đoạn thẳng (P 1 ,P 2 ), (P 3 ,P 4 ) (P 2n-1 , P 2m ) và các đoạn thẳng thuộc các cạnh của đa giác Ví dụ: Bài tập: Hãy diễn đạt chính xác thuật toán trên và lập chơng trình phân chia đa giác thành các hình thang cơ bản $16. Các thuật toán tô mu 1. Thuật toán tô màu hình thang cơ bản Giả sử cho hình thang cơ bản có dạng: (x 4 y 4 ) (x 3 y 3 ) (x 1 y 1 ) (x 2 y 2 ) Thuật toán nh sau: 1. Đặt y min =y 1 ; y max =y 3 ; m=y max -y min +1 2. tính hệ số góc Cl=(x 4 -x 1 )/(y 4 -y 1 ) Cr=(x 3 -x 2 )/(y 3 -y 2 ) 2. Đặt y i =y min +(i-1) im=1, tính xx yyC i l i l =+ 11 (). xx yyC i r i r =+ 22 (). W 8 W 1 W 1 W 7 W 6 W 2 W 4 W 3 W 5 W 5 1 2 3 W 2 3 2 4 7 8 6 9 5 5 W 4 6 W 3 Kỹ thuật Đồ hoạ máy tính 90 3. Kẻ đoạn thẳng (,),(,)xy xy i l i i r i bằng màu tô Chú ý 1. Khi hình thang cơ bản biến dạng về tam giác chẳng hạn x 1 =x 2 , y 1 =y 2 (x 3 y 3 )(x 4 y 4 ) (x 1 y 1 ) khi đó: xx C i l i l l =+ 1 xx C i r i r r =+ 1 2. Tô màu đa giác Dựa vào kết quả của việc phân chia đa giác thành tổng các hình thang cơ bản ta suy ra để tô màu một đa giác bất kỳ, ta cần phân chia đa giác thành tổng các hình thang cơ bản và sau đó tô màu các hình thang đã đợc chia 3. Tô màu một vùng kín bất kỳ Cho một tập các pixel tập đợc gọi là liên thông nếu từ một pixel ta có thể di chuyển đến các pixel bất kỳ thuộc tập Cho một tập W các điểm ảnh (Pixel) tập W gọi là liên thông cấp 8 nếu mỗi pixel có 8 điểm lân cận thuộc tập Cho một tập W các điểm ảnh (pixel) tập đợc gọi là liên thông cấp 4 nếu mỗi điểm ảnh thuộc tập có 4 điểm lân cận thuộc tập Kỹ thuật Đồ hoạ máy tính 91 Bài toán tô màu vùng bất kỳ Cho một tập W các điểm ảnh liên thông cấp 4 đợc giới hạn bởi đờng biên có mầu cb và một điểm ảnh trong W hãy tô vùng W bằng màu Ct ý tởng của thuật toán đơn giản nh sau: Xuất phát từ điểm trong P của vùng W kiểm tra 4 điểm lân cận của P là P 1 ,P 2 ,P 3 ,P 4 nếu điểm Pi ( i =14, ) không có mầu Cb thì tô Pi bằng Ct và lại coi Pi là điểm trong P của W, quá trình đợc lặp lại cho đến khi gặp màu biên Cb. Thuật toán ngắn gọn trên có thể đợc gọi là thuật toán vết dầu loang. Thuật toán ngắn gọn trên có thể mô tả bằng thủ tục đệ quy sau : Procedure Tomau(x,y,Cb,Ct: Integer); Begin If Color(x,y)<> Cb and Color(x,y)<>Ct Then Begin Putpixel (x,y,Ct); Tomau(x,y-1,Cb,Ct); Tomau(x,y+1,Cb,Ct); Tomau(x-1,y,Cb,Ct); Tomau(x+1,y,Cb,Ct); End; End; Chú ý : Thuật toán trên có u điểm là chơng trình ngắn gọn song do thủ tục đệ quy nên yêu cầu bộ nhớ rất lớn, nếu miền W có n điểm ảnh thì bộ nhớ cần n 4 . Vì vậy nếu vùng W quá lớn sẽ dẫn đến tràn bộ nhớ. Để khắc phục nhợc điểm này ta có thể cải tiến thuật toán nh sau: 1. Xác định Ymin, Ymax, Xmin, Xmax chứa vùng W 2. Từ điểm trong P di chuyển theo OX để tô các điểm có cùng toạ độ Y. Sau đó lại dịch chuyển theo OY Chơng trình minh hoạ : P Y X O Kü thuËt §å ho¹ m¸y tÝnh 92 Program Flood_Fill; Uses Crt,Graph; Var Gd,Gm : Integer; Procedure To_Mau(a,b,mv,mt : Integer); (* *) Procedure Tm(x,y,mv,mt,u : Integer); Var a1,a2,b,t,k,t1,t2 : Integer; Procedure Tim(a1,a2,b,mv,u : Integer;Var x : Integer); Var i : Integer; Begin x:=0; While GetPixel(a1,b+u)=mv Do Inc(a1); While GetPixel(a2,b+u)=mv Do Dec(a2); For i:=a1 To a2 Do Begin If (GetPixel(i,b+u)=mv) Then Begin x:=i;Break;End; End; End; Procedure Tim1(a1,a2,b,mv,u : Integer;Var x : Integer); Var i : Integer; Begin x:=0; For i:=a1 To a2 Do Begin If (GetPixel(i,b+u)<>mv) Then Begin x:=i;Break;End; End; End; Begin SetColor(mt); b:=y; Repeat a1:=x;a2:=x;t:=0;k:=0;t1:=0;t2:=0; While GetPixel(a1-1,b)<>mv Do Begin If GetPixel(a1,b+u)<>mv Then t:=a1; Dec(a1); End; While GetPixel(a2+1,b)<>mv Do Begin Kü thuËt §å ho¹ m¸y tÝnh 93 If GetPixel(a2,b+u)<>mv Then t:=a2; Inc(a2); End; Line(a1,b,a2,b); Tim(a1,a2,b,mv,1,k); If k<>0 Then Begin Tim1(k,a2,b,mv,1,t1); If (t1<>0)And(GetPixel(t1,b+1)<>mt) Then Tm(t1,b+1,mv,mt,1); Tim1(a1,k,b,mv,1,t2); If (t2<>0)And(GetPixel(t2,b+1)<>mt) Then Tm(t2,b+1,mv,mt,1); End; k:=0;t1:=0;t2:=0; Tim(a1,a2,b,mv,-1,k); If k<>0 Then Begin Tim1(a1,a2,b,mv,1,t1); If (t1<>0)And(GetPixel(t1,b+1)<>mt) Then Tm(t1,b+1,mv,mt,1); t1:=0; Tim1(k,a2,b,mv,-1,t1); If (t1<>0)And(GetPixel(t1,b-1)<>mt) Then Tm(t1,b-1,mv,mt,-1); Tim1(a1,k,b,mv,-1,t2); If (t2<>0)And(GetPixel(t2,b-1)<>mt) Then Tm(t2,b-1,mv,mt,-1); End; b:=b+u; If t<>0 Then x:=t; Until T=0; End; (* *) Begin Tm(a,b,mv,mt,1); Tm(a,b,mv,mt,-1); End; (* *) Begin Gd:=0; Initgraph(Gd,Gm,'C:\Tp\Bgi'); RanDomize; Line(50,50,600,400); Line(600,400,350,100); Line(350,100,550,250); Line(550,250,550,200); Line(600,300,550,200); Line(600,300,600,50); Line(500,150,600,50); Kỹ thuật Đồ hoạ máy tính 94 Line(500,150,450,30); Line(400,80,450,30); Line(50,50,400,80); Repeat To_Mau(250,70,White,RanDom(14)+1); settextjustify(1,1); settextstyle(1,0,2); Outtextxy(320,400,'Press ESCAPE to Exit'); Repeat Until KeyPressed; Until (KeyPressed)And(ReadKey=#27); CloseGraph; End. $17. Xử lý ký tự trên mn hình Để biểu diễn các ký tự trên màn hình ngời ta sử dụng 2 byte cho 1 ký tự một byte - mã (code) của ký tự một byte - thuộc tính (attribute) của ký tự. Mã của ký tự là một số trong tập từ 0-256 Byte thuộc tính dùng để xác định tính chất hiển thị của ký tự trên màn hình nh màu sắc, chế độ hiện nhấp nháy (Blink) Mỗi ký tự có khuôn mẫu của nó ngời ta gọi là shape hay pattern của ký tự. Khuôn mẫu của ký tự đợc lu trong máy bằng một số byte nào đó tuỳ thuộc vào khuôn mẫu của ký tự. Trong máy tính ngời ta dành 32 byte để lu giữ khuôn mẫu cho mọi ký tự. Ngời ta tạo các byte biểu diễn khuôn mẫu của một ký tự theo nguyên tắc sau: ở chế độ hộp ký tự 8x8: ở chế độ hộp ký tự 8x14 . Line(600,300 ,55 0,200); Line(600,300,600 ,50 ); Line (50 0, 150 ,600 ,50 ); Kỹ thuật Đồ hoạ máy tính 94 Line (50 0, 150 , 450 ,30); Line(400,80, 450 ,30); Line (50 ,50 ,400,80); Repeat To_Mau( 250 ,70,White,RanDom(14)+1);. Tm(a,b,mv,mt ,-1 ); End; (* *) Begin Gd:=0; Initgraph(Gd,Gm,'C:TpBgi'); RanDomize; Line (50 ,50 ,600,400); Line(600,400, 350 ,100); Line( 350 ,100 ,55 0, 250 ); Line (55 0, 250 ,55 0,200);. Đặt y min =y 1 ; y max =y 3 ; m=y max -y min +1 2. tính hệ số góc Cl=(x 4 -x 1 )/(y 4 -y 1 ) Cr=(x 3 -x 2 )/(y 3 -y 2 ) 2. Đặt y i =y min +(i-1) im=1, tính xx yyC i l i l =+ 11 (). xx yyC i r i r =+