Tải bản đầy đủ (.pdf) (6 trang)

Đồ họa máy tính - Chương 5 Tô màu, Font chữ - Bài 16 pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (243.13 KB, 6 trang )

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

×