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

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

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 (263.24 KB, 6 trang )

Kỹ thuật Đồ hoạ máy tính
84

Chơng 5
tô mu, Font chữ
$15. Các thuật toán về đa giác
Trong kỹ thuật đồ hoạ có nhiều bài toán phức tạp đợc chuyển về các bài toán về đa
giác chính vì vậy trong phần này chúng ta sẽ khảo sát một số thuật toán liên quan
đến đa giác
Định nghĩa 1:
Một đa giác n đỉnh gọi là đa giác lồi nếu đoạn thẳng chứa hai điểm bất kỳ của đa
giác nằm trong đa giác

Định nghĩa 2:
Đa giác thông thờng là đa giác có n đỉnh, n cạnh, mỗi đỉnh là điểm đầu của một
cạnh và điểm cuối của một cạnh khác. Mỗi đỉnh không phải là điểm xuất phát của 2
cạnh, các cạnh đa giác không cắt nhau ở các điểm nào khác trên đỉnh của nó
1. Xác định điểm trong hay ngoài đa giác
Bài toán :
Cho một đa giác thờng và một điểm P hãy xác định P là điểm trong hay điểm ngoài
của đa giác
Thuật toán thứ nhất:
Giả sử đa giác W có các đỉnh P
1
,P
2
Pn đợc đánh số theo chiều kim đồng hồ
Nối P với tất cả các đỉnh P
1
,P
2


Pn của đa giác W. Ta gọi i là góc tạo bởi PPi và
PPi+1
i=1,2 n+1 (P
n+1
=P1)
E
Y
X
D
A
X
Y
B
C

Kỹ thuật Đồ hoạ máy tính
85
Góc i có dấu + nếu PPi dịch chuyển theo chiều kim đồng hồ tuỳ với PPi+1, ngợc
lại i có dấu - khi đó nếu

i
O
i
n
=
=

360
1


thì P là điểm trong của đa giác nếu

i
i
n
=
=

0
1
thì P nằm ngoài đa
giác

Thuật toán 2:
Để xác định P là điểm trong hoặc ngoài của đa giác ta có thể thực hiện theo thuật
toán khác
Giả sử cho đa giác W và P là điểm bất kỳ để xác định P là điểm trong hay ngoài đa
giác ta thực hiện các bớc sau: theo hớng
Bớc 1: Từ P kẻ nửa đờng thẳng s tuỳ ý không giảm tổng quát có thể chọn hớng //
với trục OX và phía phải
Bớc 2: Tính số giao điểm của N của nửa đờng thẳng l với các cạnh của đa giác
Bớc 3: Kiểm tra nếu N chẵn P nằm ngoài, nếu N lẻ P nằm trong
Ví dụ:


5
P
5
P
1


4
P
4

1

3

2
P
2
P
3
P
3
P
3
P
5
P
4
P
4
P
2
P
2
P
1

P
1
+
+
P

P
6
l
l
P
P

Kỹ thuật Đồ hoạ máy tính
86
Chú ý:
1. Để tính điểm giao của nửa đờng thẳng l với các cạnh của đa giác ta không cần
phải tìm điểm giao của l với tất cả các cạnh của đa giác, có thể cải tiến để thuật toán
làm việc nhanh hơn dựa vào nhận xét sau:
Giả sử P có toạ độ (xo,yo) và Pi có toạ độ (xi,yi),
in= 1, .
Cạnh (Pi,P
i+1
) không cần phải tính điểm giao với l nếu max(x
i
,x
i+1
)<x
o


Cạnh Pi P
i+1
có giao với l nếu:
min(x
i
,x
i+1
)>x
o

và (y
i
-y
o
)(y
i+1
-y
o
)<0
2. Thuật toán dùng nửa đờng thẳng l không giải quyết đúng khi l đi qua một đỉnh
nào đó của đa giác. Để khắc phục tình trạng này ta có thể đánh số các cạnh của đa
giác theo chiều kim đồng hồ và coi các cạnh của đa giác là các đoạn thẳng đứng một
đầu và mở đầu kia
P
4
P
5
P
3
P

P
2
P
1


3. Thuật toán sử dụng nửa đờng thẳng l không giải quyết đúng khi rơi vào các
trờng hợp sau:
P
6
P
1
l
P
5
P
l
P
3
P
2

