Chương 2 Bài toán tìm bao lồi cho tập điểm
2.1. Cải tiến thuật tốn Quickhull trong khơng gian R2
2.1.4. Tiền xử lý và chia nhỏ bài toán
Bước tiền xử lý và chia nhỏ bài tốn trình bày trong phần này được cải tiến từ một ý tưởng giới thiệu trong [4, 57] và kết hợp với ý tưởng vừa nêu trong Mục 2.1.2. Áp dụng cải tiến này thời gian tính tốn của thuật tốn Quickhull giảm khoảng 48% so với phiên bản hiện thời.
Cụ thể hơn, trong Định nghĩa 1.2.3 ta định nghĩa tám điểm cực đặc biệt của một tậpP hữu hạn điểm trong mặt phẳng. Rõ ràng rằng những điểm nằm trong hoặc thuộc các cạnh nối các điểm cực này không phải là các đỉnh của bao lồi conv(P), vì vậy ta có thể bỏ chúng đi được. Sau khi xóa những điểm đó đi thì bao lồi của tập điểm ban đầu sẽ trùng với bao lồi của tập điểm cịn lại.
Thuật tốn 2.3 Thuật tốn Quickhull sử dụng vector định hướng Đầu vào: Tập P ⊂R2 gồm n điểm, giả sử n≥2.
Đầu ra: Tập H chứa các đỉnh của conv(P).
1. Tìm điểm tận cùng bên trên trái p và điểm tận cùng bên dưới phải q. Đặt H := {p}. P1 và P2 lần lượt là các tập chứa các điểm của P mà nằm ở phía dương và ở phía âm của đường thẳng pq.
2. Gọi Findhull(P1, p, q). GánH :=H∪ {q}. Gọi Findhull(P2, q, p). Findhull(Pk, p, q)
1. if Pk =∅then return
2. else tìm điểm r ∈Pk có khoảng cách đến pq là lớn nhất. S1 :=∅, S2 :=∅, max1 := 0, max2 := 0
for each u∈Pk do if ux < rx
if orient(p, r, s)>0then S1 :=S1∪ {u}
else if orient(r, q, s)>0 then S2 :=S2∪ {u}
3. Gọi Findhull(S1, p, r). H :=H∪ {rk}. Gọi Findhull(S2, r, q).
q3 q2 q1 q8 q7 q6 Q1 Q4 q5 q4 Q3 Q2 Hình 2.7 Bốn tập điểm Q1, Q2, Q3 và Q4. S2 S1 S3 S4 r3 r2 r4 r1 q8 q1 q2 q3 q4 q5 q6 q7 Hình 2.8 Bốn tập S1, S2, S3, S4 cùng với bốn điểmr1, r2, r3 và r4.
Để tiết kiệm thời gian tính tốn ta khơng cần kiểm tra tất cả các điểm của tập hợp ban đầu để tìm các điểm cịn lại. Ta chỉ cần xét bốn tập điểm Q1, Q2, Q3 và Q4 như trong Hình 2.7) trong đó Q1 là tập chứa các điểmq1, q2 và các điểm có hồnh độ nhỏ hơn q2x đồng thời tung độ lớn hơn q1y. Nếuq1 trùng
Thuật toán 2.4 Thuật toán Quickhull áp dụng kỹ thuật tiền xử lý và
chia nhỏ bài toán
Đầu vào: Tập P ={p1, p2, . . . , pn} gồm n điểm trong mặt phẳng, giả sử n ≥2.
Đầu ra: Tập H chứa các đỉnh của conv(P).
1. Tìm tám điểm cực đặc biệt q1, q2, q3, q4, q5, q6, q7 và q8 được nêu trong Định nghĩa 1.2.3. H :={q1}, S1 := ∅, S2 :=∅, S3 :=∅, S4 :=∅, M ax1 := 0, M ax2 := 0, M ax3 := 0 và M ax4 := 0. 2. if q1 =q2 then S1 :=S1∪ {q1}, n1 := 1, else S1 :=S1∪ {q1, q2}, n1 := 2. if q3 =q4 then S2 :=S2∪ {q3}, n2 := 1, else S2 :=S2∪ {q3, q4}, n2 := 2. if q5 =q6 then S3 :=S3∪ {q5}, n3 := 1, else S3 :=S3∪ {q5, q6}, n3 := 2. if q7 =q8 then S4 :=S4∪ {q7}, n4 := 1, else S4 :=S4∪ {q7, q8}, n4 := 2. 3. for i= 1 to n do
if (pix < q2x và piy > q1y) then m1 := orient(q1, q2, pi)
if m1 >0 then S1 :=S1∪ {pi}, n1 :=n1+ 1
if m1 > M ax1 then M ax1 :=m1, r1 :=pi
else if (pix > q3x và piy > q4y) then m2 := orient(q3, q4, pi)
if m2 >0 then S2 :=S2∪ {pi}, n2 :=n2+ 1
if m2 > M ax2 then M ax2 :=m2, r2 :=pi
else if (pix > q6x và piy < q5y) then m3 := orient(q5, q6, pi)
if m3 >0 then S3 :=S3∪ {pi}, n3 :=n3+ 1
if m3 > M ax3 then M ax3 :=m3, r3 :=pi
else if (pix < q7x và piy < q8y) then m4 := orient(q7, q8, pi)
if m4 >0 then S4 :=S4∪ {pi}, n4 :=n4+ 1
if m4 > M ax4 then M ax4 :=m4, r4 :=pi. 4. Gọi Findhull(S1, p1, p2). GánH :=H∪ {p2, p3}. Gọi Findhull(S2, p3, p4). GánH :=H∪ {p4}. Gọi Findhull(S3, p5, p6). GánH :=H∪ {p6, p7}. Gọi Findhull(S4, p7, p8). GánH :=H∪ {p8}. Findhull(Sk, pi, pj). 1. if Pk =∅, then return.
2. if Pk 6= ∅, then tìm điểm r ∈ Pk có khoảng cách xa nhất đến pipj. P1 và P2 tương ứng là các tập chứa các điểm của Sk mà nằm ở phía dương của pir và rpj.
3. Gọi Findhull(P1, pi, r). GánH :=H∪ {r}. Gọi Findhull(P2, r, pj).
q2, thì Q1 chỉ chứa một điểmq1. Các tập Q2, Q3 và Q4 được xác định tương tự Q1 (xem Hình 2.7). Ta cần tìm những điểm nằm ở phía dương đoạn thẳng nối
hai điểm cực tương ứng trong mỗi tậpQ1, Q2, Q3 và Q4, đặt tên tương ứng bốn tập tìm được là S1, S2, S3 và S4. Trong khi xác định tập S1 là tập con của tập Q1 chứa các điểm nằm ở phía dương đoạn thẳng q1q2, ta có thể đồng thời tìm điểm xa nhất r1 trong S1 đến q1q2 giống cách thực hiện trình bày trong Mục 2.1.2. Tương tự, ta có thể tìm các điểm r2, r3, r4 trong S2 S3, S4 tương ứng có khoảng cách xa nhất đến q3q4, q5q6, q7q8. Sau bước tiền xử lý này ta nhận được bốn tập S1, S2, S3 và S4 cùng với các điểm r1, r2, r3 và r4 (xem Hình 2.8). Sau đó áp dụng thuật tốn Quickhull để tìm bao lồi của mỗi tập. Bao lồi của tập hợp ban đầu là hợp của bao lồi của các tập S1, S2, S3, S4 và bỏ đi các đoạn thẳng nối hai điểm cực đặc biệt trong mỗi tập. Thuật tốn 2.4 mơ tả bước tiền xử lý và phân chia tập ban đầu vào bốn tập vừa trình bày ở trên.
Thuật toán 2.5 là thuật toán Quickhull kết hợp với cả ba kỹ thuật được trình bày trong các Thuật tốn 2.2, 2.3 và 2.4, ta gọi là thuật toán Quickhull mới.