Praca magisterska BVH
Praca magisterska BVH
Praca magisterska BVH
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
28 Spłaszczone hierarchiczne przedziały ograniczające<br />
Algorytm przedstawia się następująco:<br />
1. wrzuć na stos korzeń drzewa z wyzerowaną bryłą otaczającą (bryła ta zostanie<br />
uaktualniona)<br />
2. wykonaj poniższą pętlę dopóki stos jest niepusty:<br />
(a) zdejmij węzeł z wierzchołka stosu;<br />
(b) jeśli to liść, to oblicz dla niego nową bryłę otaczającą i uaktualnij bryłę<br />
otaczającą ojca danego węzła;<br />
(c) jeśli to węzeł wewnętrzny, to wrzuć na stos jego kolejne dziecko z wyzerowaną<br />
bryłą otaczającą, jeśli to ostatnie dziecko, to po uaktualnieniu<br />
go, uaktualnij również bryłę otaczającą jego rodzica (ewentualnie bryłę<br />
otaczającą całą scenę).<br />
W pliku traversetree.cpp można znaleźć implementację tego rozwiązania.<br />
Jak już wspomniałem w poprzednim punkcie, plik ten znajduje się w źródłach<br />
programu opisanego w dodatku A.<br />
2.2.4. Trawersowanie struktury<br />
Ostatnim interesującym algorytmem jest trawersowanie drzewa przez dany promień.<br />
Optymalny algorytm bierze pod uwage dwie kwestie:<br />
• kolejność przeglądania poddrzew danego węzła — faktem jest, że przecięcie<br />
liczymy za jednym zamachem dla wszystkich 4 poddrzew, ale warto je<br />
przeglądać w prawidłowej kolejności, można dzięki takiemu rozwiązaniu zaoszczędzić<br />
sporo czasu<br />
• właściwe ograniczanie sprawdzanego obszaru podczas zagłębiania się w drzewie<br />
— tu trzeba uważać na to, by nie liczyć przecięć z przedziałami ograniczającymi<br />
znajdującymi się poza bryłą otaczającą wynikającą z hierarchii<br />
drzewa, można to zrobić przez odpowiednie zarządzanie wartością określającą<br />
koniec promienia<br />
Mój algorytm przedstawia się następująco:<br />
1. wrzuć korzeń drzewa na stos;<br />
2. dopóki stos jest niepusty wykonaj:<br />
(a) zdejmij węzeł ze stosu;<br />
(b) jeśli to liść, to przetnij promień ze wszystkimi trójkątami, które się w nim<br />
znajdują (jeśli przecięcie znalezione, to uaktualnij promień) i kontynuuj<br />
pętlę;