Chương 3 Bài toán tìm bao lồi cho tập hữu hạn các hình trịn
3.2. Giới thiệu thuật toán QuickhullDisk
Thuật toán 3.1 dưới đây mơ tả thuật tốn QuichkullDisk tìm bao lồi của tập D hữu hạn các hình trịn. Đầu ra của thuật tốn là tập các hình trịn cực biênCH(D). Ta biết rằng một hình trịn đi qua một điểm cực biên là hình trịn cực biên. Bởi vậy thuật tốn trước tiên tìm các điểm cực biên, với mỗi điểm cực biên tìm được sẽ cho ta một hình trịn cực biên tương ứng.
Dưới đây ta sẽ giải thích một số nội dung trong Thuật tốn 3.1. Bước đầu tiên của thuật tốn QuichkullDisk là tìm hình trịn dp và dq tương ứng đi qua điểm tận cùng trái trên p và tận cùng phải dưới q của tập hình trịn D={d1, d2, . . . , dn}.
Tìm hình trịn dp và dq
1. Điểm tận cùng trái trên p(px, py) thỏa mãn px = min
i=1,2,...,n{cix−ri}. Nếu có nhiều điểm p thỏa mãn đẳng thức trên thì trong các điểm đó chọn điểm có py lớn nhất. Nếu có nhiều hình trịn tiếp xúc trong tại điểm p thì ta chọn hình trịn có bán kính lớn nhất (xem Hình 3.4).
2. Điểm tận cùng phải dướiq(qx, qy)thỏa mãnqx = max
i=1,2,...,n{cix+ri}. Nếu có nhiều điểm q thỏa mãn đẳng thức trên thì trong các điểm đó chọn điểm có qy nhỏ nhất. Nếu có nhiều hình trịn tiếp xúc trong tại điểm q thì ta chọn hình trịn có bán kính lớn nhất (xem Hình 3.4).
Xác định tập D1 và D2
Để xác định tậpD1 vàD2, ta so sánh bán kínhricủa hình trịndi(ci, ri)∈D với khoảng cách dist(ci, pq) từ tâm ci tới đường thẳng pq.
1. Hình trịn di thuộc vào D1 nếu i. ri>dist(ci, pq) hoặc
ii. ri≤dist(ci, pq) và ci nằm ở phía âm của pq (phía dương của qp). 2. Hình trịn di thuộc vào D2 nếu
Thuật toán 3.1 Thuật toán QuichkullDisk cho tập hình trịn
Đầu vào: Cho tập hợp D = {d1, d2, . . . , dn} gồm n hình trịn có tâm ci(cix, ciy) và bán kínhri ≥0. Giả sửn ≥2.
Đầu ra: CH(D).
1. Tìm hình trịn dp và dq tương ứng chứa điểm tận cùng trái trên p và tận cùng phải dưới q. Gán CH(D) := {dp}. D1 chứa dp, dq và tất cả các hình trịn của D\ {dp, dq}khơng nằm ở phía dương của pq.D2 chứadp, dq và tất cả các hình trịn của D\ {dp, dq} khơng nằm ở phía dương củaqp.
2. Gọi Findhull(D1, pq, dp, dq). Gán CH(D) := CH(D) ∪ {dq}. Gọi Find- hull(D2, qp, dq, dp).
Findhull(Dk, pq, dp, dq).
1. if Dk =∅ then return;
2. else tìm dr∈Sk đi qua điểm r có khoảng cách xa nhất tới pq. a. if (dr 6=dp and dr 6=dq)then
i. Đặt P1 (tương ứng P2) chứa dp, dr (tương ứng dr, dq) và tất cả các hình trịn củaDk\{dp, dr}(tương ứng Dk\{dr, dq}) khơng nằm ở phía dương của pr (tương ứng rq).
ii. GọiFindhull(P1, pr, dp, dr). Gán CH(D) := CH(D)∪ {dr}. Gọi Find- hull(P2, rq, dr, dq).
b. else if dr =dp then gọi FindNextDisc(Dk, dp, dq)để tìm next(dp). Gọi p0 là tiếp điểm trên next(dp) của tiếp tuyến phải của hai hình trịn dp và next(dp).
i. Đặt P1 chứadp0, dq và tất cả các hình trịn thuộc Dk\ {dp0, dq} khơng nằm ở phía dương củap0q.
ii. Gán CH(D) := CH(D) ∪ {next(dp)}. Gọi Find- hull(P1, p0q,next(dp), dq).
c. else if dr =dq then gọi FindPrevDisc(Dk, dp, dq) để tìm prev(dq). Gọi q0là tiếp điểm trên prev(dq)của tiếp tuyến phải của hai hình tròn prev(dp) và dq.
i. Đặt P1 chứa dp, dq0 và tất cả các hình trịn của Dk\ {dp, dq0} khơng nằm ở phía dương củapq0.
ii. Gọi Findhull(P1, pq0, dp,prev(dq)). Gán CH(D) := CH(D) ∪ {prev(dq)}.
i. ri>dist(ci, pq) hoặc
p dp
q dq
Hình 3.4 Các hình trịn cực biên dp và dq.
Trong Hình 3.5, D1 là tập các hình trịn màu xanh dương và màu nâu, D2 là tập các hình trịn màu xanh lá và màu nâu.
p q D2 dp dq D1 r dr Hình 3.5 Các tập hợpD1, D2 và hình trịn dr. Tìm hình trịn dr
Hình trịn dr ∈Dk chứa điểm r xa pq nhất (xem Hình 3.5) thỏa mãn dist(r, pq) = max{dist(ci, pq) +ri}, với di ∈Dk.
Nếu có nhiều điểm thỏa mãn đẳng thức trên thì ta chọn điểm có hồnh độ nhỏ nhất. Nếu các hồnh độ bằng nhau thì ta chọn điểm có tung độ nhỏ nhất (điểm r được chọn như vậy ta gọi r là điểm cuối (endpoint)). Trong trường hợp có nhiều hình trịn tiếp xúc trong tại r thì ta chọn dr là hình trịn có bán kính lớn nhất. Với cách chọn như vậy rõ ràng dr là một hình trịn cực biên của tập D.
Xác định P1 và P2
Để xác định P1 và P2 ta so sánh bán kính ri của các hình trịn di ∈Dk với khoảng cách từ ci tới pr và rq. Cụ thể như sau:
1. Hình trịn di thuộc vào tập P1 nếu i. ri>dist(ci, pr) hoặc
ii. ri≤dist(ci, pr) và ci nằm ở phía âm của pr. 2. Hình trịn di thuộc vào tập P2 nếu
i. ri>dist(ci, pr) hoặc
ii. ri≤dist(ci, pr) và ci nằm ở phía âm của rq.
Trong Thuật tốn 3.1 các điểm thuộc tậpP0:=Dk\{P1∪P2} khơng được nhắc tới, do các hình trịn trong tập này khơng thể là các hình trịn cực biên nên có thể bỏ đi. Trong các bước gọi tiếp theo ta khơng xét đến các hình trịn này nữa.
Trong Hình 3.6,P1 (tương ứngP2) chứa các hình trịn thuộcD1 khơng nằm ở phía dương pr (tương ứng rq), P0 là tập các đường thuộc D1 nằm ở phía dương của cả pr và rq (các hình trịn nét đứt). p q D2 dp P1 r dr dq P2 P0 Hình 3.6 Các tập hợpP0, P1 và P2. Tìm next(Cp) và prev(Cq)
Vì dp và next(dp) là hai hình trịn cực biên liên tiếp nhau trên CH(D) theo thứ tự ngược chiều kim đồng hồ, do đó tiếp tuyến phải của dp và next(dp) là
đường thẳng tựa của D. Khi tìm hình trịn next(dp) ta cần xem xét các tiếp tuyến phải củadp với các hình trịn d∈Dk. Dodp cố định nên để thuận tiện ta sẽ ký hiệu các tiếp điểm của tiếp tuyến phải của dp và một hình trịn d ∈ Dk theo hình trịn d, cụ thể ta gọi td và ˜td là hai tiếp điểm tương ứng trên dp và d của tiếp tuyến phải này. Ngoài ra, ta cũng ký hiệu Ùptd là cung có hướng từ p đến td trên đường trịn dp (sau đây để đơn giản ta chỉ viết là "cung" thay cho "cung có hướng") và len(p, td)là độ dài của cung Ùptd. Ta áp dụng Mệnh đề 3.2.1 dưới đây để tìm next(dp).
Mệnh đề 3.2.1. Ta có
len(p, tnext(dp)) = min
d∈Dklen(p, td).
Chứng minh. Ta chứng minh mệnh đề bằng phản chứng. Giả sử rằng tồn tại một hình trịn d0 ∈ Dk sao cho len(p, td0)< len(p, tnext(dp)) (xem Hình 3.7). Tức là tồn tại một điểmp0 ∈Ùptnext(dp) mà p0∈/Ùptd0 hayp0 ∈tˆd0tnext(dp). Do đó p0 nằm ở phía âm đường thẳng td0˜tnext(dp). Mặt khác, theo định nghĩa tiếp tuyến phải thì p0 nằm ở phía dương của tiếp tuyến phải td0˜td0 của hai hình trịn dp và d0. Suy ra
p0 nằm trong tam giác td0˜td0˜tnext(dp). (3.1)
Mặt khác, vì dp và next(dp) là hai hình trịn cực biên kế tiếp theo hướng ngược chiều kim đồng hồ và p0 ∈Ùptnext(dp) nên ta có
p0 là một điểm cực biên của D. (3.2) Ta thấy rằng (3.2) mâu thuẫn với (3.1). Do đó điều giả sử sai. Mệnh đề được chứng minh. dp p td0 p0 ˜ tnext(dp) next(dp) d0 ˜ td0 tnext(dp)
Trường hợp có nhiều hơn một hình trịn có cùng giá trị min
d∈Dklen(p, td), tức là những hình trịn này có cùng tiếp tuyến phải vớidp, khi đó ta sẽ chọn next(dp) là hình trịn với tiếp điểm ˜td xa td nhất. Nếu có nhiều hình trịn có cùng tiếp điểm đó ta chọn hình trịn với bán kính lớn nhất. Bởi vậy, rõ ràng next(dp) là hình trịn cực biên kế tiếp của dp trên CH(D).
Thủ tục 3.2 tìm hình trịn cực biên next(dp) trong Dk. Nếu Dk chứam hình trịn thì Procedure 3.2 tìm ra next(dp) trong thời gian O(m).
Thủ tục 3.2 FindNextDisc(Dk, dp, dq)
Đầu vào: Tập Dk ={d1, d2, . . . , dm} gồm m hình trịn khơng ở phía dương của pq.
Đầu ra: next(dp). 1. l := 1.
2. Tính len(p, tdl) 3. for i=l to m do
if (len(p, tdl) > len(p, tdi)) or ((len(p, tdl) = len(p, tdi) and
([tdl,tdl˜ ] > [tdi,˜tdi]))then đặt l =i and goto 2; .next(dp) là dl. 4. Return dl.
Để tìm hình trịn cực biên liền trước prev(dq) của hình trịn dq ta có thể thực hiện tương tự như tìm next(dp) của dp. Giả sử d ∈ Dk, ta cũng ký hiệu các tiếp điểm của đường tiếp tuyến phải của d và dq theo d, tức là gọi td˜ và td là các tiếp điểm của tiếp tuyến này tương ứng trên trên dvà trên dq. Tương tự Mệnh đề 3.2.1, Mệnh đề 3.2.2 cho chúng cách tìm ra hình trịn prev(dq). Mệnh đề 3.2.2 có thể được chứng minh tương tự Mệnh đề 3.2.1.
Mệnh đề 3.2.2. Ta có
len(tprev(dq), q) = min
d∈Dklen(td, q).
Tương tự Thủ tục 3.2, Thủ tục 3.3 tìm hình trịn cực biên kề trước prev(dq) củadq trong CH(D).