Chương 2: Các thuật toán tô màu
Chương 2 :
CÁC THUẬT TOÁN TÔ MÀU
2.1. Tổng quan
• Mục tiêu
Học xong chương này, sinh viên phải nắm bắt được các vấn đề sau:
- Hiểu được khái niệm về không gian màu RGB,CMY, HSV.
- Thiết kế và cài đặt được các giải thuật tô màu.
• Kiến thức cơ bản cần thiết
Kiến thức tin học : lập trình cấu trúc dữ liệu, cách lưu trữ và xây dựng mãng dữ
liệu chứa các giao điểm của đường thẳng và đa giác.
Kỹ năng lập trình đệ qui, tạo stack khử đệ qui.
• Tài liệu tham khảo
Computer Graphics . Donald Hearn, M. Pauline Baker. Prentice-Hall, Inc.,
Englewood Cliffs, New Jersey , 1986 ( chapters 4, 78-103)
• Nội dung cốt lõi
- Trình bày các không gian màu RGB, CMY, HSV
- Giới thiệu các thuật toán tô màu bao gồm : tô đơn giản, tô theo đường biên và
tô scan-line
2.2. Các không gian màu
2.2.1. Không gian màu RGB (Red - Green - Blue)
Không gian màu RGB mô tả màu sắc bằng 3 thành phần chính là Red - Green
và Blue. Không gian này được xem như một khối lập phương 3 chiều với màu red là
trục x, màu Green là truc y, và màu Blue là trục z. Mỗi màu trong không gian này
được xác định bởi 3 thành phần R, G, B. Ứng với các tổ hợp khác nhau của 3 màu này
sẽ cho ta một màu mới (xem hình 2.1).
Trang 31
Chương 2: Các thuật toán tô màu
Hình 2.1 : Không gian màu RGB.
Green
Yellow
White
Cyan
(0,1,0)
(1,1,0)
(0,1,1)
(1,1,1)
Black
Blue
Magenta
Red
0
(0,0,1)
(1,0,1)
(
1,0,0)
x
z
Nhận xét :
Trong hình lập phương trên (xem hình 2.1), mỗi màu gốc (R,G,B) có các gốc
đối diện là các màu bù với nó. Hai màu được gọi là bù nhau khi kết hợp hai màu này
lại với nhau ra màu trắng. Ví dụ : Green - Magenta, Red - Cyan, Blue - Yellow.
2.2.2. Không gian màu CMY (Cyan - Magenta - Yellow)
Tương tự như không gian màu RGB nhưng 3 thành phần chính là Cyan - Magenta -
Yellow. Do đó, tọa độ các màu trong không gian CMY trái ngược với không gian
RGB. Ví dụ : màu White có các thành phần là (0,0,0), màu Black (1,1,1), màu Cyan
(1,0,0),....
2.2.3. Không gian màu HSV ( Hue - Saturation - Value )
Thực chất của không gian này là sự biến đổi của không gian RGB. Không gian
HSV được mô tả bằng lệnh lập phương RGB quay trên đỉnh Black. H (Hue) là góc
quay trục V (value) qua 2 đỉnh Black và White ( xem hình 2.2).
Các gía trị biến thiên của H, S, V như sau :
H (Hue) chỉ sắc thái có giá trị từ 0
0
- 360
0
.
S (Saturation) chỉ độ bảo hoà.
V (Value) có giá trị từ 0 - 1. Các màu đạt giá trị bảo hòa khi s = 1 và v = 1.
Trang 32
Chương 2: Các thuật toán tô màu
V
V
=
=
1
1
H
H
S
S
C
C
y
y
a
a
n
n
B
B
l
l
u
u
e
e
M
M
a
a
g
g
e
e
n
n
t
t
a
a
R
R
e
e
d
d
Y
Y
e
e
l
l
l
l
o
o
w
w
G
G
r
r
e
e
e
e
n
n
W
W
h
h
i
i
l
l
e
e
B
B
l
l
a
a
c
c
k
k
R
R
G
G
B
B
H
H
S
S
V
V
R
R
e
e
d
d
(
(
1
1
,
,
0
0
,
,
0
0
)
)
(
(
0
0
0
0
,
,
1
1
,
,
1
1
)
)
Y
Y
e
e
l
l
l
l
o
o
w
w
(
(
1
1
,
,
1
1
,
,
0
0
)
)
(
(
6
6
0
0
0
0
,
,
1
1
,
,
1
1
)
)
Hình 2.2 : Không gian màu HSV.
2.3. Các thuật toán tô màu
Tô màu một vùng là thay đổi màu sắc của các điểm vẽ nằm trong vùng cần tô.
Một vùng tô thường đựơc xác định bởi một đường khép kín nào đó gọi là đường biên.
Dạng đường biên đơn giản thường gặp là đa giác.
Việc tô màu thường chia làm 2 công đoạn :
. Xác định vị trí các điểm cần tô màu.
. Quyết định tô các điểm trên bằng màu nào. Công đoạn này sẽ trở nên phức tạp
khi ta cần tô theo một mẫu tô nào đó chứ không phải tô thuần một màu.
Có 3 cách tiếp cận chính để tô màu. Đó là : tô màu theo từng điểm (có thể gọi
là tô đơn giản), tô màu theo dòng quét và tô màu dựa theo đường biên.
2.3.1. Tô đơn giản
Thuật toán này bắt đầu từ việc xác định một điểm có thuộc vùng cần tô hay
không ? Nếu đúng là điểm thuộc vùng cần tô thì sẽ tô với màu muốn tô.
Trang 33
Chương 2: Các thuật toán tô màu
• Tô đường tròn
- Để tô đường tròn thì ta tìm hình vuông nhỏ nhất ngoại tiếp đường tròn bằng
cách xác định điểm trên bên trái (xc-r, yc-r) và điểm dưới bên phải (xc+r, yc+r) của
hình vuông (xem hình 2.2).
- Cho i đi từ xc-r đến xc+r
Cho j đi từ yc-r đến yc+r
Tính khoảng cách d giữa hai điểm (i,j) và tâm (xc,yc)
Nếu d<r thì tô điểm (i,j) với màu muốn tô
(0,0) xc - r
yc - r
xc xc + r
r
yc
yc + r
(xc,yc)
Hình 2.3 : đường tròn nội tiếp hình vuông.
• Tô đa giác
- Tìm hình chữ nhật nhỏ nhất có các cạnh song song với hai trục tọa độ chứa đa giác
cần tô dưa vào hai tọa độ (xmin, ymin), (xmax, ymax). Trong đó, xmin, ymin là
hoành độ và tung độ nhỏ nhất, xmax, ymax là hoành độ và tung độ lớn nhất của các
đỉnh của đa giác.
- Cho x đi từ xmin đến xmax, y đi từ ymin đến ymax (hoặc ngược lai). Xét điểm P(x,y)
có thuộc đa giác không ? Nếu có thì tô với màu cần tô (xem hình 2.4).
Trang 34
Chương 2: Các thuật toán tô màu
Ymax
Ymin
Y
Xmin Xmax
X
Hình 2.4 : đa giác nội tiếp hình chữ nhật.
Thông thường một điểm nằm trong đa giác thì số giao điểm từ một tia bất kỳ
xuất phát từ điểm đó cắt biên của đa giác phải là một số lẻ lần. Đặc biệt, tại các đỉnh
cực trị (cực đại hay cực tiểu ) thì một giao điểm phải được tính 2 lần (xem hình 2.5).
Tia có thể qua phải hay qua trái. Thông thường ta chọn tia qua phải.
Ví dụ : Xét đa giác gồm 13 đỉnh là P
0
, P
1
, ....., P
12
= P
0
(xem hình 2.5).
P
0
P
2
P
3
P
4
P
5
P
7
P
6
P
8
P
9
P
10
P
11
P
12
P
1
P
Q
Hình 2.5 : Đa giác có 13 đỉnh.
Lưu ý :
Trang 35
Chương 2: Các thuật toán tô màu
Gọi tung độ của đỉnh P
i
là P
i
.y . Nếu :
- P
i
.y < Min ( P
i+1
.y, P
i-1
.y) hay P
i
.y > Max ( P
i+1
.y, P
i-1
.y) thì P
i
là đỉnh cực trị ( cực
tiểu hay cực đại ).
- P
i-1
.y < P
i
.y < P
i+1
.y hay P
i-1
> P
i
.y > P
i+1
.y thì P
i
là đỉnh đơn điệu.
- P
i
= P
i+1
và P
i
.y < Min ( P
i+2
.y, P
i-1
.y) hay P
i
> Max ( P
i+2
.y, P
i-1
.y) thì đoạn
[P
i
,P
i+1
] là đoạn cực trị ( cực tiểu hay cực đại ).
- P
i
= P
i+1
và P
i-1
.y < P
i
.y < P
i+2
.y hay P
i-1
> P
i
.y > P
i+2
.y thì đoạn [P
i
,P
i+1
] là
đoạn đơn điệu.
• Thuật toán kiểm tra điểm có nằm trong đa giác
- Với mỗi đỉnh của đa giác ta đánh dấu là 0 hay 1 theo qui ước như sau: nếu là đỉnh
cực trị hay đoạn cực trị thì đánh số 0. Nếu là đỉnh đơn điệu hay đoạn đơn điệu thì đánh
dấu 1.
- Xét số giao điểm của tia nữa đường thẳng từ P là điểm cần xét với biên của đa giác.
Nếu số giao điểm là chẳn thì kết luận điểm không thụôc đa giác. Ngược lại, số giao
điểm là lẻ thì điểm thuộc đa giác.
• Minh họa thuật toán xét điểm thuộc đa giác
function PointInpoly(d: dinh; P: d_dinh; n: integer): boolean;
var count, i: integer;
x_cut: longint;
function next(i: integer): integer;
begin
next := (i + n + 1) mod n
end;
function prev(i: integer): integer;
begin
prev := (i + n - 1) mod n
end;
begin
count := 0;
for i := 0 to n-1 do
Trang 36