3.3 Một số thuật toán cơ sở cho các đối tượng không gian
3.3.5 Bài toán Clipping
Clipping (g, r) là phép toán tính phần của đối tượng hình học g nằm bên
trong hình chữ nhật r, Một trong số thuật toán hiệu quả được đề xuất năm 1974 [2], với thời gian tuyến tính được mô tả như sau.
Trước tiên, coi mỗi cạnh của hình chữ nhật như một nửa không gian. Cắt đối tượng hình học theo bốn nửa không gian đó. Giả sử rằng, P và hình chữ nhật r được lữu trữ theo thứ tự ngược chiều kim đồng hồ. Giữ lại phần của P nằm
trong nửa mặt phẳng H xác định bởi đường thẳng L chứa các cạnh có hướng ei = pipi+1 của P, kiểm tra vị trí của mỗi cạnh ei với H. Có thể xảy ra bốn trường hợp:
Cạnh ei nằm ngoài H, điểm pi+1 được loại khỏi danh sách các đỉnh của P,
Cạnh ei giao L và pi+1 nằm trong P, giữa lại pi+1, bổ sung giao điểm I vào danh sách các cạnh của P.
Cạnh ei giao L, pi+1 nằm ngoài H, loại pi+1, bổ sung giao điểm I vào danh
sách các cạnh của P.
Thuật toán này gồm hai vòng lặp. Vòng lặp ngoài quét các cạnh của hình chữ nhật. Tại mỗi bước, một cạnh xác định nửa mặt phẳng Hi, i = {1, 2, 3, 4}. Vòng lặp trong quét các cạnh của đơn giản P và cắt chúng theo nửa mặt phẳng Hi. Với mỗi cạnh được quét, một trong số các thao tác đã liệt kê trước đó được thực hiện, một phần đơn giản được cắt, một đoạn trên đường biên Li trở thành một cạnh mới. Đa giác được tiếp tục cắt theo các cạnh còn lại của hình chữ nhật.
Clipping (P: polygon, r: rectangle): polygon
begin
Copy P vào P’
for (mỗi cạnh ri của r)
l = đường thẳng chứa ri
for (mỗi cạnh ei của P’)
if (l giao ei) l = ei l ket_qua l
end if
if (pi+1 nằm bên trái ri) ket_qua pi+1
Copy ket_qua vào P
end for
end
Trong hình 3.8 là một một ví dụ với kết quả từng bước thực hiện thuật toán áp dụng cho một đa giác.
(1) (2)
(3) (4)
Cũng giống như trong thao tác windowing, thao tác clipping có độ phức tạp là O(n).