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
Trang 184
Chương 5
tô mμu, 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 P1,P2 Pn được đánh số theo chiều kim đồng hồ Nối P với tất cả các đỉnh P1,P2 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 (Pn+1 =P1)
E
Y X
D
Y
Trang 2Gó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
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ụ:
P4
α2
P2
P3
P3
P3
P5 P4
P4 P2
P2
P1
P1
+
+
P
P6
l l
P P
Trang 386
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), i = 1, n
Cạnh (Pi,Pi+1) không cần phải tính điểm giao với l nếu max(xi,xi+1)<xo
Cạnh Pi Pi+1 có giao với l nếu:
min(xi,xi+1)>xo
và (yi-yo)(yi+1-yo)<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
P4 P5
P3 P
P2 P1
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:
P6 P1
l P5
P
l P3
P2
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
Trang 42 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
(x1,y1)
(x4,y4) (x3,y3)
(x2,y2) (x1,y1) (x2,y2)
Nếu x3=x4 hoặc x1=x2 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 :
m
i j
= ∪ ∪ ∪
1 2
1
, , + Thuật toán Brasel và Fagrat :
(x3,y3) (x4,y4)
(x3,y3) (x3,y3) (x2,y2)
(x2,y2)
Trang 588
đá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=(xk,yk) gọi là đỉnh lồi nếu có 2 đỉnh Wk-1=(xk-1,yk-1), Wk+1=(xk+1,yk+1) thoả mãn điều kiện yk-1>yk; yk+1>yk
+ Đỉnh Wk=(xk,yk) gọi là đỉnh lõm nếu có 2 đỉnh Wk-1=(xk-1,yk-1),
Wk+1=(xk+1,yk+1) thoả mãn điều kiện yk-1<yk; yk+1<yk
+ Đỉnh Wk=(xk,yk) 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
W5 là đỉnh lồi W4,W6 là đỉnh lõm W1,W2,W3 là đỉnh thường
Bước 2: Từ đỉnh Wk k=1,n của đa giác kẻ các đường thẳng y=yk , giả sử P1,P2
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,yk) 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=yk 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=yk 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 (P1,P2),(P3,P4) (P2m-1 P2m) là các đoạn nằm trong đa giác Các đoạn thẳng (P2,P3),(P4,P5) (P2m-2 P2m-1) là các đoạn nằm ngoài đa giác
W1
W2
W3
W4 W5
W1
W2
W3
W4 W6
W5
Trang 6Cá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 (P1,P2), (P3,P4) .(P2n-1, P2m) 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ô mμu
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:
Thuật toán như sau:
1 Đặt ymin=y1; ymax=y3; m=ymax-ymin+1
2 tính hệ số góc Cl=(x4-x1)/(y4-y1)
Cr=(x3-x2)/(y3-y2)
2 Đặt yi=ymin+(i-1) i =1, m
tính xl=x +(y ưy ).C
W8 W1
W1
W7
W6 W2
W4
W5 1
2
3 W2
3 2
4
7
9
5 5
W4 6
W3