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 P1,P2, P3,P4 ...P2n-1, P2m 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
Trang 1Cá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 (P1,P2), (P3,P4) .(P2n-1, P2m) 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ô mμu
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:
(x4y4) (x3y3)
Thuật toán như sau:
1 Đặt ymin=y1; ymax=y3; m=ymax-ymin+1
2 tính hệ số góc Cl=(x4-x1)/(y4-y1)
Cr=(x3-x2)/(y3-y2)
=1,
W8 W1
W1
W7
W6 W2
W4
W5 1
2
3 W2
3 2
4
7
9
5 5
W4 6
W3
Trang 23 Kẻ đoạn thẳng (x yil, ) , (x y, )
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 x1=x2, y1=y2
(x3y3) (x4y4)
(x1y1) khi đó:
xil=xil−1+Cl
xir =xir−1+Cr
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
Trang 3Bà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à P1,P2,P3,P4 nếu điểm Pi (i =1 4 , ) 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 n4
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
Trang 4Program 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);
Trang 5If 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);
Trang 6Line(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 mμn 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 lưu 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 để lưu 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