Bài toán windowing

Một phần của tài liệu Một số vấn đề cơ sở dữ liệu không gian (Trang 63)

Đây là hai thao tác cùng sử dụng một hình chữ nhật làm tham số đầu vào. Chúng được mô tả như sau: Windowing(g, r) là phép toán logic kiểm tra xem

một đối tượng hình học g có giao với một hình chữ nhật r hay không.

Thao tác windowing đối với một điểm là trường hợp tầm thường có thể

giải quyết bằng việc kiểm tra vị trí điểm tương đối của điểm đó với từng cạnh của hình chữ nhật. Đối với polyline và polygon, có thể sử dụng cùng một thuật

toán, vì polygon chính là một polyline đóng.

Thuật toán được thực hiện bởi việc quét lần lượt các cạnh trên polyline và kiểm tra xem chúng có giao với cạnh nào của hình chữ nhật không.

Thuật toán trên không áp dụng cho mọi trường hợp. Đối tượng g có thể

bao phủ hoàn toàn (hoặc bị bao phủ hoàn toàn) bởi hình chữ nhật r. Khi đó,

không có bất cứ cạnh nào của g giao với hình chữ nhật. Vì vậy, việc kiểm tra

không phát hiện được một giao điểm nào. Do vậy phải thực hiện thêm hai phép kiểm tra.

Windowing (l: line, r: retangle): Boolean

begin

for (mỗi cạnh li của l)

for (mỗi cạnh ri của r)

if (li giao ri) return true

end for end for

// kiểm tra điểm bên trong hình chữ nhật

Hình 3.7 Các thao tác windowing: (a) trên một đa giác và (b) trên một polyline

r1

r2

r1’

r2’

p = cạnh bất kỳ của l

if (p nằm trong r) return true // l nằm trong r

else // kiểm tra điểm bên trong polygon p = cạnh bất kỳ của r

if (p nằm trong l) return true // r nằm trong l

else return false

end

Trong trường hợp xấu nhất, mỗi cạnh của l đều được kiểm tra với tất cả

các cạnh của r (4n phép toán, n là số cạnh của l). Mỗi thuật toán kiểm tra điểm

nằm trong hình chữ nhật và điểm nằm trong polygon đều có độ phức tạp là O(n). Vậy độ phức tạp của thuật toán windowing là O(n).

Một phần của tài liệu Một số vấn đề cơ sở dữ liệu không gian (Trang 63)

Tải bản đầy đủ (PDF)

(119 trang)