Phương pháp sắp xếp theo độ sâu (Depth-Sorting Method)

Một phần của tài liệu Giới thiệu thuật toán vẽ và tô các đường cơ bản (Trang 143 - 147)

C B A (a) C B A (b) G F E D Hình 7-8 Chia một mặt ra làm nhiều mặt để tránh các vấn đề nhìn thấy và không nhìn thấy luân phiên giữa hai mặt.

Ta có thể sử dụng cả hai phương pháp không gian ảnh và không gian đối tượng trong một thuật toán khử mặt khuất. Phương pháp sắp xếp theo độ sâu (depth- sorting method) là một sự nối kết của hai tiếp cận trên, nó thực hiện các công việc cơ

bản sau:

1. Các mặt được sắp theo thứ tự giảm dần của độ sâu.

2. Các mặt được vẽ theo thứ tự từ mặt có độ sâu lớn nhất đến mặt có độ sâu nhỏ nhất (vẽ từ mặt xa nhất đến mặt gần nhất).

Các các thao tác sắp xếp được thực hiện trong không gian đối tượng, còn sự

chuyển đổi dòng quét (scan conversion) được thực hiện trong không gian ảnh.

Phương pháp giải quyết vấn đề mặt khuất này đôi khi còn được gọi là thuật toán của họa sĩ (painter’s algorithm). Để tạo ra một bức sơn dầu (oil painting), đầu tiên họa sĩ sơn các độ

sáng nền. Kế tiếp, các đối tượng ở xa nhất được thêm vào. Sau cùng, các đối tượng ở gần được vẽ phủ lên các đối tượng ở xa đó. Mỗi lớp vẽ

sau phủ lên lớp vẽ trước đó. Dùng kỹ thuật tương tự, chúng ta đầu tiên sắp xếp các mặt theo khoảng cách từ chúng đến mặt quan sát. Các giá trị độ sáng của mặt xa nhất được nhập vào vùng xv zv zmax zmin Z’max Z’min S S’ Hình 7-9 Hai mặt không có sự nạp chồng độ sâu.

vùng đệm làm tươi. Với mỗi mặt kế tiếp (xét theo thứ tự độ sâu giảm dần), ta “sơn” các độ sáng của mặt lên vùng đệm làm tươi (phủ lên các độ sáng của mặt được xử lý trước đó).

Việc sơn các mặt đa giác lên vùng đệm làm tươi dựa theo độ sâu được thực hiện trong vài bước. Đầu tiên, các mặt được sắp xếp dựa vào giá trị z lớn nhất của mỗi mặt. Mặt với độ sâu lớn nhất (gọi là S) sau đó được so sánh với các mặt còn lại trong danh sách để xác định xem có bất kỳ sự chồng độ sâu nào không (nằm chồng lên nhau). Nếu không có sự chồng độ sâu nào xảy ra, S được vẽ ra (vẽ ra theo từng đường quét). Trong hình 7-9 trình bày hai mặt không có sự chồng độ sâu (hai mặt không nằm chồng nhau), hình chiếu của chúng lên mặt phẳng xz. Xử lý này sau đó được lặp lại cho mặt kế tiếp trong danh sách. Khi không có sự chồng độ sâu nào xảy ra, mỗi mặt sẽđược xử

lý theo thứ tựđộ sâu đó cho đến khi tất cảđều được quét qua. Nếu có một sự chồng độ

sâu được phát hiện ở bất kỳđiểm nào trong danh sách, ta cần làm vài so sánh bổ sung

để xác định xem mặt nào nên được sắp xếp lại.

Với mỗi mặt nằm chồng với S, ta thực hiện các phép kiểm tra sau. Chỉ cần một trong số các phép kiểm tra này là đúng (true), ta không cần sắp lại vị trí mặt đó. Các phép kiểm tra được lập danh sách theo mức độ khó tăng dần:

1. Trên mặt phẳng xy, các hình chữ nhật bao quanh hai mặt không chồng lên nhau.

xv

zv

xmax

xmin x’min x’max

Hình 7-10

Hai mặt không có sự chồng độ sâu theo hướng x. S’ S 2. Mặt S thì ở “phía ngoài” mặt nằm chồng, so sánh dựa vào mặt phẳng quan sát. 3. Mặt nằm chồng thì ở “phía trong ” mặt S, so sánh dựa vào mặt phẳng quan sát.

4. Các hình chiếu của hai mặt lên mặt phẳng quan sát không nằm chồng lên nhau.

Vừa khi một phép kiểm tra được phát hiện là đúng cho một mặt nằm chồng, ta biết rằng mặt không nằm phía sau S. Vì vậy ta chuyển đến mặt chồng S kế tiếp. Nếu tất cả các mặt mặt nằm chồng vượt qua được ít nhất một trong các phép kiểm tra trên, ta không phải sắp xếp và S có thểđược vẽ ra.

