Kiểm tra điểm có nằm trong đa giác hay không?

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

Kiểm tra một điểm p có nằm bên trong một đa giác G hay không? là một

bài toán rất thông dụng trong các ứng dụng không gian.

Có thể mô tả thuật toán một cách đơn giản như sau. Nếu vẽ một nửa đường thẳng (một tia) l bắt đầu từ điểm P và đếm số đoạn thẳng thuộc G cắt l, số này là chẵn thì P nằm bên ngoài G, ngược lại, nếu số này lẻ. Thuật toán được thực hiện bằng cách duyệt lần lượt các cạnh trong G xem chúng cắt tia l hay

không. Độ phức tạp tính toán của nó là O(n).

Trong một số trường hợp, cần đặc biệt chú ý. Ví dụ, điểm P3 trong hình 3.4. Số giao điểm của các cạnh tạo nên G với đường thẳng ngang kẻ qua P3 rất có thể là lẻ và theo thuật toán, P3 nằm trong G. Để giải quyết vấn đề này, có thể áp dụng các quy ước sau:

(1) không đếm các cạnh đồng phẳng với l,

(2) đếm một cạnh e như là một cạnh giao khi và chỉ khi tồn tại ít nhất một điểm cuối của e thực sự nằm phía trên l.

Với các quy ước này, các cạnh a, b, c không được đếm trong trường hợp trên. Lúc đó, số giao điểm thực sự sẽ là 6, như vậy P3 nằm ngoài G. Phương

PointInPolygon(P: polygon, p:point): boolean

BEGIN

If (p thuộc cạnh của P), p nằm trong P

Else

count = 0

l  tia song song Ox, đi qua p

for (i = 1 to n) do begin

if(Intersect(edge(i),l) and not Collinear(edge(i),l))

begin

if (một điểm cuối của edge(i) thực sự nằm phía trên l) count = count +1 end end for if (count là lẻ), p nằm trong P P1 P3 . . v b c l a . P2 .

End if

END

Đối với trường hợp tổng quát, đây là bài toán O(n), Nếu G là đa giác lồi,

thì bài toán là O(log(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 54)

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

(119 trang)