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

ĐỒ HỌA MÁY TÍNH - XÉN HÌNH, TÔ MÀU potx

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 (1.02 MB, 13 trang )

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áiphảitrêndướ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=14){
//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=110){
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
VU;
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ênphảidướitrá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

×