M Ở ĐẦU
5.3.2 Thuật toán chia nhị phân
Một tiếp cận là dựa trên cơ chế đánh mã được phát triển bởi Cohen và Sutherland. Mọi điểm ở hai đầu mút đoạn thẳng trong hình ảnh sẽ được gán một mã nhị phân 4 bit, được gọi là mã vùng, giúp nhận ra vùng tọa độ của một điểm. Các vùng này được xây dựng dựa trên sự xem xét với biên cửa sổ, nhưở hình 6-8. Mỗi vị trí bit trong mã vùng được dùng để chỉ ra một trong bốn vị trí tọa độ tương ứng của điểm so với cửa sổ: bên trái (left), phải (right), trên đỉnh (top), dưới đáy (bottom). Việc đánh số theo vị trí bit trong mã vùng từ 1 đến 4 cho từ phải sang trái, các vùng tọa độ có thể
liên quan với vị trí bit như sau:
Hình 5.5: Mã hóa các đầu mút của đoạn thẳng
Giá trị 1 ở bất kỳ vị trí nào chỉ ra rằng điểm ở vị trí tương ứng, ngược lại bit ở vị
trí đó là 0. Nếu một điểm nằm trong cửa sổ, mã vị trí là 0000. Một điểm bên dưới và bên trái cửa sổ có mã vùng là 0101.
Cài đặt minh họa thuật toán mã hóa
byte EncodePoint(Point LeftTop, Point RightBottom, Point P) { byte code = 0; if (P.X < LeftTop.X) { code |= 8; } if (P.X > RightBottom.X) { code |= 4; } if (P.Y < RightBottom.Y)
{ code |= 2; } if (P.Y > LeftTop.Y) { code |= 1; } return code; }
Thuật toán chia nhị phân
1. Nếu E(A) = 0 và E(B) = 0 kết luận AB∩ (R) = AB; thuật toán dừng. 2. Nếu [E(A) AND E(B)] != 0 kết luận AB∩ (R) = ∅; kết thúc thuật toán. 3. Nếu E(A) = 0 và E(B) ≠ 0(tức A∈ (R) và B∉ (R)) thực hiện:
a. Đặt C = A, D = B.
b. Trong khi độ dài ||CD|| lớn hơn ε
Đặt M là trung điểm của đoạn CD.
Nếu E(M) = 0 thì cập nhật C = M ngược lại D = M. c. Kết luận AB∩ (R) = AM; kết thúc thuật toán.
4. Nếu E(A) = 0 và E(B) = 0, hoán đổi vai trò của A và B; lặp lại bước 3. 5. Ngược lại, thực hiện:
a. Đặt C = A, D = B.
b. Trong khi độ dài ||CD|| lớn hơn ε
Đặt M là trung điểm của đoạn CD.
Nếu E(M) = 0 áp dụng Bước 3 cho hai đoạn MC và MD. Kết luận
AB∩(R) = CD;kết thúc thuật toán. Nếu [E(M) AND E(R)] != 0 đặt C = M.
Nếu [E(M) AND E(D)] != 0 đặt D = M.
Nếu [E(R) AND E(D)] != 0 kết luận AB∩ (R)= ∅; kết thúc thuật toán.
Hình 5.6: Minh họa của thuật toán chia nhị phân.