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 c
Trang 1Trươ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
Trang 2Xé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
Trang 3Thuật toán Cohen–Sutherland
5
1
2
4
3
5
6
B
A
AB F Clip D
D
F Clip 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
Trang 4Thuật toán Liang-Barsky
7
D
A B A
A B A
y y t y y
x x t x x
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
A
x
x
p1 x
p2
y
p3 y
p4
m in 1
,q x A x
A
x x
q2 m ax
,
m in 3
A
y y
q4 m ax
,
1 0
4 , 1 ,
t
k q t
p k k
1 0
m ax
m in
m ax
m in
t
y y y t y y
x x x t x x
A B A
A B A
Đặ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
A
x
x
p1 x
p2
y
p3 y
p4
m in 1
,q x A x
A
x x
q2 m ax
,
m in 3
A
y y
q4 m ax
,
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
xm
ymax
xm
ymin
Cạnh trái
Cạnh phải
Cạnh dưới
Cạnh trên
B
x
p1
A
x
p2
B
y
p3
A
y
p4
Trang 5Thuậ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 α
Trang 6Xén đa giác vào hình chữ nhật
13
Ý tưởng Sutherland-Hodgeman
14
trên
dướ i
Trang 7Cắt dọc theo cạnh trên
15
1
4 5
6 7
8 9
10
A=10;
} else {
}
}
d
A=B;
D
A
1
B
C
4
5
6
7
8
9
D
U
U 1
Un
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
V U
V1
V n
Trang 8Cắt đôi?
18
1 2
6
5
Cắt thành 2 cái luôn à?
Xén đa giác vào đa giác
19
Trang 9Ui chao, dễ òm!
Xác định “trong”, “ngoài”?
20
A
(2,3)
B(7,9)
1
n
2
n
A B A B
A B A B
x x y y n
x x y y n
,
, 2
1
P (5,3) α
cos
n AP n AP
-0
A B A
y x n AP
AP
y x
AP , Giả sử:
: 0 cos
: 0 cos
: 0 cos
trong ngoài trên ngoài
trong
trên
Xác định mã
21
D
Bit: 3 2 1 0
x m
ymax
xm
ymin
P = 0;
if (xP < x min) P = P|1; // trái
P
if (xP > x max) P = P|2; //phải
if (yP < y min) P = P|4; //dưới
if (yP > y max) P = P|8; //trên
xP
yP xmin xmax
ymin ymax
P Tính mã
Trang 10Nộ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 x 42
• Đệ quy
• Khử đệ quy
4 p 2 3 1
Trang 11Thuật toán Loang – Đệ quy
24
{
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 x 6
x
x
y
3 4 5 6 7 8 9 0
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)
if [v S && ChưaTô(v)]
{
Thuật toán Loang – Khử đệ quy
25
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
}
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
(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)
Trang 12Thuật toán Loang – Khử đệ quy
26
if [v S && ChưaTô(v)]
{
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
Trang 13Thuật toán Dòng quét (Scan-line)
28
x 1
x 1
x 1
x 2
x 2 x 3
x 4
x 2 x 3
x1,x2,x3,x4,x5,x6 (x1,x2), (x3,x4 ), ( x5,x6)
xi xi+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ữ xi+1
Bài tập
29
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)
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