Các phương pháp Octree (Octree Methods)

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 150 - 154)

Khi biểu diễn octree được dùng cho các không gian quan sát, việc khử các mặt khuất được thực hiện bằng cách chiếu các nút octree lên mặt quan sát theo thứ tự từ

người quan sát) được hình thành với các phần tám (octant) 0, 1, 2, 3. Mặt trước của các octant này được nhìn thấy bởi người quan sát. Bất kỳ mặt nào hướng về phía sau của các octant phía trước này hoặc các octant ở đằng sau (4, 5, 6, và 7) có thể bị che khuất bởi các mặt phía trước.

Các mặt phía sau bị loại bỏ, với hướng quan sát như trong hình 7-20, bằng cách xử lý các phần tử dữ liệu tại các nút octree theo thứ tự 0, 1, 2, 3, 4, 5, 6, 7. Điều này tạo ra kết quả du hành theo độ sâu của octree, để các octant 0, 1, 2, và 3 của toàn vùng được viếng thăm trước các octant 4, 5, 6, và 7. Tương tự, bốn octant con trước của octant 0 sẽđược viếng thăm trước bốn octant con phía sau. Cuộc du hành của octree sẽ tiếp tục theo thứ tự này cho mỗi phần chia octant. 0 1 2 3 4 5 7 6 Các Octant được đánh số của một vùng Hướng qua Hình 7-20

Các đối tượng trong các octant 0, 1, 2, và 3 che khuất các octant phía sau (4, 5, 6, 7) khi hướ

quan sát như trong hình.

n sát

ng

Khi giá trị màu được gặp tại một nút của octree, vùng pixel trong vùng đệm khung tương

ứng với nút này được gán giá trị màu đó chỉ nếu không giá trị nào được lưu trước đó trong vùng này. Không gì được nạp nếu một vùng trống rỗng. Bất kỳ nút nào được phát hiện là bị che khuất hoàn toàn thì sẽ bị loại bỏ khỏi các xử lý trong tương lai, để các các cây con của nó không được truy cập vào. 1 2 3 4 5 7 6 0

Các octant trong không gian

Hình 7-21

Sự phân chia octant cho một vùng không gian và mặt các phần tư tương

ứng.

1 2 3

Các quang cảnh khác nhau của đối tượng

được biểu diễn như octree có thể đạt được bằng cách áp dụng các phép biến đổi đến sự biểu diễn octree để làm thay đổi đối tượng theo hướng quan sát. Ta giả sử rằng biểu diễn octree luôn được xây dựng sao cho các octant 0, 1, 2, và 3 của một vùng hình thành nên mặt phía trước (xem hình 7-20).

0

Các quadrant (góc 1/4) trong mặt phẳng quan sát

Một phương pháp để hiển thị một octree từ trước ra sau là đầu tiên ánh xạ octree vào một quadtree của các vùng nhìn thấy được bằng cách duyệt qua các nút của octree từ trước ra sau trong một quá trình đệ quy. Sau đó biểu diễn quadtree của các mặt nhìn thấy được được nạp vào trong vùng đệm khung. Hình 7-21 mô tả các octant trong một vùng không gian và các quadtree tương ứng trên mặt phẳng quan sát. Các phần tạo thành quadtree 0 lấy từ octant 0 và 4. Các giá trị màu trong góc phần tư 1 (quadrant 1) có được từ các mặt trong octant 1 và 5, và các giá trị trong mỗi của hai quadrant còn lại được sinh ra từ cặp octant thẳng hàng với mỗi quadrant này.

Việc xử lý đệ quy của các nút octree được trình bày trong thủ tục

convert_oct_to_quad, nơi nhận vào một mô tả octree và tạo ra các biểu diễn quadtree cho các mặt nhìn thấy được trong vùng. Trong hầu hết các trường hợp, cả octant phía trước và phía sau phải được xem xét để xác định màu đúng cho một quadrant. Tuy nhiên, ta có thể bỏ qua quá trình xử lý octant phía sau nếu octant phía trước được tô

đồng nhất với vài màu. Đối với các vùng không đồng nhất, thủ tục được gọi đệ quy, với các đối số mới – con của octant không đồng nhất và nút quadtree được tạo mới. Nếu octant phía trước rỗng, chỉ cần xử lý con của octant phía sau. Ngược lại, hai lời gọi đệ quy được làm, một cho octant phía sau và một cho octant phía trước.

type

oct_node_ptr =^ oct_node; oct_entry = record

case homogeneous: boolean of

true : (color : integer); false : (child : oct_node_ptr)

end; {record}

oct_node = array [0..7] of oct_entry;

quad_node_ptr = ^ quad_node; quad_entry = record

case homogeneous: boolean of

true : (color : integer); false : (child : oct_node_ptr) end; {record}

quad_node = array[0..3] of quad_entry;

var

newquadtree : quad_node_ptr; backcolor: integer;

{Giả sử quang cảnh phía trước của một octree (với các octant 0, 1, 2, 3 ở phía trước) và, khi biểu diễn này được hiển thị, biến đổi nó thành một quatree. Nhận một octree như input, nơi mà mỗi phần tử của octree là một giá trị màu (homogeneous = true và octant được tô với màu này) hoặc là con trỏ đến một nút octant con (homogeneous = false).}

procedure convert_oct_to_quad(octree: oct_node;

var quadtree: quad_node);

var k: integer;

begin

for k:=0 to 3 do begin

quadtree[k].homogeneous:=true;

if (octree[k].color>-1) then {octant trước đầy}

quadtree[k].color:= octree[k].color

else {octant trước rỗng}

if octree[k+4].homogeneous then

if (octree[k+4].color > -1) then {trước rỗng, sau đầy}

quadtree[k].color:=octree[k+4].color

else {trước và sau rỗng}

quadtree[k].color:=backcolor

else begin {trước rỗng, sau không đồng nhất}

quadtree[k].homogeneous:=flase; new(newquadtree);

quadtree[k].child: = newquadtree;

end

else begin {trước không đồng nhất, sau không được biết} quadtree[k].homogeneous:=false; new(newquadtree); quadtree[k].child:= newquadtree; convert_oct_to_quad(octree[k+4].child^, newquadtree^); convert_oct_to_quad(octree[k].child^, newquadtree^); end; end; {for} end;

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 150 - 154)

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

(159 trang)