4/4/2011
1
Tr ương Văn Quốc Nhật
1
CH 2. XÉN HÌNH, TÔ MÀU
Nội dung
2
Xén hình
1. Xén đoạn thẳng vào hình chữ nhật
Cohen–Sutherland, Thuật toán Chia nhị phân, Liang–Barsky
2. Xén đoạn thẳng vào hình tròn
3. Xén đường tròn vào hình chữ nhật
4. Xén đa giác vào hình chữ nhật
5. Xén đa giác vào đa giác
Tô màu
1. Thuật toán Loang
2. Thuật toán Dòng quét (Scan-line)
Bài tập
4/4/2011
2
Xén (clipping)
3
1. Xén đoạn thẳng vào hình chữ nhật
4
1
2
4
3
5
6
• Thuật toán Chia nhị phân
• Cohen–Sutherland
• Liang–Barsky
4/4/2011
3
Thuật toán Cohen–Sutherland
5
1
2
4
3
5
6
• A = B = 0000 AB D
B
A
ABFClip
D
• A & B ≠ 0000 AB D
D
FClip
D
• A & B = 0000 và A | B ≠ 0000:
Xét A (giả sử A nằm ngoài):
Thay A bởi giao của AB
với cạnh trái nối dài
Thay A bởi giao của AB
với cạnh phải nối dài
Thay A bởi giao của AB
với cạnh dưới nối dài
Thay A bởi giao của AB
với cạnh trên nối dài
Bit: 3 2 1 0
Thuật toán Chia nhị phân
6
2
4
3
6
D
1
5
Bit: 3 2 1 0
4/4/2011
4
Thuật toán Liang-Barsky
7
D
ABA
ABA
yytyy
xxtxx
Ptrình tham số:
Thứ tự cắt:
tráiphảitrêndưới
1
3
2
4
1
3
2
1
1
2
Cohen- : Cập nhật y
Liang- : Cập nhật t
Bit:
3 2 1 0
AB
xxx
AB
yyy,
xp
1
xp
2
yp
3
yp
4
min1
, xxq
A
A
xxq
max2
,
min3
, yyq
A
A
yyq
max4
,
10
4,1,
t
kqtp
kk
10
maxmin
maxmin
t
yyytyy
xxxtxx
ABA
ABA
Đặt:
CÝ:
0
k
p
0
k
p
0
k
p
: AB // 1 cạnh
: ngoài trong
(trái)
(phải)
(dưới)
(trên)
: trong ngoài
Kiểm tra…
8
D
AB
xxx
AB
yyy,
xp
1
xp
2
yp
3
yp
4
min1
, xxq
A
A
xxq
max2
,
min3
, yyq
A
A
yyq
max4
,
Đặt:
0
k
p
0
k
p
0
k
p
: AB // 1 cạnh
: ngoài trong
(trái)
(phải)
(dưới)
(trên)
: trong ngoài
x
min
y
max
x
max
y
min
Cạnh trái
Cạnh phải
Cạnh dưới
Cạnh trên
BA
xxp
1
AB
xxp
2
BA
yyp
3
AB
yyp
4
-
+
-
+
+
-
+
-
-
++
-
+
+
4/4/2011
5
11
Thuật toán Liang-Barsky
t
0
=0; dx=x
B
-x
A
;
t
1
=1; dy=y
B
-y
B
;
for (canh=14){
//duyệt lần lượt các cạnh
//0.tính p,q,r
//1.cạnh song song ko vẽ
//2.ngoài trong
//nằm ngoài ko vẽ
//xén được 1 tí
//3.trong ngoài
//nằm ngoài ko vẽ
//xén được 1 tí
switch (canh){
1: p=-dx; q=x
A
-x
min
;
2: p=dx; q=x
A
-x
min
;
3: p=-dy; q=x
A
-x
min
;
4: p=dy; q=x
A
-x
min
;
}
r=q/p;
}
if (p<0){
} else if (p>0) {
}
x
0
=x
A
+t
0
*dx; y
0
=y
A
+t
0
*dy;
x
1
=x
A
+t
1
*dx; y
1
=y
A
+t
1
*dy;
return đoạn:(x0,y0)(x1,y1);
if (p=0 && q<0) return ;
if (r>t
1
) return ;
if (r>t
0
) t
0
=r;
if (r<t
0
) return ;
if (r>t
1
) t
1
=r;
Xén đoạn thẳng vào HCN xiên
12
α
α
xoay
-α
cắt
xoay
α
4/4/2011
6
Xén đa giác vào hình chữ nhật
13
Ý tưởng Sutherland-Hodgeman
14
trên
dưới
phải
trái
4/4/2011
7
Cắt dọc theo cạnh trên
15
1
2 3
4
5
6
7
8
9
10
A=10;
for (B=110){
if (B trong){
} else {
}
}
d
A=B;
if (A ngoài) Thêm(AB∩d);
Thêm(B);
if (A trong) Thêm(AB∩d);
A B
C
D
A
1
B
C
4
5
6
7
8
9
D
U
U
1
U
n
Thuật toán Sutherland-Hodgeman
17
VU;
A=V
n
;
for (B = V
1
V
n
){
}
if (B trong){
} else {
}
if (A ngoài) ném(AB∩cạnh);
ném(B);
if (A trong) ném(AB∩cạnh);
A=B;
for (cạnh = trênphảidướitrái){
}
U = danh_sách_đỉnh_đa_giác;
//cý: sau mỗi lần cắt, n có thể thay đổi
//lúc này: V đầy, U rỗng
VU
V
1
V
n
4/4/2011
8
Cắt đôi?
18
12
3 4
6
5
Cắt thành 2 cái
luôn à?
Xén đa giác vào đa giác
19
4/4/2011
9
Ui chao, dễ
òm!
Xác định “trong”, “ngoài”?
20
A
(2,3)
B(7,9)
1
n
2
n
ABAB
ABAB
xxyyn
xxyyn
,
,
2
1
P
(5,3)
α
cosnAPnAP
n
+
-
0
ABAB
xxyyyxnAP
AP
yxAP ,
Giả sử:
:0cos
:0cos
:0cos
trong
ngoài
trên
ngoài
trong
trên
Xác định mã
21
D
Bit: 3 2 1 0
x
min
y
max
x
max
y
min
P = 0;
if (x
P
< x
min
) P = P|1; //trái
P
if (x
P
> x
max
) P = P|2; //phải
if (y
P
< y
min
) P = P|4; //dưới
if (y
P
> y
max
) P = P|8; //trên
x
P
y
P
x
min
x
max
y
min
y
max
P
Tính mã
4/4/2011
10
Nội dung
22
Xén hình
1. Xén đoạn thẳng vào hình chữ nhật
Cohen–Sutherland, Thuật toán Chia nhị phân, Liang–Barsky
2. Xén đoạn thẳng vào hình tròn
3. Xén đường tròn vào hình chữ nhật
4. Xén đa giác vào hình chữ nhật
5. Xén đa giác vào đa giác
Tô màu
1. Thuật toán Scanline
2. Thuật toán Loang
Bài tập
Thuật toán Loang – Ý tưởng
23
5 1 3 9
12 4 10 19
22 11 20 33
36 21 34
39 25 13
38 24
37
26
28 14 27
16 6 15 29
8 2 7 17
41
40 23
18 31
32
30
35
x
x42
• Đệ quy
• Khử đệ quy
4 p 2
3
1
4/4/2011
11
Thuật toán Loang – Đệ quy
24
Loang(x,y,mau)
{
if [(x,y) S && ChưaTô(x,y)]
{
Tô(x,y);
Loang(x,y-1,mau);
Loang(x+1,y,mau);
Loang(x,y+1,mau);
Loang(x-1,y,mau);
}
}
10 1 14
11 12 13
5
7 4 17
8 3 16
9 2 15
x
x6
x
x
y
5 6 7
3
4
5
6
7
8
9
0
Loang(6,8)
Loang(6,8,đỏ)Gọi:
Loang(6,7)
Loang(7,8)
Loang(7,9)
Loang(5,8)
Loang(6,6)
Loang(7,7)
Loang(6,8)
Loang(5,7)
Loang(6,5)
Loang(7,6)
Loang(6,7)
Loang(5,6)
Loang(6,4)
Loang(7,5)
Loang(6,6)
Loang(5,5)
Loang(6,3)
Loang(7,4)
Loang(6,5)
Loang(5,4)
Loang(5,3)
Loang(6,4)
Loang(5,5)
Loang(4,4)
Stack
if [v S && ChưaTô(v)]
{
Thuật toán Loang – Khử đệ quy
25
Vào: x
0
,y
0
,mau
Tô(x
0
,y
0
); Q = {(x
0
,y
0
)};
while (Q ≠ Ф)
{
Pop(p);//lấy p từ Q
for ( v = Kề(p))
}
Ví dụ: (x
0
,y
0
)=(4,5)
Tô(v);
Push(v);//đưa v vào Q
}
5 1 3 9
12 4 10 20
23 11 21 x
x 22 x
x 25 13
x 24
x
x
x 14 x
16 6 15 x
8 2 7 17
x
x 18
19 x
x
x
x
x
y
1 2 3
3
4
5
6
7
8
9
0
2
1
0 4 5 6 7 8
(4,5)
(4,4)
(5,5)
(4,6)
(3,5)
(4,3)
(5,4)
(3,4)
(6,5)
(5,6)
(4,7)
(3,6)
(2,5)
(4,2)
(5,3)
(3,3)
(6,4)
(2,4)
(7,5)
(6,6)
(5,7)
(4,8)
(3,7)
(2,6)
(1,5)
Queue
4/4/2011
12
Thuật toán Loang – Khử đệ quy
26
if [v S && ChưaTô(v)]
{
Vào: x
0
,y
0
,mau
Tô(x
0
,y
0
);
Q = {(x
0
,y
0
)};
while (Q ≠ Ф)
{
Pop(p);//lấy p từ Q
for ( v Kề(p))
}
Tô(v);
Push(v);//đưa v vào Q
}
if [(v
x
,v
y
) S && ChưaTô(v
x
,v
y
)]
{
Tô(x
0
,y
0
); dau=cuoi=0;
Q
x
[0]=x
0
; Q
y
[0]= y
0
;
while (dau ≤ cuoi)
{
P
x
=Q
x
[dau];
P
y
=Q
y
[dau]; dau++; //lấy p từ Q
for ( (v
x
,v
y
) Kề(p
x
,p
y
))
}
Tô(v
x
,v
y
);
cuoi++;
Q
x
[cuoi]=v
x
;
Q
y
[cuoi]=v
y
;//đưa v vào Q
}
27
4/4/2011
13
Thuật toán Dòng quét (Scan-line)
28
x
1
x
1
x
1
x
2
x
2
x
3
x
3
x
4
x
4
x
3
x
4
x
1
x
2
x
2
x
3
x
1
,x
2
,x
3
,x
4
,x
5
,x
6
(x
1
,x
2
), (x
3
,x
4
), ( x
5
,x
6
)
x
i
x
i+1
x
2
x
1
- Dòng quét cắt đứt 2 cạnh liên tiếp bỏ x
i+1
- Dòng quét xẹt qua 2 cạnh liên tiếp giữ x
i+1
Bài tập
29
1. Bắt buộc (2 tuần):
Xây dựng (nếu có) & Cài đặt các thuật toán :
Xén đoạn thẳng vào hình chữ nhật (Cohen–Sutherland,
Liang-Barsky)
Xén đa giác vào hình chữ nhật (Sutherland-Hodgeman)
Tô màu Loang (đệ quy, khử đệ quy)
Mỗi thuật toán vẽ là 1 phương thức, gộp vào 1 file mã nguồn
(đuôi là cs).
2. Không bắt buộc (thoải mái):
Xây dựng (nếu có) & Cài đặt các thuật toán:
Xén đoạn thẳng vào HCN xiên
Xén đa giác vào đa giác (Sutherland-Hodgeman)
Tô màu dòng quét