CÁC THUAT TOÁN CHO DOI TƯỢNG HÌNH HỌC
5.2.2 Chiến lược chia để trị : Ví dụ nửa mặt phăng giao nhau
Nội dung của chiến lược chia dé trị như sau : Dé giải một bài toán kích thước n, ta chia bài toán đã cho thành một số bai toán con có kích thước nhỏ hơn. Giải các bài toán toán con nay roi tông hợp kết quả lại dé được lời giải của bài toán ban đầu.
Chiến lược chia để trị bao gồm hai bước :
¢ Bước | : Phan tích bai toán đã cho thành những bài toán con đủ nhỏ mà giải
quyết một cách dé đảng.
¢ Bude 2 : Tông hợp kết quả từ các bài toán con để có được lời giải của bài toán ban đầu.
Ở đây, ta minh họa chiến lược chia dé trị với bai toán trình bay sự giao nhau của một tập các nửa mặt phẳng. Dé đơn giản, ta thừa nhận kết quả la một da giác lồi và đa giác kết quả được giả sử là luôn luôn chứa trong không gian R (R lả một hình chữ nhật). Ba bước trong chiến lược được phác họa như sau :
¢ Xây dựng cấu trúc : Tập của n nửa phẳng được chia đôi đệ quy cho đến khi
Hình 34 : Minh họa thuật toán nửa phẳng giao nhau.
Thuật toán như sau :
HalfPlanelnter (S : Tập của các nửa phẳng): Da giác lôi
Begin
-57-
If( Card(S) > 2 ) then
Return HalfPlanelnter(S/2) ơ HalfPlanelnter(S - S/2)
Else
Retun S OR End
End
5.2.3 Phương thức Đường quét : Vi dụ hình chữ nhật giao nhau
Ta sẽ minh họa kỳ thuật sử dụng đường quét dựa vào một ví dụ như sau :
Cho một tập S gồm n hình chữ nhật mà các cạnh của mỗi hình tương ứng song song
với các trục tọa độ. Tim và liệt kê tất cả các cặp hình chữ nhật giao nhau. Ching
hạn tập S được cho như hình sau (gồm 7 hình chữ nhật) :
Hình 35 : Minh họa thuật toán dùng đường quét.
Kết quả của thuật toán sử dụng đường quét / cho bài toán trên là : Các cặp
hình chữ nhật giao nhau bao gồm 5 cặp là (E,C); (B,C); (B.A); (D,B) và (G,B).
Gọi £ là tập vị trí của các cạnh trái và cạnh phải của các hình chữ nhật được
sắp thứ tự theo hoanh độ x (một hình chữ nhật sẽ có một cạnh trái ứng với x„... và
một cạnh phải ứng với x„„). Và L là tập lưu trữ các hình chữ nhật được quẻt bởi
đường quét /. Khi đó thuật toán hoạt động như sau :
Rectanglelntersection ( S : Tập hợp hình chữ nhật) Begin
Sắp xếp 2n các giá tri x„„ và x„„ của S theo thứ tự trong £
L=¢ // L là tập rỗng
While(é z ý ) do Begin
p CMin (£) // Được lẫy ra lần lượt trong £
if (p là cạnh trái của một hình chữ nhật r) then
bcgin
Insert (r,L) // Thêm hình chữ nhật r vào L
Tim và ghi ra những hình chữ nhật trong L. mà giao với
hình chữ nhật r.
end
if (p là cạnh phải của hình chữ nhật r) then Delete (r,L) /í Loại bỏ r khỏi L
end // của while end.
Mô tả cách hoạt động của thuật toán trong ví dụ trên :
Sắp xếp 14 vị trí các cạnh trái và phải của 7 hình chữ nhật theo thứ tự x.
Đầu tiên L là một tập rỗng
Đường quét / đầu tiên ở vị trí cạnh trái của hình chữ nhật A và C (vì hai hình
này có cùng x,,,. ). Cạnh trai này được gan cho p.
Vi p là cạnh trái của 2 hình chữ nhật A và C nên 2 hình này được đưa vào tập L. Tới đây trong L có 2 hình chữ nhật là A và C.
Không có hình chữ nhật nào trong L giao với A và C nên ta tiếp tục vòng
lặp.
Đường quét / tiếp tục quét đến vị trí kế tiếp là cạnh trái của hình chữ nhật E.
Tới đây ta có thêm hình chữ nhật E vào L.
Trong L bây giờ có hình chữ nhật C giao với E, nên ta được một cặp hình
chữ nhật giao nhau dau tiên là (E,C).
- 59 -
© Đường quét / tiếp tục quét đến vị trí kế tiếp là cạnh trái của hình chữ nhật B.
Ta lại thêm B vào L. L bây giờ gồm A, B, C, E.
e A vàC trong L giao với B, nên ta có thêm hai cặp giao nhau nữa là (B.A) và
(B,C).
© Đường quét / tiếp tục quét dén vị trí kế tiếp là cạnh phải của hình chữ nhật
A. Như vậy A bị loại ra khỏi L. L bây giờ gồm B, C, E.
© Dường quét / tiếp tục quét đến vị trí kế tiếp là cạnh phải của hình chữ nhật
C. C bị loại ra khỏi L. L gồm B và E.
© Cứ như vậy, đường | quét cho đến hết 14 vị trí. Lúc đó vòng lặp while kết
thúc, Va ta thu được kết quả gồm các cặp hình chữ nhật giao nhau như đã
trình bày ở trên.
Š.3 Phân chia đa giác
5.3.1 Hình thang hóa một đa giác đơn
Hình thang là một tứ giác có ít nhất hai cạnh song song với nhau. Một tam
giác có thé được xem như là một hình thang thoái hóa với một cạnh không độ dai
(null — length).
Thuật toán hình thang là thuật toán chia một đa giác đơn thành các hinh thang dựa vào các đỉnh của đa giác. Thuật toán này hoạt động dựa trên kỹ thuật sử
dụng đường quét mà ta mới trình bay ở trên. Ta có thé sử dụng thuật toán
Rectanglelntersection đề phân chia đa giác thành các hình thang với một số thay đổi
như sau :
£ là danh sách các đỉnh của đa giác được sắp xếp theo tọa độ x.
L là tập các cạnh dang bị cắt bởi đường quét.
Đoạn nhìn thay được (Visibility segment) là đoạn sinh bởi đường quét, vẽ tir
một đỉnh tới một cạnh và nằm hoan toán trong đa giác. Có thé có 2 đoạn như vậy,
hoặc 1 hoặc không có như hinh dưới đây (có 2 là đỉnh v,; 1 là đỉnh vị; ; và đỉnh v ;
thi không có).
V\sfltty
M)
Hình 36 : Hình thang hóa một đa giác đơn
Hình thang được tách ra từ đa giác như sau : Doan thay được tử đỉnh v tới giao điểm với cạnh e, gọi là i, là cạnh thẳng đứng đầu tiên của hình thang. Tiếp theo e tử ¡ tới điểm bên trái của nó là cạnh thứ hai. Cạnh thứ hai thăng đứng của hình
thang là đoạn thấy được của trường hợp trước đó,...Cứ như vậy ta phân chia đa giác ban đầu thành các hình thang theo kỹ thuật đường quét.
5.3.2 Tam giác hóa một đa giác đơn
Tam giác hóa một đa giác đơn là việc phân chia một đa giác đơn ra thành các tam giác. Quá trình này được chia ra thành hai công đoạn :
¢ Chia một đa giác đơn P ra thành các đa giác đơn điệu.
e© Tam giác hóa mỗi đa giác đơn điệu.
Phân chia đa giác đơn thành các đa giác đơn điệu :
- 61 -
Chia một đa giác đơn ra thành các thành phân đơn điệu giống như thuật toán
hình thang hóa một đa giác đơn. Quá trình thực hiện như sau :
e Chia đa giác thành các thành phần đơn điệu tại các “dinh quay ve” (return
vertices). Những điểm trở lại là những khía hình chữ V ma hai cạnh gắn liền với nó nằm cùng một bên của đường thằng đứng đi ngang qua đỉnh chung
của chúng.
e Áp dụng cho một hinh thang “thang đứng”, như trong hình dưới
Hình 38 : Chia đa giác đơn thành các thành phần đơn điệu.
Có một hình thang bên trái của khía r, và một hình thang bên phải của khía
r,. Chúng ta đã thu được các thành phần đơn điệu bằng việc tạo ra các đường
chéo từ các hình thang này. Chúng ta đã chia ra từ đa giác một thành phần đơn điệu là A bằng cách vẽ một đường chéo giữa v và r,. Kế tiếp, bằng cách vẽ một
đường chéo giữa đình trở lại thứ hai lar, và đỉnh w, chúng ta đã chia đa giác ra
thêm hai thành phan đơn điệu là B và C.
Tam giác hóa đa giác đơn điệu :
Thuật toán tam giác hóa gồm các công việc như sau :
© Quét theo thứ tự các đỉnh được sắp sếp của đa giác P.
e Giữ lại một danh sách L các đỉnh đã được đường quét quét qua rối nhưng
tam giác chưa được tạo ra.
-62-
¢ Loai ra các điểm trong L. khi một tam giác được tạo.
Ta minh họa quá trình này bằng vi dụ như hình sau : Ba bước dau tiên thực hiện
như sau ;
se Ba điểm dau tiên trên cùng một đường gap khúc (chain). Góc lỗi abe cho phép hai điểm a và c nỗi với nhau bằng một đường chéo. Điểm b bị loại ra khỏi L nên L chi còn hai điểm a và c.
© Cộng thêm điểm d vào. Khi đó góc acd là phản xạ (reflex) do đó tam giác
(a, c, d) ở ngoài đa giác. Nên tam giác này không được lay, ta chèn d vào
L. Tương tự với điểm e, ta được L gồm (a, c, d, e).
© Thêm điểm f. Điểm f có thé nối với a, c và d. Chúng ta thu được 3 tam giác. Loại các điểm a, c và d ra khỏi L, khi đó L còn f và e.
Ta có mã giả cho thuật toán như sau :
MonotoneTriangulation ( P : Da giác đơn điệu): set( Tam giác) Begin
Sắp xếp n đỉnh của P theo tọa độ x và lưu vào V.
L = danh sách với hai điểm đầu của V,
While (V + ¢) do
Begin
p © Min (V)
if (p đối diện với các điểm trong L ) then
begin
-63-
while( | L ' > 1 ) do
Xuất ra tam giác : {Điểm đầu của L. Điểm hai của L, p}
Loại ra điểm đầu của L
End
Chén p vào L End
Else Begin
While( góc gồm (điểm cuối của L, điểm kế cuối của L, p) 1a lồi
và ( L |> l) do
Xuất ra tam giác : { điểm cudi của L, điểm kế cuối của
L, p}
Loại ra điểm cudi của L
End
//¡ Góc là lỗi hoặc | L | = 1
Thêm p vào L
End
End // của while đầu
End.
5.4 Các thuật toán cho cơ sở dé liệu không gian
5.4.1 Thuật toán kiểm tra điểm trong đa giác
Thuật toán cho biết một điểm p có nằm trong một đa giác P hay không.
Thuật toán sử đụng một nửa đường thẳng / bắt đầu được vẽ từ điểm p và kéo ngang qua cắt đa giác tại các giao điểm ở các cạnh của P. Nếu số giao điểm là chin thi
điểm p ở ngoài đa giác P, nếu là lẻ thì điểm p nằm trong đa giác P.
Giao_diem = 0
{= đường ngang vẽ từ điểm p
for (i= 1 to n) / n là số cạnh giao với /
begin
if{ cạnh i giao với / và không trùng với /) then
begin
if{ một điểm cuối của cạnh i cao hơn /) //tinh theo trục y
Giao điem = Giao điem + l;
end end
if (Giao_diem là lẽ) p nằm trong P
end End.
5.4.2 Thuật toán kiểm tra đoạn thing giao nhau
Thuật toán dựa vào kỹ thuật đường quét dé kiểm tra xem trong một tập đoạn thẳng có những cặp đoạn thẳng nào giao nhau. Đường quét sẽ quét qua lần lượt các đầu mút của các đoạn thẳng theo thứ tự được sắp theo tọa độ x của chúng. Tại các
- 65 -
giao điểm của đường quét và các đoạn thẳng, các đoạn thing được so sánh cao hơn hay thấp hơn đoạn khác dựa vào tọa độ y của các giao điểm đó.
Thuật toán được minh họa bang ma giả sau (Tập S gồm n đoạn thẳng) : SegmentlntersectionTest (S : Tập đoạn thang) : Boolean
Begin
Sắp xếp 2n điểm đầu mút của các đoạn thẳng của S và lưu vào £
For(i= 1 to 2n) do
Begin
p= €[i)
if{p là điểm mút trái của đoạn thẳng s) then
begin
insert(s, L) // Chèn đoạn s vào tập L
if{cac đoạn trong L cao hơn s mà giao với s) return true
if{các đoạn trong L thấp hơn s mà giao với s) return true
end
if{p là điểm mút phải của đoạn thẳng s) then
begin
if{cac đoạn trong L cao hơn s giao với các đoạn trong L
thấp hơn s) return true
delete(s.L) // Loại s khỏi L end
cnd End.
S.4.3 Thuật toán kiểm tra đa giác giao nhau
Hai đa giác đơn P và Q giao nhau nếu xảy ra một trong ba trường hợp sau :
e Một cạnh của đa giác P giao với một cạnh của giác Q.
e© Pnằm trong Q.
se Qnằm trong P.
Ta có mã giả mình họa cho thuật toán kiểm tra hai đa giác giao nhau như sau :
PolygonlntersectionTest (P, Q : Da giác)
Begin
// Kiểm tra đoạn thang giao nhau
If (không có cạnh nào của P giao với bat kì cạnh nào của Q) do
Begin
p = Diễm bat ki thuộc đường biên của P
if(p nằm trong Q) ⁄ Kiểm tra điểm trong đa giác
PcQ Else
Begin
q = Điểm bat ki thuộc đường biên của Q
if{q nằm trong P) // Kiểm tra điểm trong đa giác
QcP
Else P và Q không giao nhau End
End
Else P giao với Q End.
Š.4.4 Thuật toán Windowing
Thuật toán được minh họa qua mã giả sau :
Windowing (/ : line, r : rectangle) : Boolean
-67-
Begin
For(mỗi cạnh /, của /) do
For(mỗi cạnh r, của r) do
lẹ(, giao với r,) then return true End
End
p= đinh bat ki của /
if(p ở trong r) return true / đối tượng hình học ở trong r
else / kiểm tra điểm trong đa giác nếu / là đường biên của đa giác
p= đỉnh bat kì của r
if[p ở trong /) return true // r được chứa đựng trong đối tượng
else return false
End.
5.4.5 Thuật toán Clipping
Ta sẽ xem xét thuật toán Clipping (xén) đa giác. Một điêu chú ý khi xén đa
giác là kết quá sau khi xén nhiều khi là tập các đoạn thẳng rời nhau, nhưng chúng ta lại mong muốn kết quả là các đa giác. Để làm được điều đó, ta xem xét hình chữ
nhật xén như là một nửa mặt phẳng và nó xén đa giác dựa vào 4 nửa mặt phẳng. Ta xem rằng đa giác P và hình chữ nhật xén r được lưu trữ theo thứ tự ngược chiều kim đồng hd. Xem xét P trong nửa mặt phẳng H được xác định bằng đường L quét các
cạnh e, =p,p,,, của P. Kiểm tra vị trí của e, dựa vào 4 trường hợp sau :
Case |
n
Case 2
L £Jái
Case 3 Case 4
H H
L Lễ
hị ˆ
Hình 42 : Clipping một cạnh dựa vào nửa phẳng H.
e Cạnh e, ở bên ngoài H, Điểm p,., bị loại bỏ khỏi danh sách các đình của P.
e© Cạnh e, ở bên trong H. Điểm p,,, được giữ lại.
e Cạnh e, ngang qua L và p,,, nằm trong H. Khi đó điểm p,,, được giữ và giao
điểm | giữa L và e, được thêm vào danh sách các đỉnh cia P.
e© Cạnh e, ngang qua L và điểm p,., nằm ngoài H. Khi đó điểm p,,, bị loại bỏ
và giao điểm I giữa L và e, được thêm vào danh sách các đỉnh cia P.
Mã giả của thuật toán như sau :
Clipping ( P: Đa giác, r : Hình chữ nhật) : Đa giác Begin
Sao chép P thành P'
For(mỗi cạnh r, của r) do
{= Đường thang chứa r,
for(mỗi cạnh e, của P`) do
lf giao với e,) then // Case 3 và 4
l=e, AI
Result © I
Endif
- 69 -
Hp,., năm bên trái của r, ) then
Result€p,, // Case 3 Endif
End
Sao chép Result thành P
End End.
re) (4)
Hình 43 : Minh họa xén đa giác qua 4 bước.