N chẵn song P thuộc W
Tóm lại thuật toán 2 không phải là thuật toán tổng quát để giải quyết bài toán xác
định P là điểm trong hay ngoài đa giác
Chơng trình tự lập xem nh bài tập
Kỹ thuật Đồ hoạ máy tính
87
2. Thuật toán phân chia đa giác
a. Hình thang cơ bản

Hình thang cơ bản là hình thang có dạng sau
Hình thang cơ bản là hình thang trong đó có 2 cặp đỉnh có cùng toạ độ y
(x
1
,y
1
)
(x
4
,y
4
)
(x
3
,y3)
(x
2
,y
2
)
(x
1
,y
1
)
(x
2
,y
2
)

(x
4
,y
4
) (x
3
,y3)

Nếu x
3
=x
4
hoặc x
1
=x
2
thì hình thang cơ bản biến dạng thành tam giác do đó tam
giác là một hình thang cơ bản
Hình thang cơ bản là một đa giác đơn giản nhất, việc tô màu trên nó chẳng hạn là rất
đơn giản, vì vậy ta phải cần phân chia một đa giác thành tổng các hình thang cơ bản.
b. Phân chia đa giác thành các hình thang cơ bản
Bài toán : Cho W là một đa giác thờng. Hãy phân chia đa giác thành tổng các hình
thang S1, S2, , Sm sao cho :
WS S S
SS ij mij
m
ij
=
= =
12

1

,,


+ Thuật toán Brasel và Fagrat :
(x
3
,y
3
)
(x
4
,y
4
)
(x
1
,y
1
)
(x
2
,y
2
)
(x
1
,y
1

)
(x
1
,y
1
)
(x
3
,y
3
)
(x
3
,y
3
)
(x
2
,y
2
)
(x
2
,y
2
)

Kỹ thuật Đồ hoạ máy tính
88
Giả sử các đỉnh của đa giác W là Wi=(xi,yi), i=1,2, ,n. Các đỉnh của đa giác đợc

đánh số theo chiều ngợc kim đồng hồ sao cho phần thuộc đa giác luôn luôn nằm về
phía của canh WiWi+1. Nếu không chúng ta đánh số lại các đỉnh để đạt đợc điều
này
để đơn giản cho việc trình bày thuật toán ta giả sử W không có các cạnh // với Ox
Bớc 1
: thực hiện phân chia các đỉnh của đa giác thành 3 loại sau :
+ Đỉnh Wk=(x
k
,y
k
) gọi là đỉnh lồi nếu có 2 đỉnh Wk-1=(x
k-1
,y
k-1
), Wk+1=(x
k+1
,y
k+1
)
thoả mãn điều kiện y
k-1
>y
k
; y
k+1
>y
k
.
+ Đỉnh Wk=(xk,yk) gọi là đỉnh lõm nếu có 2 đỉnh Wk-1=(x
k-1

,y
k-1
),
Wk+1=(xk+1,yk+1) thoả mãn điều kiện yk-1<yk; yk+1<yk.
+ Đỉnh Wk=(x
k
,y
k
) là đỉnh bình thờng nếu nó không lồi, không lõm.
Ví dụ trong đa giác trên
W
5
là đỉnh lồi
W
4
,W
6
là đỉnh lõm
W
1
,W
2
,W
3
là đỉnh thờng
Bớc 2:
Từ đỉnh W
k
k=1,n của đa giác kẻ các đờng thẳng y=y
k

, giả sử P
1
,P
2
Pl là giao của đờng thẳng với các cạnh của đa giác W và giả sử
Pi=(x'
i
,y
k
) i=1,2, ,l
và x'
1
<x'
2
< <x'
l
Nếu các giao điểm Pi trùng với các đỉnh lồi hoặc lõm ta bỏ qua không xem là giao
điểm của y=y
k
với đa giác
Nếu giao điểm Pi của y=yk rơi vào đỉnh thờng, ta tính là 1 lần cắt với đa giác. Với
cách tính nh vậy đờng thẳng y=y
k
luôn luôn cắt đa giác W một số chẵn lần, gọi
số lần cắt là 2m. Khi đó các đoạn thẳng (P
1
,P
2
),(P
3

,P
4
) (P
2m-1
P
2m
) là các đoạn
nằm trong đa giác. Các đoạn thẳng (P
2
,P
3
),(P
4
,P
5
) (P
2m-2
P
2m-1
) là các đoạn
nằm ngoài đa giác
W1
W2
W3
W4
W5
W1
W2
W3
W4

W6
W5
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

×