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.1. Thuật toán Quickhull
Thuật toán Quickhull [20, 49] xác định bao lồi của tập hữu hạn điểm P. Thuật tốn bắt đầu bởi việc tìm hai điểm cực đặc biệt (ta thường chọn điểm tận cùng trên trái và điểm tận cùng dưới phải), ta gọi làpvà q, và lưu hai điểm này vào tập đỉnh H của conv(P). Đường thẳng pq chia (n−2)điểm còn lại vào hai tập con P1 và P2, trong đó P1 chứa các điểm của P và nằm ở phía dương đường thẳng pq, P2 là tập các điểm của P và nằm ở phía âm đường thẳng pq.
Sau đó, trong tập P1 ta tìm điểm r có khoảng cách đến pq là xa nhất. Thêm điểm r vào tập đỉnh H. Ba điểm p, q và r chia tập P1 thành ba tập con S0, S1 và S2, trong đó S0 chứa các điểm nằm bên trong tam giác prq, S1 chứa các điểm nằm ở phía dương pr và S2 chứa các điểm nằm ở phía dương rq. Ta thay pq bởi pr và rq và tiếp tục lặp lại thuật toán. Áp dụng các bước thực hiện của P1 cho tập P2 ta sẽ được bao lồi của tập P (Hình 2.1). Thuật tốn Quickhull được mơ tả bởi Thuật tốn 2.1.
p q P1 P2 p q S0 S1 S2 p q S1 S2
Hình 2.1 Thuật tốn Quickhull.
Thuật toán 2.1 Thuật toán Quickhull [49]
Đầ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. if Pk 6= ∅, then tìm điểm r ∈ Pk có khoảng cách đến pq là lớn nhất. S1và S2 tương ứng là các tập chứa các điểm của Pk mà nằm ở phía dương củapr vàrq. 3. Gọi Findhull(S1, p, r). Gán H :=H∪ {r}. Gọi Findhull(S2, r, q).
Xử lý những điểm thẳng hàng
Rất nhiều bài báo viết về bài tốn tìm bao lồi thường giả sử rằng khơng tồn tại trường hợp có ba điểm thẳng hàng. Tuy nhiên giả sử này là không cần thiết,
khơng thực tế và có thể dễ dàng giải quyết. Nếu khơng có giả thiết này thì Thuật tốn 2.1 chứa cả những điểm biên không phải là đỉnh của bao lồi. Tuy nhiên những điểm này sẽ nằm trên cạnh nối hai đỉnh. Do đầu ra của thuật tốn là những điểm có sắp thứ tự nên ta có thể loại bỏ những điểm này như sau: Cho p1, p2, . . . , pm là kết quả đầu ra của Thuật toán ??. Nếuorient(pi, pi+1, pi+2) = 0 với i∈ {1,2, . . . , m−2} thì pi, pi+1, pi+2 thẳng hàng và pi+1 nằm giữa pi và pi+2, do đó ta có thể xóa điểmpi+1. Nếu orient(pm−1, pm, p1) = 0thì ta xóa điểm cuối cùng pm. Sau khi xóa các điểm này ta sẽ nhận được tập các đỉnh của bao lồi.