Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
UNIVERZA V MARIBORU
FAKULTETA ZA ELEKTROTEHNIKO, RA�UNALNI�TVO IN
INFORMATIKO
Denis Horvat
VSEBNOSTNI TEST V PROSTORU Z
ALGORITMOM POLTRAKA
DIPLOMSKO DELO
Maribor, avgust 2011
I
Diplomsko delo univerzitetnega ²tudijskega programa
VSEBNOSTNI TEST V PROSTORU Z
ALGORITMOM POLTRAKA
Avtor: Denis Horvat
�tudijski program: Univerzitetni, Ra£unalni²tvo in informatika
Mentor: prof. dr. Borut �alik
Somentor: asistent Bojan Rupnik, univ. dipl. inº.
Maribor, avgust 2011
II
Zahvaljujem se mentorju, prof. dr. Borutu �aliku,
za pomo£ in vodenje pri opravljanju diplomskega
dela. Prav tako se zahvaljujem somentorju Bo-
janu Rupniku. Hvala tudi Larisi, ki je med pisan-
jem prena²ala moje muhe, in star²em, ki so mi
omogo£ili ²tudij in me podpirali.
III
VSEBNOSTNI TEST V PROSTORU Z
ALGORITMOM POLTRAKA
UDK: 00.92(043.2)
Klju£ne besede: 3D vsebnostni test, ra£unalni²ka geometrija, drevesa kd, delitev
prostora, algoritem
Povzetek:
V diplomskem delu re²ujemo problem vsebnosti v prostoru s pomo£jo poltraka. Problem
re²ujemo brez predhodne priprave podatkov in s pripravo podatkov. Osredoto£imo se
predvsem na metodo s pripravo podatkov, ki za delitev prostora uporablja drevesa kd.
Opi²emo tudi problem geometrijske robustnosti in zanj podamo moºne re²itve. Vse metode
testiramo na razli£nih modelih in jih med seboj primerjamo.
IV
CONTAINMENT TEST IN 3D SPACE
WITH THE RAY ALGORITHM
UDK: 00.92(043.2)
Keywords: 3D inclusion test, computational geometry, kd-trees, spatial subdivi-
sion, algorithm
Summary:
In this thesis we are solving the inclusion test in three-dimensional space with the help of
rays. The problem is solved with and without data preparation. Our main focus was the
data preparation method, which uses the kd-tree structure for spatial subdivision. We also
describe the geometry robustness problem and the solutions for solving it. All methods
are tested on various models and compared with each other.
Kazalo
1 Uvod 1
1.1 Cilji in predpostavke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Struktura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Vsebnostni test v ravnini 3
2.1 Metoda vsote kotov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Metoda enakih predznakov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3 Metoda baricentri£nih koordinat . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3 Vsebnostni test v prostoru s pomo£jo poltraka 8
3.1 Inicializacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2 Iskanje prese£i²£a ravnine trikotnika s poltrakom . . . . . . . . . . . . . . . . . . 9
3.3 Vsebnostni test brez priprave podatkov . . . . . . . . . . . . . . . . . . . . . . . . 11
3.4 Vsebnostni test s pripravo podatkov . . . . . . . . . . . . . . . . . . . . . . . . . 12
4 Implementacija dreves kd za ugotavljanje vsebnosti v prostoru s pomo£jo
poltraka 16
4.1 Struktura vozli²£a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2 Konstrukcija drevesa kd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.2.1 Dolo£itev poloºaja lo£itvene ravnine . . . . . . . . . . . . . . . . . . . . . 19
4.2.2 Zaklju£itveni kriteriji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.3 Uporaba drevesa kd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.4 Teºave z numeri£no stabilnostjo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5 Rezultati in primerjave 27
6 Sklep 32
Poglavje 1
Uvod
Vsebnostni test (angl. inclusion test) predstavlja zelo pomembno operacijo v ra£unalni²ki
geometriji. Z uporabo vsebnostnega testa ugotovimo, ali se to£ka nahaja v dolo£enem
objektu, kar predstavlja osnovno operacijo, ki je nepogre²ljiva vse od podro£ja ra£unal-
ni²kih iger, do okolij GIS (Geographic information system). Ker vsebnostni test pona-
vadi predstavlja za£etek bolj zapletene operacije, lahko mo£no vpliva na skupno hitrost
dolo£enega algoritma, zato je pomembno, da je zanesljiv in hiter.
Obstaja veliko algoritmov, ki re²ujejo problem vsebnostnega testa, a v osnovi bi jih
lahko razdelili na algoritme, ki za svoje delovanje ne potrebujejo priprave podatkov in
algoritme, ki pripravo podatkov potrebujejo.
1.1 Cilji in predpostavke
Cilji, ki smo si jih postavili, so implementirati in analizirati algoritme, ki re²ujejo problem
vsebnosti v prostoru. Z njimi bomo posku²ali dose£i £im hitrej²a izvajanja in ob tem
ohraniti £im ve£jo robustnost.
V podanih re²itvah predpostavljamo, da so 3D objekti predstavljeni s trikotni²ko mreºo
in ne vsebujejo lukenj. Velikost modelov ne bo presegala velikosti hitrega pomnilnika.
1.2 STRUKTURA 2
1.2 Struktura
Diplomsko delo je, skupaj z uvodnim, razdeljeno na 6 poglavij. V poglavju 2 predstavimo
nekaj re²itev problema vsebnosti v ravnini. V 3. poglavju opi²emo, kako se lahko problema
vsebnosti lotimo v prostoru s pomo£jo poltraka s pripravo in brez priprave podatkov.
Poglavje 4 sestoji iz podrobnega opisa implementacije dreves kd, s katerimi u£inkovito
razdelimo prostor. Vsebina poglavja 5 je sestavljena iz primerjav in testnih rezultatov
opisanih algoritmov. Delo povzamemo v poglavju 6.
Poglavje 2
Vsebnostni test v ravnini
Preden se lotimo problema v prostoru, je smiselno, da najprej podamo re²itve v ravnini.
Re²itve bomo uporabili v poglavju 3, ko bomo izvajali vsebnostni test v prostoru. Obstaja
veliko algoritmov, ki problem vsebnosti re²ujejo za vse vrste mnogokotnikov. Glede na
to, da bomo obravnavali modele, predstavljene s trikotni²ko mreºo, se bomo omejili le na
trikotnike. Opisali bomo tri metode, ki smo jih implementirali in ki u£inkovito in brez
priprave podatkov re²ujejo problem to£ke v trikotniku (angl. point in triangle test). Treba
je omeniti, da imajo algoritmi za ekstremne primere teºave s kon£no aritmetiko, ki se ji
bomo posvetili v podpoglavju 4.4.
2.1 Metoda vsote kotov
Imejmo enostaven mnogokotnik brez lukenj z n ogli²£i. Naj bo to£ka P testirana to£ka.
Vsebnostni test izvedemo na naslednji na£in:
• iz to£ke P potegnimo poltrake v ogli²£a mnogokotnika,
• izra£unamo in se²tejemo kote med sosednjimi poltraki, kjer kot med dvema vektor-
jema izra£unamo s pomo£jo skalarnega produkta:
θ = arccos
(~a~b
|~a||~b|
)(2.1)
• £e je dobljen rezultat enak 2π (360◦), to£ka leºi znotraj mnogokotnika, £e je 0, pa
to£ka leºi izven mnogokotnika (slika 2.1).
2.2 METODA ENAKIH PREDZNAKOV 4
Metoda vsote kotov [6] ima £asovno zahtevnost O(n) in je precej po£asna, saj je ra£u-
nanje kotov zahtevna operacija. Ta po£asnost je v na²em primeru manj²a, saj moramo za
trikotnik opraviti samo 3 izra£une, a je metoda vsote kotov dale£ najpo£asnej²a izmed treh
opisanih v tem poglavju. Metodo je mogo£e uporabiti tudi pri mnogokotnikih z luknjami,
a pod pogojem, da vemo na katerem nivoju se nahajajo.
Slika 2.1: Metoda vsote kotov
2.2 Metoda enakih predznakov
Imejmo izbo£en mnogokotnik, ki je orientiran tako, da si ogli²£a trikotnika ABC sledijo v
smeri urinega kazalca. Naj bo P testirana to£ka, A in B pa dve izmed ogli²£ mnogokot-
nika. �e razdelimo prostor po robu AB (z vektorjem −→w ), je ena stran, ki nikoli ne vsebuje
mnogokotnika. Stran, na kateri leºi to£ka, dobimo s pomo£jo vektorskega produkta.
Slika 2.2: Dolo£itev strani to£ke glede na rob mnogokotnika
Glede na sliko 2.2 izra£unajmo vektorski produkt med −→w in −→u . Dobimo vektor, ki kaºe
proti nam. V nasprotnem primeru, £e izra£unamo vektorski produkt med −→w in −→v , pa do-
bimo vektor, ki kaºe vstran od nas. Sklepamo lahko, da bodo vsi rezultati vektorskega pro-
dukta s to£kami nad −→w imeli enake predznake, in sicer nasprotne kot rezultati vektorskega
2.3 METODA BARICENTRI�NIH KOORDINAT 5
produkta s to£kami, ki so pod −→w. Metoda enakih predznakov [1, 15] predpostavlja, da,
£e bodo rezultati vektorskih produktov vseh stranic imeli enak predznak, je to£ka znotraj
mnogokotnika, v kolikor pa med preverjanjem ugotovimo, da se je predznak spremenil,
lahko test predhodno prekinemo, kar ²e dodatno pohitri testiranje. Test prikazuje slika
2.3.
Slika 2.3: Vsebnostni test enakih predznakov
�asovna zahtevnost algoritma je v najslab²em primeru O(n) in je veliko hitrej²i in
natan£nej²i kot algoritem vsote kotov, saj je izra£un vektorskega produkta hitra operacija.
2.3 Metoda baricentri£nih koordinat
Baricentri£ni koordinatni sistem (angl. Barycentric coordinate system) je leta 1827 pred-
stavil August Ferdinand Möbius. Opisal ga je kot koordinatni sistem, v katerem je lokacija
to£ke dolo£ena kot sredi²£e mase oziroma baricentra mas, postavljenega na ogli²£a trikot-
nika. Baricentri£ne koordinate so oblika homogenih koordinat. Metodo, kako s pomo£jo
baricentri£nih koordinat re²iti vsebnostni test v trikotniku, sta predlagala Möller in Trum-
bore [3].
To£ke trikotnika ABC tvorijo ravnino v prostoru. To£ke so dane s: T(u, v, w) = uA +
vB + wC, kjer so (u, v, w) baricentri£ne koordinate to£ke na ravnini, tako da je u + v +
w = 1 (slika 2.4).
2.3 METODA BARICENTRI�NIH KOORDINAT 6
Slika 2.4: Baricentri£ne koordinate
Izberimo si eno to£ko trikotnika in predvidevajmo vse poloºaje drugih to£k, relativno glede
na to to£ko. Na primer, izberimo si to£ko A (slika 2.5). Nadalje potrebujemo ²e bazne
vektorje, s pomo£jo katerih bomo lahko izra£unali vse to£ke na tej ravnini. Za bazo vza-
memo roba trikotnika, ki se stikata z A: −→n = B - A in −→m = C - A. Zdaj lahko iz te to£ke
pridemo do katere koli to£ke na ravnini, tako da za£nemo pri to£ki A in se sprehodimo
dolo£eno dolºino po −→m in −→n . Glede na re£eno lahko vsako to£ko na ravnini zapi²emo kot:
P = A+ u−→m + v−→n (2.2)
�e gledamo ena£bo (2.2) in sliko 2.5 opazimo, da £e sta u ali v manj²a od 0, potem gremo
izven trikotnika, enako velja, £e je u+v > 1. Za ustrezen izra£un baricentri£nih koordinat
u in v izhajamo iz ena£be 2.2:
(P − A) = u−→m + v−→n−→w = u−→m + v−→n
(2.3)
Imamo dve neznanki, zato potrebujemo dve ena£bi. Ena£bo 2.3 mnoºimo enkrat z vek-
torjem −→m , drugi£ z −→n . Rezultat sta ena£bi za u in v :
u =(−→n−→n )(−→w−→m)− (−→n−→m)(−→w−→n )
(−→m−→m)(−→n−→n )− (−→m−→n )(−→n−→m)(2.4)
v =(−→m−→m)(−→w−→n )− (−→m−→n )(−→w−→m)
(−→m−→m)(−→n−→n )− (−→m−→n )(−→n−→m)(2.5)
2.3 METODA BARICENTRI�NIH KOORDINAT 7
Glede na to, da sta imenovalca v ena£bah enaka, lahko algoritem ²e dodatno pohitrimo
tako, da imenovalec izra£unamo samo enkrat. �e dobljen u in v zadostujeta pogojem u
> 0, v > 0 in u + v < 1, potem to£ka leºi znotraj trikotnika.
Slika 2.5: Prikaz vsebnostnega testa z baricentri£nimi koordinatami
Rezultat je algoritem, ki se izvede ²e hitreje kot algoritem enakih predznakov, saj je
ra£unsko manj zahteven.
Poglavje 3
Vsebnostni test v prostoru s pomo£jo
poltraka
Ideja za test vsebnosti s pomo£jo sledenja poltraku (angl. ray tracing) je naslednja: iz
to£ke, ki sluºi kot izhodi²£e, po²ljemo poltrak v eno smer. Poltraki vseh testiranih to£k
bodo poslani v enako smer. V primeru, da je ²tevilo prese£i²£ z objektom liho, je to£ka v
objektu, v nasprotnem primeru je zunaj objekta (slika 3.1).
Slika 3.1: Vsebnostni test v prostoru s pomo£jo poltraka
3.1 INICIALIZACIJA 9
3.1 Inicializacija
Na²a implementacija je sposobna nalagati modele formata VRML v2.0 (angl. Virtual
Reality Modeling Language). Format je standarden za prikaz tridimenzionalne vektorske
gra�ke na svetovnem spletu. Zamenjal ga je format X3D. V datoteki so zapisana ogli²£a
(angl. vertices) in lica (angl. faces) 3D objekta skupaj z barvami, teksturami, svetilnostjo.
Poleg tega VRML podpira tudi animacije, zvoke in interakcijo z geometrijskimi modeli.
V na²i implementaciji med nalaganjem shranjujemo podatke modela v dinami£no polje,
ki uporablja strukturo triangle. Ta struktura vsebuje:
• 3 ogli²£a trikotnika in
• normalo trikotnika.
Ogli²£a in normala so tipa vector3, ki vsebuje koordinate x, y in z. Normalo za vsako lice
izra£unamo ºe med nalaganjem modela, saj jo potrebujemo med vsebnostnim testom, ki
je posledi£no hitrej²i. To normalo uporabljamo tudi za osnovno plosko sen£enje (angl. �at
shading) modelov, izra£unamo pa jo s pomo£jo vektorskega produkta. Med nalaganjem
i²£emo tudi ekstremni ogli²£i celotnega objekta. Ti ogli²£i bomo potrebovali kasneje pri
vsebnostem testu s pripravo podatkov, opisanemu v podpoglavju 3.4.
3.2 Iskanje prese£i²£a ravnine trikotnika s poltrakom
Uporabljeni modeli so sestavljeni iz trikotnikov, zato je prese£i²£e z modelom v bistvu
prese£i²£e z enim izmed trikotnikov, ki je del modela. Test, £e poltrak (angl. ray) seka
posamezen trikotnik naredimo tako, da:
• poi²£emo prese£i²£e z ravnino posameznega trikotnika,
• nad tem prese£i²£em izvedemo vsebnostni test z eno izmed metod poglavja 2.
Preden lahko izra£unamo prese£i²£e z ravnino trikotnika, moramo omeniti, da lahko vsako
to£ko na poltraku izrazimo po ena£bi (3.1), kjer predstavlja O izhodi²£e poltraka, t dolºino
na poltraku in−→D smerni vektor.
P = O + t−→D (3.1)
3.2 ISKANJE PRESE�I��A RAVNINE TRIKOTNIKA S POLTRAKOM 10
Se pravi, £e ugotovimo dolºino t na poltraku, potem bomo ugotovili, kje leºi prese£i²£e z
ravnino testiranega trikotnika. Izhajamo iz osnovne ena£be za ravnino, ki jo lahko izrazimo
na ve£ na£inov [12]:
• de�nicija iz normale ravnine in to£ke na ravnini,
• de�nicija iz dveh vektorjev ravnine in to£ke na ravnini ter
• de�nicija iz treh to£k na ravnini.
V na²i implementaciji smo si izbrali prvi na£in, saj normalo trikotnika (ki je hkrati tudi
normala ravnine tega trikotnika) poznamo ºe iz inicializacije modela (podpoglavje 3.1).
Preden posku²amo najti prese£i²£e poltraka z ravnino, najprej preverimo paralelnost s
skalarnim produktom med normalo ravnine in smernim vektorjem. V primeru rezultata 0,
lahko preverjanje zaklju£imo, saj je poltrak vzporeden z ravnino (slika 3.2) in posledi£no
ne more sekati testiranega trikotnika. V nasprotnem primeru nadaljujemo z ra£unanjem.
Slika 3.2: Poltrak, vzporeden glede na ravnino trikotnika
Vzemimo ena£bo ravnine (3.2), kjer je Pn ena izmed to£k trikotnika,−→N normala ravnine
in d oddaljenost ravnine od izhodi²£a (0,0,0).
0 = Pn ∗−→N + d //izrazimo d (3.2)
d = −(Pn ∗−→N )
Manjka nam ²e t (dolºina po poltraku). Uporabimo ena£bo (3.2) in namesto Pn vstavimo
3.3 VSEBNOSTNI TEST BREZ PRIPRAVE PODATKOV 11
ena£bo (3.1). Dobimo:
0 = (O + t−→D) ∗
−→N + d //izrazimo t (3.3)
t =−(O ∗
−→N + d)
−→D ∗ ~N
V primeru, da je t iz ena£be (3.3) negativen, se prese£i²£e nahaja za izhodi²£em poltraka
(slika 3.3), kar nas ne zanima in preverjanje zaklju£imo. Ko pa je t pozitiven, rezultat
vstavimo v ena£bo (3.1). Dobimo prese£i²£e poltraka z ravnino trikotnika (slika 3.4).
Slika 3.3: Prese£i²£e leºi za izhodi²£em poltraka
Slika 3.4: Prese£i²£e leºi na ravnini
3.3 Vsebnostni test brez priprave podatkov
Vsebnostni test brez priprave podatkov za svoje delovanje ne potrebuje nobenega pred-
ra£unanja ali predshranjevanja podatkov. Za ta test smo implementirali osnovno naivno
metodo testiranja vsebnosti. Bistvo te metode je, da z danim poltrakom testiramo vsak
trikotnik objekta. Metoda deluje, a je zelo po£asna, ²e posebej, £e imamo v modelu veliko
trikotnikov in testiramo ve£ to£k. Testiranje prese£i²£a med poltrakom in posameznim
3.4 VSEBNOSTNI TEST S PRIPRAVO PODATKOV 12
trikotnikom je ra£unsko zahtevno. Najprej moramo poiskati prese£i²£e ravnine trikotnika
s poltrakom in potem izvesti vsebnostni test nad tem prese£i²£em in trikotnikom. Zaradi
po£asnosti je pametno, da razmislimo o moºnih pohitritvah:
• hitrej²i vsebnostni test to£ke v trikotniku,
• hitrej²e iskanje prese£i²£a poltraka z ravnino in
• zmanj²anje ²tevila testiranj.
Glede na to, da se prvi dve komponenti izvedeta ºe relativno hitro, nam ostane tretja
to£ka, ki med drugim vpliva na prvi dve in bi lahko drasti£no izbolj²ala hitrost na²ega
testa. Na£inom, kako zmanj²ati ²tevilo testiranj, smo posvetili naslednje podpoglavje,
kjer bomo s pripravo podatkov dosegli bolj²e rezultate.
3.4 Vsebnostni test s pripravo podatkov
Kot smo ºe nakazali v prej²njem podpoglavju, je za doseganje bolj²ih rezultatov potrebno
zmanj²ati £im ve£ nepotrebnih preverjanj, £e poltrak seka trikotnik. To naredimo tako,
da se omejimo samo na prostor, kjer se nahaja poltrak. Preverimo samo trikotnike, ki so
v tem omejenem prostoru. Iz slike 3.5 vidimo, da je ve£ina testiranj nepotrebnih. Slika
prikazuje, kako bi lahko preverili eno to£ko, na² cilj pa je, kako preveriti poljubno ²tevilo
to£k, ne da bi morali za vsako posebej izra£unati podro£je preverjanja. Ponudi se re²itev:
1. Opazovano sceno predhodno razdelimo s pomo£jo podatkovne strukture.
2. Shranjeno razdelitev uporabimo ob izvajanju testiranja.
V nadaljevanju na kratko opi²emo nekaj moºnosti, kako u£inkovito razdeliti prostor (ve£
o tem [4]).
3.4 VSEBNOSTNI TEST S PRIPRAVO PODATKOV 13
Slika 3.5: Omejitev testiranj na dolo£eno obmo£je (ozna£eno z rde£o)
Enakomerno porazdeljene mreºe
Ena metoda je, da opazovan prostor prekrijemo s tridimenzionalno enakomerno porazde-
ljeno mreºo (angl. uniform grid). S tem doseºemo, da se prostor deli na veliko celic enakih
velikosti. Vsak objekt poveºemo s celico, ki ga vsebuje. Dostop do celic je preprost: glo-
balne koordinate delimo z velikostjo celice, da dobimo koordinate celice. Posledi£no je tudi
poenostavljen dostop do sosednih celic. Teºava, s katero se soo£imo ob gradnji mreºe, je
velikost celic, saj so lahko objekti vsebovani v ve£ celicah, kar pa ni ugodno, saj moramo
posledi£no preveriti ve£ celic.
Hierarhi£no porazdeljene mreºe
Nadaljevanje ideje enakomerno porazdeljene mreºe predstavljajo hierarhi£no porazdeljene
mreºe (angl. hierarhical grids), ki se u£inkovito spopadejo s problemom velikosti celic, te
pa predstavljajo teºave predvsem pri objektih z neenakomerno porazdelitvijo. Celice so
predstavljene na razli£nih nivojih in so razli£nih velikosti. Del objekta je lahko vsebovan
v najve£ eni celici. �tevilo nivojev je lahko razli£no. Ta razdelitev (slika 3.6) je zelo
u£inkovita, ko imamo opravka z dinami£nimi objekti.
3.4 VSEBNOSTNI TEST S PRIPRAVO PODATKOV 14
Slika 3.6: Hierarhi£no porazdeljene mreºe
Drevesa
Ideja dreves je, da rekurzivno delijo prostor, dokler ni doseºen zaklju£ni kriterij (dolo£ena
globina, ²tevilo objektov v trenutni celici). Poznamo ve£ vrst dreves:
Osmi²ka/²tiri²ka drevesa: Osmi²ko drevo (angl. octree) rekurzivno deli trenutno
celico na polovici vsake osi, da dobi 8 novih celic (slika 3.7). V ravnini uporabljamo ²tiri²ka
drevesa (angl. quadtree), ki celico razdelijo na 4 nove celice.
Slika 3.7: Deljenje prostora z osmi²kim drevesom
3.4 VSEBNOSTNI TEST S PRIPRAVO PODATKOV 15
BSP drevesa: Drevo binarne delitve prostora (angl. Binary Space Partitoning tree -
BSP) je bilo razvito za re²evanje problema zakritih ploskev, njihovo uporabo pa najdemo
tudi v aplikacijah sledenja ºarku in zaznavanja trkov. Drevo BSP ima dve varianti: osno
poravnano in mnogokotni²ko poravnano(slika 3.8). Mnogokotni²ka varianta za delitveno
ravnino vzame ravnino, na kateri temelji mnogokotnik. Osno orientirano varianto, ime-
novano tudi drevo kd, smo implementirali v na²i aplikaciji, zato jo bomo podrobno opisali
v poglavju 4.
Slika 3.8: Mnogokotni²ko poravnana varianta drevesa BSP
Poglavje 4
Implementacija dreves kd za
ugotavljanje vsebnosti v prostoru s
pomo£jo poltraka
Za hitro in u£inkovito opravljanje testa vsebnosti moramo predhodno razdeliti prostor,
da zmanj²amo ²tevilo testiranj med trikotniki in poltrakom. Nekaj metod razdeljevanja
prostora smo na kratko opisali v podpoglavju 3.4. V na²i aplikaciji smo izvedli vsebnostni
test s pomo£jo osno poravnane variante drevesa BSP, imenovane tudi drevo kd.
Drevo dimenzije k (angl. k-dimensional tree) je binarno drevo, v katerem je vsako
vozli²£e k-dimenzionalna to£ka. V na²i aplikaciji smo se omejili le na tri dimenzije. Za
razliko od osmi²kega drevesa tukaj prostora ne delimo v treh dimenzijah naenkrat, ampak
vsako dimenzijo posebej v svoji globini. Delitev prostora doseºemo z ravnino (v drugi
dimenziji bi jo s £rto), ki je vedno vzporedna z eno izmed osi. Drevo kd je za vrsto objektov
S po [5] de�nirano kot: Vsako vozli²£e v je v drevesu povezano s svojo osno poravnanim
omejujo£im kvadrom (angl. axis aligned bounding box) AABB(v), ki predstavlja celico.
Celica, ki je povezana s prvim (korenskim) vozi²£em je kvader AB, ki vsebuje vse objekte
S (slika 4.2). Vsakemu nekon£nemu vozli²£u je dodeljena ravnina Hv, ki deli trenuten
AABB(v) na dve novi celici. Vsako kon£no vozli²£e (list) vsebuje seznam vseh objektov,
ki so v celici trenutnega vozli²£a. V primeru, da list vsebuje vsaj en objekt, ga imenujemo
poln list, v nasprotnem primeru pa prazen list (slika 4.1).
4.1 STRUKTURA VOZLI��A 17
Slika 4.1: Prikaz delitve 2d prostora z drevesom kd
Slika 4.2: Omejujo£ kvader za£etne scene
4.1 Struktura vozli²£a
Drevo v na²em programu zgradimo s pomo£jo strukture kdNode, ki vsebuje:
• QVector<triangle*>* trianglesInCell: Dinami£no polje (vektor), ki vodi se-
znam vseh vsebovanih trikotnikov trenutnega kvadra. Uporabljamo kazalce, saj
seznam vseh trikotnikov vodi ºe spremenljivka model, ki jo inicializiramo v pod-
4.1 STRUKTURA VOZLI��A 18
poglavju 3.1. Tako tukaj samo dobimo ustrezne naslove in se izognemo veliki redun-
danci enakih objektov v pomnilniku. V primeru, da vozli²£e ni list, je ta vrednost
nastavljena na NULL.
• kdNode* leftCell: Spremenljivka hrani kazalec na levo polovico razdeljene celice.
V primeru, da vozli²£e nima levega sina, ima vrednost NULL.
• kdNode* rightCell: Spremenljivka hrani kazalec na desno polovico razdeljene
celice. V primeru, da vozli²£e nima desnega sina, ima vrednost NULL.
• �oat splitPosition: Spremenljivka hrani poloºaj, na katerem smo razdelili celico.
• short axis: Spremenljivka nosi oznako osi, ki je bila razdeljena.
Velikost strukture: trianglesInCell + leftCell + rightCell + splitPosition + axis = 18
zlogov (4*4 + 2 = 18). To lahko z malce ve£ znanja iz ra£unalni²kih arhitektur brez
velikih sprememb zmanj²amo, saj lahko pri velikih modelih ²tevilo objektov zelo naraste.
Podatkovni tip �oat je predstavljen s 4 zlogi, kar pomeni 32 bitov. V primeru, da na²i
spremenljivki splitPosition spremenimo zadnja 2 bita v neki nam uporabni zastavici, bo
to imelo zelo majhen u£inek na vrednost, ki ne bo spremenila u£inkovitosti delitve. Naj
bodo osi ozna£ene z 2 bitoma: x = 00, y = 01 in z = 10. Ko delimo dolo£eno os, podatek
z njeno oznako (katero os delimo) zapi²emo v zadnja 2 bita spremenljivke splitPosition.
Vrednost enostavno spet dobimo z bitnimi operacijami in ustrezno masko. S to spremembo
zmanj²amo velikost na²e strukture na 16 zlogov. Obstajajo na£ini, kako strukturo ²e
dodatno zmanj²ati. Objekte shranjujemo zaporedno v pomnilnik (objekti se shranijo
zaporedno, £e so shranjeni v polju) in posledi£no nam ni potrebno shranjevati naslovov, saj
jih lahko izra£unamo iz naslova trenutnega vozli²£a (naslovi imajo v na²em primeru velikost
4 zloge): naslovLeviSin = naslovTrenutnoVozlisce + 4; naslovDesniSin = naslovLeviSin
+ 4. Hitrost lahko ²e dodatno izbolj²amo, £e programiramo zavestno za predpomnilnik
(angl. cache aware) [4], s £imer pa se mi nismo ukvarjali.
4.2 KONSTRUKCIJA DREVESA KD 19
4.2 Konstrukcija drevesa kd
Konstrukcijo drevesa pri£nemo s celico na²e celotne scene (slika 4.2). Za£etna ekstrema
smo izra£unali ºe v inicializaciji. Celico vozli²£a rekurzivno delimo na vsakem nivoju z
lo£itveno ravnino. Osi, ki jih bomo delili, izbiramo v ciklu (angl. round robin method): x,
y, z, x, y ... Druga alternativa bi bila, da bi vedno razdelili najdalj²o os. Os lahko delimo
na poljubni poziciji, dokler je delitvena ravnina vzporedna z eno izmed osi. Pri gradnji
drevesa kd si moramo postaviti dve pomembni vpra²anji:
• Kje postaviti lo£itveno ravnino?
• Kdaj kon£ati z deljenjem prostora?
4.2.1 Dolo£itev poloºaja lo£itvene ravnine
Izbira poloºaja lo£itvene ravnine je najpomembnej²a naloga pri gradnji drevesa kd. Od-
lo£itev, kam jo postavimo, dolo£a razliko med dobrim in slabim drevesom, ki lahko zelo
vpliva na hitrost. Poznamo ve£ na£inov dolo£itve poloºaja lo£itvene ravnine:
• Prostorska mediana: Prostor delimo vedno na polovici trenutne osi. U£inkovitost
te metode je odvisna od oblike geometrijskega objekta.
• Objektna mediana: Deli prostor na tak²en na£in, da posku²a ²tevilo objektov na
vsaki strani ohraniti pribliºno enako. Tega na£ina dolo£itve poloºaja ravnine nismo
implementirali, saj ima metoda ºe v teoriji veliko pomanjkljivost [9, 5]: V primeru, da
bi prostor vedno delili glede na vsebino objektov, bi dobili bolj uravnove²eno drevo
kot pri drugih metodah. To se nam mogo£e zdi dobra ideja, a v praksi se izkaºe
za slabo. Pregledati bomo namre£ morali vsebino vseh celic, skozi katere potuje
poltrak, saj bo vsaka vsebovala trikotnike (noben list ne bo prazen list). Vzemimo
situacijo iz slike 4.3: Prostor delimo najprej po x in potem na vsaki polovici ²e po y.
Tudi v primeru, da poltrak lahko po²ljemo mimo trikotnikov, bomo ²e vedno morali
opraviti nepotrebne teste.
4.2 KONSTRUKCIJA DREVESA KD 20
Slika 4.3: Prikaz delitve 2d prostora s kriterijem objektne mediane
• Ocenitvena hevristika: Pri deljenju prostora s pomo£jo ocenitvene hevristike
posku²amo prostor razdeliti tako, da ustvarimo £im ve£ ve£jih praznih celic (slika
4.4) £im bliºja korenskemu vozli²£u. V na²i implementaciji smo uporabili hevris-
tiko SAH (angl. surface area heuristic). Za vsako potencialno delitev izra£unamo
tako imenovano ceno delitve. Na koncu izberemo tisto delitveno ravnino, ki ima
najniºjo ceno. Kako dobimo ceno? Verjetnost, da bo poltrak sekal trenutno celico,
je povezana s povr²ino celice (4.1), kjer je s ²irina, v vi²ina in g globina.
p = 2 ∗ (s ∗ v + s ∗ g + g ∗ v) (4.1)
Ceno ene celice dobimo iz formule (4.2), kjer je cpl cena pre£kanja celice, pl povr²ina
celice, stprim ²tevilo trikotnikov v celici in cs cena sekanja celice. cpl in cs sta kon-
stanti.
cena = cpl + pl ∗ stprim ∗ cs (4.2)
Ceno delitve dobimo tako, da izra£unamo ceni obeh potencialnih delitvenih celic in ju
se²tejemo. Potencialni kandidati za optimalni poloºaj delitvene ravnine so ekstremi
(glede na os) vseh trikotnikov v objektu. Se pravi, £e je objekt sestavljen iz 5000
trikotnikov, imamo za prvo delitev 10000 kandidatov. Za vsako delitev moramo tudi
vedno pre²teti, koliko trikotnikov vsebujeta novi celici. To je zelo draga operacija,
zaradi katere je delitev zelo po£asna, zato smo po [9] izvedli izbolj²avo: poiskali
smo delitvene poloºaje in jih shranili v polje. To polje smo v £asu O(n*log(n))
4.2 KONSTRUKCIJA DREVESA KD 21
uredili od najmanj²ega do najve£jega in odstranili dvojnike. Glede na to, da je polje
urejeno, ra£unamo cene delitvenih poloºajev od leve proti desni. Za tiste trikotnike,
za katere smo ugotovili, da so ºe levo, ozna£imo in jih naslednji£ ve£ ne testiramo,
saj ne morejo biti ve£ desno. Delitev se izvede veliko hitreje, a ²e vedno prepo£asi
za objekte z veliko trikotniki. Zato smo implementirali tudi metodo, ki uporablja
isto hevristiko, vendar je kandidatov delitev veliko manj (razdelimo delitveno os na
k delov, kjer je k [30-100]). Rezultat ni optimalen, a je skoraj v vseh primerih bolj²i
kot navadna delitev prostora z mediano.
Slika 4.4: Prikaz delitve ravnine s kriterijem ocenitvene hevristike
4.2.2 Zaklju£itveni kriteriji
Povedali smo, kako razdelimo prostor, nismo pa omenili, kdaj ga nehamo deliti. Deliti
nehamo, ko doseºemo dolo£eno globino drevesa dmax, ali je v celici manj kot tmax trikot-
nikov. Konstanti dmax in tmax dolo£imo sami. Pri na²ih testiranjih v ve£ini primerov
uporabljamo dmax = 20 in tmax = 4. Pri ocenitveni hevristiki se ponudi ²e en zaklju£itveni
kriterij: delimo tako dolgo, dokler je cena deljenja na globini n niºja kot pa cena deljenja
na globini n-1 (na isti veji drevesa).
4.3 UPORABA DREVESA KD 22
Slika 4.5: Prikaz delitve s prostorsko mediano (levo) in SAH (desno) pri globini 9
4.3 Uporaba drevesa kd
Princip uporabe drevesa je naslednji: poi²£emo vse liste (kon£na vozli²£a), ki jih seka na²
poltrak in preverimo vse trikotnike, ki so v njih. V na²i implementaciji smo uporabili
algoritem TAArec (angl. Recursive Ray Traversal Algorithm) [7, 4]. Potem, ko poltrak
vstopi v vozli²£e drevesa kd, ki ima dvoje podvozli²£, se dolo£i, ali morata biti pregledani
obe in v kak²nem vrstnem redu. Na ti vozli²£i se gleda glede na izvor poltraka in poloºaj
delitvene ravnine, kot na "bliºje" in "oddaljeno" vozli²£e. TAArec se na vsakem koraku
odlo£i, katero podvozli²£e bo pregledano. Vedno izra£unamo oddaljenost t do delitvene
ravnine v trenutno obiskanem vozli²£u. Za korensko vozli²£e izra£unamo tudi vhodno in
izhodno oddaljenost dvhod in dizhod, ki se skozi globino glede na trenutno vozli²£e spre-
minjata. Oddaljenost do ravnine dobimo po (4.3), kjer je S delitvena pozicija, O izvor
poltraka, D orientacija poltraka in a trenutna delitvena os.
t =S −Oa
Da
(4.3)
4.3 UPORABA DREVESA KD 23
Glede na dolºine po poltraku dvhod, dizhod in t lahko dobimo naslednje situacije:
a) t > dizhod: poltrak seka bliºje vozli²£e,
b) t < dvhod: poltrak seka oddaljeno vozli²£e,
c) dvhod < t < dizhod: poltrak seka bliºje in oddaljeno vozli²£e.
Slika 4.6: Prikaz osnovnih situacij pregleda drevesa kd
V primeru a in b se spustimo v bliºnje oziroma oddaljeno vozli²£e in rekurzivno na-
daljujemo, dokler ne pridemo do lista. Pri primeru c pa oddaljeno vozli²£e shranimo na
sklad in najprej rekurzivno razre²imo bliºje vozli²£e, nato pa ²e oddaljeno. Vedno, ko
pridemo do lista, preverimo vse trikotnike, ki jih ta vsebuje. Hitrost je odvisna predvsem
od kvalitete drevesa, ki smo jo obdelali v prej²njem poglavju.
4.4 TE�AVE Z NUMERI�NO STABILNOSTJO 24
Slika 4.7: Prikaz vsebnostnega testa (levo) poltrakov, preverjenih trikotnikov in listov
(desno)
4.4 Teºave z numeri£no stabilnostjo
Numeri£na stabilnost je v geometrijskih algoritmih zaºelena lastnost, ki pa jo je teºko
dose£i. Pravimo, da je algoritem nestabilen, ko ob ve£ini situacij deluje pravilno, v neka-
terih primerih pa pride do napak, ki vodijo k zru²itvi aplikacije ali do napa£nih rezultatov.
Teoreti£no so rezultati lahko pravilni, v praksi pa realnih ²tevil ne moremo predstaviti
povsem natan£no (s celimi ²tevili ni teºav). Omejeni smo s 4 (�oat) ali 8 (double) zlo-
govno predstavitvijo realnega ²tevila. Nastanejo lahko naslednje napake [4, 8]:
• Pretvorbene in predstavitvene napake (angl. Converstation and repre-
sentation errors): Veliko napak izvira iz tega, da nekatera decimalna ²tevila ne
morejo biti to£no predstavljena kot binarna ²tevila, zato so zaokroºena na najbliºje
pribliºke. Ti pribliºki pa lahko povzro£ajo napake.
• Napake prevelikih oziroma premajhnih ²tevil (angl. Over�ow and under-
�ow errors): Lahko se nam zgodi primer, da je ²tevilo preveliko (over�ow) oziroma
premajhno (under�ow), da bi bilo ra£unalni²ko predstavljivo. Te napake se dogajajo
v primerih, ko mnoºimo med sabo dve veliki (ali majhni) ²tevili. Podobno se zgodi,
£e veliko ²tevilo delimo z zelo majhnim (ali obratno).
4.4 TE�AVE Z NUMERI�NO STABILNOSTJO 25
• Zaokroºitvene napake (angl. Round o� errors): V primeru, ko delimo dve
²tevili a = b/c, a zahteva natan£nost, ki je ve£ja od b in c. �e predstavitev tega
²tevila ne bo moºna (²tevilo ima na voljo premalo bitov), koli£nik ne bo povsem
natan£en. Zaokroºitvene napake se dogajajo pri ve£ini operacij in ne samo pri del-
jenju.
• Izni£itev ²tevk (angl. Digit-cancellation errors): Te napake se zgodijo, ko
med sabo od²tejemo skoraj enaki vrednosti, ali ko je majhna vrednost pri²teta k
veliki.
Ra£unalni²ka geometrija je posebej ob£utljiva na omenjene napake, zato smo morali pri
na²i implementaciji paziti na kar nekaj stvari. Prva izmed teh je bila primerjava realnih
²tevil. Ob primerjavi bomo skoraj vedno dobili rezultat, ko ²tevili nista enaki, £eprav
na prvi pogled sta. Razlikujeta se namre£ v razli£nih zelo majhnih decimalkah, ki so
nastale zaradi zaokroºevanja. Ena izmed re²itev bi bila uvedba absolutne tolerance, kjer
primerjamo dve ²tevili a in b s pomo£jo zelo majhne vrednosti epsilon ε:
if(Abs(a− b) <= ε) (4.4)
Pri dani re²itvi (4.4) je v£asih zelo teºko dolo£iti ustrezen ε, zato smo se odlo£ili za drugo al-
ternativo, in sicer uvedbo relativnega epsilona. Zato, ker programiramo s pomo£jo ogrodja
Qt, nam je na voljo funkcija qFuzzyCompare, ki sprejme dve realni ²tevili in ju primerja
s pomo£jo relativnega ε (4.5), s katerim doseºemo robustnej²o preverjanje za ceno vi²je
ra£unske zahtevnosti.
if(Abs(a− b) <= ε ∗Min(Abs(a), Abs(b))) (4.5)
Naslednji ve£ji problem je, ko poltrak seka skupni rob trikotnikov (slika 4.8). V mate-
mati£no natan£ni numeriki bi poltrak sekal trikotnik ABC. V kon£ni aritmetiki pa se lahko
zgodi, da je po izra£unanem prese£i²£u z ravnino trikotnika (poglavje 3.2) to pomaknjeno
malo v levo oziroma v desno. Zaradi tega algoritem v nekaterih primerih sploh ne najde
prese£i²£a z nobenim izmed obeh trikotnikov (ali pa z obema). Trikotnika obravnavamo
£isto lo£eno, £eprav imata skupen rob, zato lahko zaradi izgube informacij dobimo dva
razli£na rezultata. Robustni testi si morajo deliti £im ve£ izra£unov in odlo£itev, na kateri
4.4 TE�AVE Z NUMERI�NO STABILNOSTJO 26
Slika 4.8: Moºna napaka pri izra£unu prese£i²£a z trikotnikovo ravnino
strani skupnega roba leºi poltrak, mora biti skupna. Izbrati moramo samo enega izmed
dveh trikotnikov, ki imata skupen rob. To naredimo s pomo£jo izlo£itvenih izra£unov (4.6),
kjer je O izhodi²£e in−→D smerni vektor. Z izlo£itvenimi ra£uni problem ºe deloma re²imo
v prostoru. V primeru, da imajo vsi ti izra£uni enak predznak, nadaljujemo z izra£unom
prese£i²£a za ta trikotnik, druga£e za trikotnik ozna£imo, da ga je poltrak zgre²il.
i = (−→OA×
−−→OB) ∗
−→D (4.6)
j = (−−→OB ×
−→OC) ∗
−→D
k = (−→OC ×
−→PA) ∗
−→D
Robustnost smo s pomo£jo ε pove£ali tudi v vsakem izmed posameznih testov za iskanje
to£ke v trikotniku (poglavje 2). Iz testiranj smo ugotovili, da je najmanj zanesljiva metoda
vsote kotov. Treba je omeniti, da ti testi v£asih napak popolnoma ne odpravijo, ampak
jih samo ob£utno zmanj²ajo.
Poglavje 5
Rezultati in primerjave
Izmerili smo £ase CPE(s) za naivno metodo in na drevesih kd, ki smo jih zgradili z razli£-
nimi kriteriji. Vse meritve so bile opravljene na osebnem ra£unalniku s procesorjem Intel
i5, 3300 MHz in 4Gb RAM pomnilnika na operacijskem sistemu Windows 7. Vsi algoritmi
so implementirani s pomo£jo ogrodja Qt (jezik c++). Podrobnosti o uporabljenih modelih
se nahajajo v tabeli 5.1. Za vsako situacijo smo opravili tri meritve, rezultat je njihovo
povpre£je.
Tabela 5.1: Podatki o modelih
model: ²t. ogli²£ ²t. trikotnikov
grenades 5050 5584
pumpkin 5002 10000
cat 7335 14634
owl 19884 39764
barrel 31276 57728
bust 47516 95028
isis 93823 187642
tiger 309403 618786
grenadesHP 957507 1072128
5 REZULTATI IN PRIMERJAVE 28
Razpredelnica 5.2 prikazuje porabljen £as CPE(s) pri naivni metodi nad modelom
grenade. Uporabljeni so bili vsi testi iz poglavja 2, ki ugotavljajo, ali je to£ka v trikotniku.
Vidimo, da je metoda, ki uporablja baricentri£ne koordinate, najhitrej²a. Od metode
enakih predznakov je hitrej²a za pribliºno 155 %, od metode vsote kotov pa za ve£ kot
223 %. Posledi£no bomo v vseh testih uporabljali metodo baricentri£nih koordinat, saj se
je izkazala tudi za najbolj robustno.
Tabela 5.2: Porabljen £as CPE(s) za opravljanje testa vsebnosti v trikotniku
metoda/to£ke 1000 5000 10000 50000
vsota kotov 2.719 13.011 26.131 128.047
enaki predznaki 1.902 9.048 17.940 89.436
baricentri£ne koordinate 1.284 5.881 11.497 57.268
Razpredelnica 5.3 prikazuje £as CPE(s) izvajanja algoritma s pomo£jo dreves kd, ki so
bila zgrajena z razli£nimi kriteriji deljenja prostora. Vsebnost smo ugotavljali nad 500 000
to£kami, ki so bile naklju£no razporejene po sceni. Scena je bila od za£etnega omejujo£ega
kvadra modela ve£ja za 100 enot na stranico. Globina drevesa je bila nastavljena na 20,
deljenje na trenutni globini se je predhodno zaklju£ilo, £e so v celici bili manj kot ²tirje
trikotniki. Uporabili smo kriterije delitve prostora s prostorsko mediano (ozna£en kot
SM), deljenje prostora z ocenitveno hevristiko (ozna£ena kot OSAH) in okrnjena verzija
OSAH, ki vzame na delitveno os samo 100 potencialnih delitvenih kandidatov (ozna£en
kot PSAH). Za vsa testiranja so bili omogo£eni testi, ki pove£ajo robustnost.
Ugotovili smo, da ima ²tevilo trikotnikov na £as manj²i vpliv kot sama orientiranost
poltrakov in struktura modela. Uporaba hevristi£nega kriterija gradnje drevesa se je
izkazala za naju£inkovitej²o pri vseh testiranih modelih. OSAH je od PSAH hitrej²i za
pribliºno 107 %, kar pa je dober kompromis, saj gradnja drevesa s kriterijem OSAH traja
veliko dlje kot pri PSAH. Pri modelih grenade, barrels, grenadeHP je na £ase precej vpli-
vala razdeljenost modelov. Zaradi veliko praznega prostora na sceni omenjenih modelov je
posledi£no vpliv ocenitvene hevristike bolj opazen, saj hevristika posku²a izolirati najve£je
prazne celice.
5 REZULTATI IN PRIMERJAVE 29
Tabela 5.3: Porabljen £as CPE(s) za izvajanje vsebnostnega testa s pomo£jo dreves kd na
razli£nih modelih
model SM PSAH OSAH
grenade 1.794 0.960 0.715
pumpkin 0.944 0.710 0.708
barrels 1.793 0.609 0.607
owl 0.797 0.645 0.639
bust 0.535 0.503 0.490
isis 0.905 0.780 0.750
tiger 0.718 0.546 0.515
grenadeHP 3.230 2.152 2.028
Slika 5.1: Razlika v £asu glede na razli£ne kriterije gradnje drevesa. Najbolj vidna pri
razdeljenih modelih grenade, barrels in grenadeHP.
Gradnja drevesa s pomo£jo hevristike je £asovno zahtevna. �eprav smo naredili nekaj
optimizacij (opisano v sklopu podpoglavja 4.2.1), s pomo£jo katerih se drevo zgradi hitreje,
gradnja pri modelih z veliko trikotniki poteka po£asi. Tabela 5.4 prikazuje, kako ²tevilo
trikotnikov v celici vpliva na £as gradnje drevesa in kako se to pozna pri hitrosti vsebnost-
nega testa. �tevilo trikotnikov smo postopoma ve£ali. Minimalno ²tevilo trikotnikov v
5 REZULTATI IN PRIMERJAVE 30
Tabela 5.4: �as CPE(s) gradnje drevesa in vsebnostnega testa glede na ²tevilo trikotnikov
v celici
cmin tvs tdrevo
1 0.795 7.972
3 0.797 7.535
5 0.826 7.005
7 0.83 6.973
9 0.873 6.662
11 0.93 6.505
13 0.959 6.053
15 0.999 6.006
17 1.03 5.788
19 1.014 5.445
21 1.02 5.226
23 1.18 5.221
celici smo ozna£ili s cmin, £as vsebnostnega testa pri danem drevesu smo ozna£ili s tvs, £as
gradnje drevesa pa s tdrevo. Prikazan test smo opravili na modelu isis.
Slika 5.2: Vpliv ²tevila trikotnikov v celici na hitrost gradnje drevesa in vsebnostnega testa
5 REZULTATI IN PRIMERJAVE 31
Tabela 5.5 prikazuje primerjavo med naivno metodo in drevesi kd na razli£nih modelih.
V kon£ni £as CPE(s) je v²teta tudi gradnja samega drevesa kd. Za gradnjo drevesa po
metodi PSAH smo na os vzeli 30 delitvenih kandidatov. Iz tabele vidimo, da se naivno
metodo spla£a uporabiti nad majhnim ²tevilom testnih to£k, pri zelo majhnih modelih, v
nasprotnem primeru pa jo lahko ozna£imo za dale£ najslab²o. Za najbolj²o metodo se v
splo²nem izkaºe drevo kd, grajeno po metodi HS. �eprav imata PSAH in OSAH ponekod
izvajalne £ase zelo nizke, je njuna gradnja drevesa zahtevnej²a in posledi£no po£asnej²a. To
se vidi predvsem pri OSAH. Metodi sta primerni, ko si lahko privo²£imo dalj²e predhodno
deljenje prostora in je pomemben predvsem £as samega izvajanja testa.
Tabela 5.5: Porabljen £as CPE(s), za izvajanje vsebnostnega testa pri naivni metodi v
primerjavi z drevesi kd skupaj z njihovo gradnjo
model ²t. to£k naivna HS PSAH OSAH
grenade
100 0.078 0.156 0.53 0.312
1000 0.343 0.172 0.532 0.313
10000 2.808 0.187 0.556 0.327
100000 26.520 0.468 0.702 0.421
pumpkin
100 0.078 0.109 0.482 1.076
1000 0.593 0.109 0.483 1.077
10000 5.366 0.129 0.497 1.091
100000 49.515 0.249 0.593 1.169
barrel
100 0.297 0.093 0.827 11.554
1000 2.668 0.093 0.831 11.555
10000 25.958 0.125 0.851 11.558
100000 <100 0.499 0.954 11.684
Poglavje 6
Sklep
Algoritmi preverjanja vsebnosti predstavljajo pomembno temeljno operacijo v ra£unalni²ki
geometriji. V na²em diplomskem delu smo opisali, kako izvesti vsebnostni test to£k v pro-
storu. Predvsem smo se posvetili algoritmu s pripravo podatkov, kjer smo implementirali
razli£ne na£ine za gradnjo dreves kd in dobili zadovoljive rezultate. Dobro konstruirano
drevo kd je osnova za za vse aplikacije, ki za svoje delovanje potrebujejo u£inkovito razde-
ljen prostor. Treba se je pa zavedati, da je dobro drevo ponavadi £asovno bolj zahtevno,
zato je njegova uporaba odvisna od situacije.
Literatura
[1] B. �alik, Vsebnostni algoritmi, Algoritmi ra£unalni²ke geometrije, 2006, pp. 131-136
[2] K. Ooms, P. De Maeyer and T. Neutens, A 3D inclusion test on large dataset, Devel-
opments in 3D Geo-Information Sciences, 2010, pp. 181-186
[3] T. Möller, Ben Trumbore, Fast, Minimum Storage Ray/Triangle Intersection, Journal
of Graphics Tools, vol. 2, no. 1, 1997, pp. 21-28
[4] C. Ericson, Intersecting Ray or Segment Against Triangle, Real-Time Collision Detec-
tion, 2005, pp. 190-194
[5] V. Havran, BSP-Trees and Kd-Trees, Heuristic Ray Shooting Algorithms 2000, pp.
11-14
[6] E. Haines, Point in Polygon Strategies, Graphics Gems IV, ed. Paul Heckbert, Aca-
demic Press, 1994, pp. 24-46
[7] Y. Cao, Acceleration Structure for Ray Tracing, K-D Tree Traversal, 2010
[8] C. Ericson, Numerical Robustness, Lecture Notes on Numerical Robustness
[9] J. Bikker, Raytracing Topics and Techniques, 2004, http://www.flipcode.com/
archives/Raytracing_Topics_Techniques-Part_7_Kd-Trees_and_More_Speed.
shtml (18.7.2011)
[10] J. Scott, Point in triangle test, http://www.blackpawn.com/texts/pointinpoly/
default.html (18.7.2011)
LITERATURA 34
[11] Wikipedia contrubitors, Barycentric coordinate system (mathematics), http:
//en.wikipedia.org/wiki/Barycentric_coordinate_system_(mathematics)
(19.7.2011)
[12] Wikipedia contrubitors, Plane (geometry), http://en.wikipedia.org/wiki/Plane_
(geometry) (19.8.2011)
[13] VRML totally beginner's guide, http://gallery.djinngo.com/gallery/
documentation/widgets_development_vrml_beginner.html (20.7.2011)
[14] B. Wade, BSP TREE FREQUENTLY ASKED QUESTIONS, http://www.gamers.
org/dhs/helpdocs/bsp_faq.html (23.7.2011)
[15] C. Bartlett, Line to Triangle intersection test, http://www.angelfire.com/fl/
houseofbartlett/solutions/line2tri.html (22.8.2011)