Thuật toán

Một phần của tài liệu Một số thuật toán liên quan đến nội dung hình học (Trang 33 - 34)

Tư tưởng của thuật toán là tìm tất cả các cạnh của tập đa giác giao, nếu tập cạnh này khác rỗng thì bằng cách ghép chúng lại sẽ được tập các đa giác là giao của A và B.

Phân tích bài toán: Bài toán ngoài việc phải tìm diện tích, ta còn phải chỉ ra đa giác tạo nên phần giao của A và B. Phần giao này có thể là tập rỗng hay là tập các đa giác không giao nhau. Để đơn giản ta gọi phần giao của A và B là tập đa giác giao, và gọi một cạnh là cạnh của tập đa giác giao với ý nghĩa nó là cạnh của một đa giác trong tập đa giác giao. Với P là một đa giác thì ta gọi I(P) và O(P) lần lượt là miền trong và miền ngoài của P.

Thuật toán bao gồm hai bước chính:

Bước 1: Trường hợp hai đa giác không có cặp cạnh nào song song và giao nhau

Với mỗi cạnh v = aiai+1∈A (i = 1, 2, ..., n; a0 = an+1; an+1 = a1), ta tìm mọi giao điểm của v với tất cả các cạnh u = bkbk+1 ∈B (k = 1,2,…, m; b0 = bm+1; bm+1 = b1).

Đặt Xv = < tập các giao điểm của v với các cạnh u > ∪ {ai, ai+1}(nếu có nhiều điểm trùng nhau thì chỉ giữ lại một điểm trong số các điểm trùng nhau sao cho trong Xv chỉ chứa các điểm khác nhau đôi một)

Sắp xếp các điểm trong Xv (giả sử |Xv| = lv) theo chiều tăng dần khoảng cách từ điểm đó đến ai, ta được Xv = {x1 = ai, x2,..., xlv-1, xlv = ai+1}. Khi đó, cạnh xixi+1 (i = 1, 2, ..., lv-1) là một cạnh của đa giác giao nếu trung điểm của nó nằm trong đa giác B.

Xử lý tương tự cho các cạnh của đa giác B.

Bước 2. Xử lý trường hợp hai đa giác có cặp cạnh song song và giao nhau (trùng nhau một phần).

Trước hết ta chèn thêm những điểm mới vào các đa giác để nếu có trường hợp có cặp cạnh song song và giao nhau thì chúng trùng nhau.

Giả sử cạnh aiai+1 và cạnh bkbk+1 song song và giao nhau (nhưng không trùng nhau). Ta xét từng đầu mút một: nếu ai ∈bkbk+1(ai nằm trong đoạn bkbk+1), thì chèn ai vào giữa hai đỉnh bk, bk+1, tức là coi aibk+1 và bkai là hai cạnh mới của đa giác B; xử lý tương tự cho ba đầu mút còn lại.

Tiếp đó, với mỗi cặp cạnh aiai+1 và cạnh bkbk+1 trùng nhau ta quyết định xem có đưa một trong hai cạnh vào tập cạnh của đa giác giao không dựa vào tính chất sau:

"Xét hai cạnh ai+1ai+2 và bk+1bk+2, thực hiện như trường hợp ở phần trên ta được hai tập:

X = {x1 = ai+1,x2,..,xlv-1,xlv = ai+2}. Y = {y1 = bk+1,y2,..,ylv-1,ylu = bk+2}.

Gọi N và M lần lượt là trung điểm các cạnh x1x2 và y1y2. Khi đó, ai+1ai+2 (hoặc bk+1bk+2) là một cạnh của đa giác giao nếu một trong hai điều kiện sau thoả mãn:

1. N nằm trong đa giác B và M nằm ngoài đa giác A. 2. N nằm ngoài đa giác B và M nằm trong đa giác A".

(Cũng có thể áp dụng tính chất trên cho trường hợp hai cạnh aiai-1 và bkbk-1). Tính chất trên có thể chứng minh dễ dàng thông qua hai kết quả sau:

 Nếu đi theo chiều thuận (chiều ngược với chiều kim đồng hồ) theo các cạnh của đa giác P thì I(P) và O(P) tương ứng nằm về phía bên trái và phía bên phải dọc theo hướng đi.

 Nếu biết trước một điểm M ∈ I(P) (O(P)), thì I(P) (O(P)) sẽ nằm cùng phía so với M và O(P) (I(P)) sẽ nằm khác phía so với M, theo một hướng đi trên một cạnh nào đó thuộc đa giác P.

Một phần của tài liệu Một số thuật toán liên quan đến nội dung hình học (Trang 33 - 34)