Phép kiểm tra 1 được thực hiện trong hai phần: Chúng ta kiểm tra sự nằm chồng theo hướng x, sau đó kiểm tra nằm chồng theo hướng y. Nếu cái nào trong hai hướng này được phát hiện là không có nằm chồng, hai mặt phẳng không che khuất nhau. Một ví dụ về hai mặt có nằm chồng theo hướng z nhưng không chồng theo hướng x được cho trong hình 7-10.

Chúng ta có thể thực hiện phép kiểm tra 2 bằng cách thế tọa độ tất cả các đỉnh của S vào phương trình mặt của mặt nằm chồng và kiểm tra dấu của kết quả. Giả sử

rằng mặt nằm chồng có hệ số A’, B’, C’, và D’. Nếu A’x + B’y + C’z + D’ > 0 với mỗi

đỉnh có tọa độ (x, y, z) của S, mặt S sẽở “phía ngoài” mặt nằm chồng S’ (xem hình 7- 11). Nhưđược đề cập trước đây, các hệ số A’, B’, C’, và D’ phải được xác định trước

để pháp vector của mặt nằm chồng S’ chỉ ra xa khỏi mặt phẳng quan sát.

Hình 7-11

Mặt S hoàn toàn ở “phía ngoài” mặt nằm chồng S’ khi nhìn từ mặt quan sát xy. xv zv S S’ Hình 7-12 Mặt nằm chồng S’ hoàn toàn

ở “phía trong” mặt S, khi nhìn từ mặt quan sát xy. xv zv S S’ Phép kiểm tra 3 được thực hiện dùng các hệ số A, B, C, và D của mặt S. Nếu tọa độ (x, y, z) của tất cả các đỉnh của mặt nằm chồng S’ thỏa điều kiện Ax + By + Cz + D < 0, khi đó mặt nằm chồng S’ sẽở “phía trong” mặt S (cung cấp pháp vector của mặt S hướng ra xa mặt phẳng quang sát). Hình 7-12 trình bày một mặt nằm chồng S’ thỏa phép kiểm tra này. Trong ví dụ này, mặt S thì không ở “phía ngoài” S’ (phép kiểm tra 2 không đúng).

Nếu tất cả các phép kiểm tra từ 1 đến 3 đều thất bại (sai), chúng ta thửđến phép kiểm tra 4 bằng cách kiểm tra sự cắt nhau giữa các cạnh biên của hai mặt, dùng các phương trình đường thẳng trong mặt xy. Nhưđược minh họa trong hình 7-13, hai mặt có thể cắt hoặc không cắt nhau thậm chí khi các không gian bao quanh chồng nhau theo các hướng x, y, và z (xem hình 7-13).

Các mặt không cắt nhau Hình 7-13 Hai mặt với các chữ nhật nằm ch biên ồng . nhau trong mặt xy Các mặt cắt nhau Nếu tất cả bốn phép kiểm tra trên đều thất bại với một mặt nằm chồng cụ thể S’, ta đổi chỗ hai mặt S và S’ cho nhau trong danh sách đã được sắp. Một ví dụ của hai mặt sẽ được sắp xếp lại với thủ tục này được cho trong hình 7-14. Tuy nhiên, ta vẫn không biết chắc rằng ta đã tìm gặp mặt xa nhất tính từ mặt phẳng quan sát chưa. Hình 7-15 minh họa một trường hợp mà tại đó đầu tiên chúng ta đổi chổ S và S’’ với nhau. Nhưng vì S’’che khuất một phần của S’ (nhìn lên từ mặt xy), chúng ta cần đổi chổ S’’ và S’ với nhau để có ba mặt được sắp hợp lý theo độ sâu. Do đó, chúng ta cần lặp lại quá trình kiểm tra cho mỗi mặt, cái vừa được sắp lại trong danh sách.

Hình 7-14 Mặt S có độ sâu z lớn hơn xv zv S S’ Hình 7-15

Ba mặt ban đầu đã được sắp theo thứ tựđộ sâu z : S,

xv

zv

S’’ S’ S

Thuật toán vừa được phác thảo có thể đi vào một vòng lặp vô tận nếu hai hay nhiều mặt che khuất lẫn nhau một cách luân phiên như trong hình 7-7 (xem hình 7-7).

Trong các trường hợp như thế, thuật toán sẽ lặp đi lặp lại không ngừng việc đổi chỗ vị trí của các mặt nằm chồng nhau. Để tránh các vòng lặp như thế, chúng ta có thể đặt cờ trạng thái cho mặt nào vừa được sắp đến vị trí xa hơn để nó không bị di chuyển lại nữa. Nếu có một sự cố gắng được làm để đổi chỗ các mặt lần thứ hai, ta chia nó ra làm hai phần tại đường cắt (đường giao) của hai mặt. Mặt ban đầu sau đó được thay thế bởi hai mặt mới, và ta lại tiếp tục quá trình xử lý như trước đây.

Một phần của tài liệu Giới thiệu thuật toán vẽ và tô các đường cơ bản (Trang 143 - 147)

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

(159 trang)