1. POGLAVJE 4. PREBIRNI ALGORITEM CDT 46
Slika 4.1: Točke in robovi po urejanju v fazi inicializacije.
Zadnji korak inicializacije prebirnega algoritma za navadno DT v fazi
inicializacije ustvari še prvi trikotnik, s katerim zgradi začetno napredujočo fronto in
začetno spodnjo konveksno lupino. Glede na položaj prvih k točk (k ≥ 3) je možnih
več začetnih konfiguracij, ki so prikazane v prejšnjem poglavju (slika 3.14). Če si ob
vseh teh primerih poskušamo predstavljati še robove, je različnih situacij še veliko
več. Zato uvedemo rešitev, ki spretno zaobide inicializacijsko raznovrstnost tako, da
vpeljemo umetni začetni trikotnik, kot kaže slika 4.2. Ustvarimo dve umetni točki
p−1 in p−2 , ki ležita levo oz. desno od skrajne leve oz. skrajne desne točke iz množice
P , njuna koordinata y pa je manjša od najnižje točke p0 . Koordinate določimo po
naslednji formuli:
p−1 = (xmin − δx , ymin − δy )
p−2 = (xmax + δx , ymin − δy )
δx = 0.3(xmax − xmin )
δy = 0.3(ymax − ymin )
2. POGLAVJE 4. PREBIRNI ALGORITEM CDT 47
Slika 4.2: Tvorba velikega trikotnika.
Umetni trikotnik se tekom triangulacije ne spreminja, saj algoritem legalizacije,
ki ga uporabljamo za vzdrževanje Delaunayevega pravila v fazi prebiranja, v umetni
trikotnik ne poseže. Tudi vse trikotnike, ki jih tvorimo s pomočjo umetnih točk
p−1 in p−2 , v legalizaciji preskočimo. Z umetnim trikotnikom na enostaven in vselej
enak način tvorimo začetno napredujočo fronto F = {p−1 , p0 , p−2 }. Na ta način
smo potencialno obravnavno zaporedja kolinearnih točk prenesli v fazo prebiranja,
kjer niso deležne posebne pozornosti. Z vpeljavo začetnega umetnega trikotnika
pridobimo tudi pri prebiranju, saj se zmanjša število različnih obravnav točke.
Z uvedbo velikega začetnega trikotnika tudi nekoliko izgubimo, ker ne gradimo
spodnje konveksne lupine, vendar so rezultati pokazali, da je ta strošek zanemarljiv.
4.2 Prebiranje
Osrednji del algoritma predstavlja prebiranje oz. drsenje prebirne premice po ravnini
v smeri naraščanja koordinate y. Na svoji poti naleti na dve vrsti dogodkov:
• dogodek točke nastopi takrat, ko se premica dotakne točke pi (s točko pi
ustvarimo nov trikotnik in ga dodamo v triangulacijo);
• dogodek roba nastopi takrat, ko se premica dotakne točke pj , kjer pj
3. POGLAVJE 4. PREBIRNI ALGORITEM CDT 48
predstavlja končno točko roba pi pj (triangulacijo preuredimo tako, da rob pi pj
predstavlja stranico trikotnikov triangulacije).
Dogodka sta med seboj povezana. Vsak dogodek roba je hkrati dogodek točke,
obratna implikacija ne velja. Pravimo, da dogodek roba sledi dogodku točke, če
točka predstavlja končno točko oglišča roba, sicer gre le za navaden dogodek točke.
Izpis 3 prikazuje ogrodje prebiranja. Glavna zanka obravnava dogodke točk, kjer
v trenutno triangulacijo T vstavimo obiskano točko pi . Nato preverimo, če je točki
pi pripadajoč seznam robov Ei prazen. Če ni prazen, notranja zanka poskrbi, da
obravnavamo vsak rob e ∈ Ei . Ko v triangulacijo T vstavimo vse robove točke pi ,
izvedemo še hevristiki za glajenje napredujoče fronte.
Izpis 3 Ogrodje prebirnega algoritma za CDT
procedure Prebiranje(P)
for i := 1 to size(P ) do
pi = P [i];
T := VstaviTočko(pi , T );
if size(Ei ) > 0 then
for j := 1 to size(Ei ) do
e := Ei [j];
T := VstaviRob(e, T );
IzvediHevristiko1();
IzvediHevristiko2();
Preden nadaljujemo z natančnim opisom postopkov vstavljanja točk in robov, si
poglejmo lastnosti in implementacijo napredujoče fronte.
4. POGLAVJE 4. PREBIRNI ALGORITEM CDT 49
4.2.1 Napredujoča fronta in podatkovne strukture
Napredujoča fronta (krajše fronta) F predstavlja zgornjo mejo trenutne triangulacije
in s tem mesto dodajanja novih trikotnikov. Njena osnovna naloga je, da
vstavljajoči točki poišče najbližje ležeči rob, s katerim bomo zgradili nov trikotnik.
Geometrijska oblika fronte je lomljenka, sestavljena iz robov mejnih trikotnikov
(slika 4.3). Trikotniške robove, ki ležijo na napredujoči fronti, imenujemo rob fronte,
točkam pa pravimo točke fronte. Fronta omogoča dostop do mejnih trikotnikov,
ki jih potrebujemo pri vzdrževanju sosednostnih povezav vstavljenih trikotnikov s
trikotniki ob fronti.
Napredujoča fronta je enodimenzionalna podatkovna struktura, katere ključ
iskanja je koordinata x, ki se skriva znotraj točke pi (slika 4.3). Točke fronte
so urejene, kar je idealno za hitro iskanje. Vsaka točka fronte hrani dva osnovna
podatka, to sta oglišče fronte, ki predstavlja točko pi , in trikotnik ti , ležeč ob robu
fronte pi pi+1 . Tako imamo dovolj informacij, da lahko tvorimo nov trikotnik in ga
povežemo z ustreznim trikotnikom dane triangulacije. Puščice na sliki predstavljajo
kazalec na trikotnik, ležeč ob robu fronte (trikotnik ti na sliki). Ko v fronto vstavimo
novo točko p, najprej poiščemo rob fronte tako, da vstavljajoči točki poiščemo
najbližjo točko pc , s pomočjo katere najdemo rob fronte (to je lahko bodisi rob
pc−1 pc bodisi ec,c+1 . Z novim trikotnikom fronto osvežimo, zato moramo obvezno
osvežiti kazalce na trikotnike. Ker pri iskanju uporabimo le koordinato x točke p,
govorimo o projekciji točke p na fronto.
Žalik je fronto implementiral kot kombinacijo sekljalne tabele in dvojno
povezanega dinamičnega seznama, ki jo je poimenoval preprost seznam s
preskakovanjem (angl. simple skip-list). Takšno implementacijo smo izbrali tudi
mi. Alternativa je uporaba uravnoteženih dvojiških iskalnih dreves, kot sta drevo
AVL ali rdeče-črno drevo ali ena izmed izvedb seznamov s preskakovanjem. Njihovo
5. POGLAVJE 4. PREBIRNI ALGORITEM CDT 50
Slika 4.3: Napredujoča fronta in osnovni nivo podatkovne strukture.
uporabnost je pokazal Zadravec s sodelavci [87, 88].
4.2.2 Dogodek točke
Ob dogodku točke z iskanjem v podatkovni strukturi napredujoče fronte poiščemo
ustrezen rob fronte. Projekcija točke pi lahko pade na različne dele fronte, situacije
so naslednje [92]:
• Sredinski primer: projekcija točke pi pade na rob fronte;
• Levi primer: projekcija točke pi pade na točko fronte;
• Robni primer: gre za posebno situacijo sredinskega primera. Točka pi se nahaja
na robu fronte.
Sredinski primer (slika 4.4a) obravnavamo tako, da zgradimo nov trikotnik l,r,i
(slika 4.4b) in osvežimo fronto tako, da vsebuje vstavljeno točko pi . Osvežimo tudi
kazalec na trikotnik v točki pl . Da zadostimo Delaunayevemu pravilu, pokličemo
postopek legalizacije (slika 4.4c).
Levi primer (slika 4.5a) obravnava situacijo, kjer projekcija točke pi pade na
točko fronte. Ker vemo, da bo hevristika (opisana v nadaljevanju) zgradila dodaten
6. POGLAVJE 4. PREBIRNI ALGORITEM CDT 51
trikotnik, lahko to storimo že zdaj. Zgradimo dva nova trikotnika l−,l,i in l,r,i
(slika 4.5b). Točko pl bi sicer morali odstraniti iz fronte, a je hitreje, če točko pl le
zamenjamo s točko pi ter osvežimo kazalec na trikotnik v točki pl− . Za oba nova
trikotnika pokličemo legalizacijo.
Robni primer, kjer točka pi leži neposredno na robu fronte, razdelimo, točko pi pa
vstavimo v fronto.
Pri algoritmu klasične DT moramo obravnavati tudi situaciji, kjer projekcija
točke pi zgreši napredujočo fronto (pade levo oz. desno od F). Omenjeni situaciji
za razliko od zgoraj naštetih zahtevata večji poseg v podatkovne strukture, saj
vstavljanje točke spremeni tako napredujočo fronto kot tudi spodnjo konveksno
lupino. Zaradi vpeljave začetnega umetnega trikotnika se situacijama izognemo.
Umetni trikotnik namreč zagotavlja, da vsaka projekcija fronto vselej zadene.
Po končanem vstavljanju pokličemo hevristični funkciji za preprečevanje
nastajanja zarez in globeli. Postopek je enak kot v prebirnem algoritmu DT (glej
podpoglavje 3.2.1.3 in [92]).
4.2.3 Dogodek roba
Dogodek roba poskrbi, da v triangulacijo na zahtevano mesto vstavimo vse
omejujoče robove. Dogodek roba sledi dogodku točke pi , če seznam robov točke
Ei ni prazen. Točka pi je torej končna točka enega ali več omejujočih robov ex,i =
px pi , kjer px predstavlja začetno točko poljubnega roba iz Ei (takšen primer vidimo
na sliki 4.7). Če imamo opravka z vstavljanjem več robov hkrati, robove vstavimo
enega za drugim. Vstavljajoč rob bomo zaradi preglednosti označili z e, njegovo
začetno oglišče pa naj predstavlja točka pj (e =pj pi ). Zaradi različnih preverjanj
vpeljemo vektor − , ki je obrnjen v nasprotni smeri roba e in ga definiramo kot
→
ve
→ = pj − pi .
−
ve
7. POGLAVJE 4. PREBIRNI ALGORITEM CDT 52
Slika 4.4: Sredinski primer: projekcija točke pade na rob fonte (a), tvorba trikotnika
(b) in legalizacija (c).
Načine vstavljanja robov v triangulacijo smo že opisali. Odločili smo se
za implementacijo postopka vstavljanja robov z brisanjem. Ideja vstavljanja je
preprosta - v triangulaciji odstranimo vse Delaunayeve robove (in trikotnike), ki jih
rob e preseka, nato pa območje ob e ponovno trianguliramo, pri tem pa upoštevamo
Delaunayevo pravilo. Rob e označimo kot stalen in postane del končne CDT .
Če se spomnimo dvokoračnih postopkov za CDT, vidimo, da potrebujemo iskalno
podatkovno strukturo že zaradi dostopa do oglišč roba e. Prednost našega pristopa
je sprotnost vstavljanja, kar s pridom izkoristimo. Ko v triangulacijo vstavimo točko
pi , ki ji sledi dogodek roba e, končnega oglišča roba sploh ni potrebno iskati.
Vstavljanje robov sicer krši osnovno načelo prebirnih algoritmov, ki pravi, da
je del preiskane množice podatkov že del končne rešitve, saj bomo ustvarjeno
triangulacijo prerešetali, a nič zato. Že osnovni Žalikov pristop je izjema. Za vsakim
novo tvorjenim trikotnikom sledi legalizacija, značilna za inkrementalne metode, ki
8. POGLAVJE 4. PREBIRNI ALGORITEM CDT 53
Slika 4.5: Levi primer: projekcija točke zadene točko fronte (a) in tvori dva trikotnika
(b).
Slika 4.6: Robni primer: projekcija točke zadene rob fronte (a) in razdeli priležni
trikotnik (b).
preoblikuje skupino obstoječih trikotnikov za prebirno premico. Temu se ne moremo
izogniti. Velja pa, da se spremembe izvajajo le v neposredni bližini napredujoče
fronte. Robovi lahko posežeje veliko dlje.
Vstavljanje roba e poteka v naslednjem zaporedju:
1. Poiščemo prvi trikotnik, ki ga rob e seka.
2. S korakanjem po triangulaciji zbrišemo vse trikotnike, ki jih rob seka, in
dobimo regijo Re = Qe,L + Qe,R .
3. Regijo Re trianguliramo.
4. Rob e označimo kot stalen.
9. POGLAVJE 4. PREBIRNI ALGORITEM CDT 54
Slika 4.7: Po točki pi vstavimo vse njene robove.
4.2.3.1 Iskanje prvega trikotnika
Za začetek sprehoda po presekanih trikotnikih potrebujemo trikotnik, v katerem se
sprehod prične. To je zagotovo eden izmed trikotnikov, ki vsebujejo točko pi . Vseh
možnih trikotnikov je enako stopnji oglišča pi . Ker se točka pi nahaja na fronti in
ne v notranjosti triangulacije, je stopnja točke v povprečju za polovico manjša, zato
pri vstavljanju roba v triangulacijo preverimo zelo malo trikotnikov.
Iskanje želenega trikotnika je preprosto. Postavimo se v trikotnik ob robu fronte,
ki vsebuje pi . Če upoštevamo smer roba e, izberemo tisti segment ob pi , kjer smo
bližje robu e. Smer roba dobimo s primerjavo začetne in končne točke roba e. Če
rob e označimo z e = pj pi , pogledamo razliko v koordinati x točk pi in pj . Če je
xi − xj ≥ 0, izberemo segment fronte levo od pi in iščemo v nasprotni smeri urinega
kazalca. Če je xi − xj < 0, iskanje pričnemo v trikotniku ob segmentu fronte desno
od pi v smeri urinega kazalca.
Ob sprehodu skozi trikotnike s preverjanjem vektorskega produkta takšen
trikotnik najdemo v kratkem času. Primer vidimo na sliki 4.8, kjer vstavljamo
rob s končno točko p2 . Iskati pričnemo v trikotniku t1 , ki leži ob segmentu desno
od p2 in se sprehodimo v smeri urinega kazalca do trikotnika t3 . Vektorski produkt
→ × − spremeni predznak, zato se ustavimo. Rezultat iskanja je trikotnik t2 , v
−
v1 → ve
katerem bomo pričeli korakati po triangulaciji.
10. POGLAVJE 4. PREBIRNI ALGORITEM CDT 55
t
Slika 4.8: Iskanje prvega trikotnika.
4.2.3.2 Brisanje sekanih trikotnikov
Ko imamo začetni trikotnik za sprehajanje, se pričnemo premikati. Uporabimo
postopek ravnega sprehoda [6, 25] po triangulaciji od končnega do začetnega oglišča
roba e. Osnovna ideja je pomikanje po trikotnikih s sledenjem njihovih sosednostnih
povezav tako, da se pomikamo le po trikotnikih, ki jih rob e preseka. Pri tem si
pomagamo z vektorskim produktom, ki nam pove, na kateri strani roba se nahajamo
in v kateri trikotnik se bomo pomaknili. Dvokoračni algoritmi se srečujejo le z enim
tipom ravnega sprehoda, to je sprehod, ki poteka izključno po trikotnikih, saj vsak
vstavljajoč rob e leži znotraj triangulacije. Izpis 4 prikazuje psevdokod takšnega
sprehoda, čigar rezultat je prazna regija ob robu Re , sestavljena iz Qe,L in Qe,R , ki
ju bomo kasneje triangulirali.
Psevdokod prikazuje postopek brisanja robov oz. trikotnikov, kadar rob e v
celoti leži znotraj triangulacije T . Primer postopka vidimo na sliki 4.9a. Regiji
Qe,L in Qe,R inicializiramo s točko pi (Qe,L = Qe,R = {pi }). Sprehod pričnemo
v začetnem trikotniku t ob točki p = pi . V vsakem koraku trikotniku t najprej
poiščemo sosednji trikotnik glede na presekan Delaunayev rob pl pr in ga označimo s
tn . Nato v trikotniku tn poiščemo nasprotno točko robu pl pr (točka pn ) in preverimo,
na kateri strani vektorja − se točka pn nahaja. Če pn leži na levi strani, v regijo
→
ve
Qe,L shranimo točko pl , ki predstavlja sosednje oglišče v trikotniku tn v nasprotni
smeri urinega kazalca. Če se pn nahaja na desni strani roba pi pz , v regijo Qe,R
11. POGLAVJE 4. PREBIRNI ALGORITEM CDT 56
Izpis 4 Procedura brisanja sekanih trikotnikov ob vstavitvi roba e =pi pj
procedure BrisiCDT(pi , pj , ve , t, T )
p := pi ;
Qe,L := {p};
Qe,R := {p};
while not JeOgliščeTrikotnika(pj , t) do
tn := NasprotniTrikotnik(p, t);
pn := NasprotnoOglišče(tn , t);
if LevoOd(pn , ve ) then
pl := OgliščeCCW(pn , tn T );
Qe,L := Qe,L + pl ;
p := pl ;
else
pr := OgliščeCW(pn , tn , T );
Qe,R := Qe,R + pr ;
p := pr ;
Odstrani(t, T );
t := tn ;
Qe,L := Qe,L + pj ;
Qe,R := Qe,R + pj ;
end
12. POGLAVJE 4. PREBIRNI ALGORITEM CDT 57
dodamo točko pr , ki jo v trikotniku tn najdemo, če se premaknemo v smeri urinega
kazalca. Celoten korak ponovimo za vse trikotnike tn . Sprehod zaključimo, ko
trikotnik tn vsebuje točko pj (pj dodamo v obe regiji). Rezultat sprehoda sta regiji
Qe,L = {pi , p0 , p1 , p5 , p6 , pj } in Qe,R = {pi , p2 , p3 , p4 , p7 , p8 , pj } (slika 4.9b), končni
rezultat vstavljanja vidimo na sliki 4.9c.
Slika 4.9: Sprehod po trikotnikih ob vstavljanju roba (a) v prvem koraku vrne regiji
Qe,L in Qe,R (b) in rezultat trianguliranja (c).
Poseben primer roba se pojavi takrat, kadar je rob e navpičen oz. vodoraven.
Takrat položaje točk glede na pi pz preverjamo le s primerjavo koordinate x oz. y.
Ker robove vstavljamo sproti, so pogosti primeri, da rob e leži nad napredujočo
fronto in ne seka nobenega trikotnika (slika 4.10a). Sprehod od pi do pj poteka po
napredujoči fronti, rezultat pa je le regija Re (slika 4.10b).
Najzahtevnejši primer vstavljanja nastopi, kadar se rob e ponekod nahaja nad
napredujočo fronto, ponekod pa seka trikotnike triangulacije (slika 4.11a). Takrat
uporabimo kombinacijo sprehoda po trikotnikih in preprostega sprehajanja po
točkah fronte (način sprehoda se spremeni v točkah s0 in s1 ). Tudi tukaj sta rezultat
13. POGLAVJE 4. PREBIRNI ALGORITEM CDT 58
brisanja regiji Qe,L in Qe,R (slika 4.11b), ki ju trianguliramo (slika 4.11c).
Najugodneje je, da je rob e že del triangulacije. Takšne situacije odkrijemo že v
koraku iskanja začetnega trikotnika.
Slika 4.10: Sprehod po točkah fronte (a) in triangulacija regije Re (b).
Slika 4.11: Mešani sprehod po točkah fronte (a), rezultirajoči regiji Qe,L in Qe,R (b)
in triangulacija (c).
4.2.3.3 Triangulacija praznega območja
Prazno območje ob robu je potrebno triangulirati tako, da rob e zasede pravo mesto
v triangulaciji. Razdelitev regije Re na dve podregiji se izkaže kot zelo primerna,
saj ob triangulaciji regije Re ne smemo zgraditi roba, ki bi vseboval eno oglišče
v Qe,L in drugo v Qe,R . Zato vsako regijo trianguliramo posebej, lepa lastnost
pristopa pa je ta, da rob e predstavlja stičišče regij. Za trianguliranje regije lahko
14. POGLAVJE 4. PREBIRNI ALGORITEM CDT 59
uporabimo poljuben algoritem za Delaunayevo triangulacijo mnogokotnika [59],
vendar se izkaže, da je pristop, ki ga bomo opisali, zelo praktičen.
Regijo Qe bomo triangulirali s preprostim rekurzivnim algoritmom [6]. Vhod v
algoritem je regija Qe = {pi , p0 , p1 , p2 , .., pr−1 , pj }, kjer je r število notranjih oglišč
Qe , pi in pj pa predstavljata oglišči vstavljajočega roba e. Izvajanje algoritma nakaže
slika 4.12:
• V Qe poiščemo točko pk , za katero velja, da očrtani krog trikotniku i,j,k ne
vsebuje nobene druge točke iz Qe .
• Tvorimo trikotnik i,j,k , regijo Qe pa razdelimo v Qf = {pi , p0 , .., pk } in Qg =
{pk , .., pr−1 , pj }, pri čemer sta f = pi pk in g = pk pj .
• Postopek rekurzivno ponovimo za obe novi regiji Qf in Qg .
Slika 4.12: Triangulacija regije Qe .
Pri preverjanju praznega kroga upoštevamo le točke znotraj trenutne regije Q,
zato se izognemo preverjanju vidnosti. Tako preverjamo le osnovno Delaunayevo
pravilo. Z vsako delitvijo regije se zmanjša število iskanja ustrezne točke pk , z
rekurzijo pa končamo, ko regija vsebuje le tri točke. Med izvajanjem algoritma
skrbimo, da so trikotniki med seboj povezani.
15. POGLAVJE 4. PREBIRNI ALGORITEM CDT 60
Z vstavljanjem roba zaključimo, ko smo uspešno triangulirali obe regiji ob robu
e. Ostane le še povezava med trikotnikoma regij Qe,L in Qe,R , ki ležita neposredno
ob robu e. Rob e v obeh trikotnikih označimo kot stalen.
4.3 Finalizacija
V fazi finalizacije poskrbimo, da je rezultat CDT (G), kjer so vstavljeni vsi omejujoči
robovi Ec in izključno točke začetne množice točk P . V fazi inicializacije smo
ustvarili začetni umetni trikotnik, posledično pa so nastali tudi drugi trikotniki,
ki vsebujejo dodatni točki p−1 oz. p−2 . Iz dobljene CDT moramo sedaj odstraniti
obe dodatni točki p−1 in p−2 , s tem pa tudi izbrisati vse trikotnike, ki vsebujejo ti
točki kot svoja oglišča.
Definicija triangulacije zahteva takšno delitev ravnine, ki je omejena s konveksno
lupino KL(P ). Žalik v svojem algoritmu navadne Delaunayeve triangulacije zgradi
zgornjo konveksno lupino s sprehodom po točkah napredujoče fronte, medtem ko
spodnjo konveksno lupino gradi sproti. Zgornjo konveksno lupino zgradimo na
enak način, kjer za sosednji rob fronte preverimo predznak vektorskega produkta
za detekcijo konveksnega kota. Napredujočo fronto prehodimo od točke pL+ do pR−
(slika 4.13a) in v primeru konkavnega kota vstavimo nov trikotnik. Tvorba zgornje
konveksne lupine sproti zbriše napredujočo fronto F.
Spodnjo konveksno lupino zgradimo na enak način. Sprehodimo se po meji
triangulacije s pomočjo sosednostnih povezav mejnih trikotnikov od pL+ do pR− in s
preverjanjem vektorskega produkta dodamo manjkajoče trikotnike. Končni rezultat
triangulacije vidimo na sliki 4.13b.
16. POGLAVJE 4. PREBIRNI ALGORITEM CDT 61
Slika 4.13: Finalizacija zbriše odvečne trikotnike (a) in zgradi konveksno lupino (b).
4.4 Časovna analiza
Analizirali bomo hitrost izvajanja algoritma, kjer bomo določili pričakovano časovno
zahtevnost. Vhod v algoritem predstavlja n točk in m robov.
Faza inicializacije zahteva ureditev točk z algoritmom QuickSort (O(n log n)).
Dodatno moramo poskrbeti za ohranitev pravilnega zapisa robov zaradi urejanja
točk (O(m)). Časovna zahtevnost tega koraka je T1 = O(n log n) + O(m) =
O(n log n), saj je m ≤ n.
Časovno zahtevnost vstavljanja točk smo povzeli po [92], saj smo osnovo
postopka ohranili. V fazi prebiranja je potrebno vsako točko vstaviti v iskalno
strukturo, ki je implementirana kot sekljalna tabela. Vstavljanje je izvedeno v
konstantnem času. Predpostavimo, da je vseh vnosov nvnosov (nvnosov > 0) in da
je v nekem trenutku izvajanja v napredujoči fronti l točk. Da najdemo ustrezen
rob fronte, potrebujemo v povprečju l/nvnosov preverjanj. Tvorba trikotnika in
preverjanje hevristik se izvedeta v konstantnem, legalizacija pa v logaritemskem
l
času [60]. Časovna zahtevnost drugega dela algoritma je torej T2a = O(n nvnosov
+
n log n). Ker je običajno l n in nvnosov 1, pomeni, da je l/nvnosov n,
zato je ta strošek zanemarljiv. Tako dobimo časovno zahtevnost vstavljanja točk
17. POGLAVJE 4. PREBIRNI ALGORITEM CDT 62
T2a = O(n log n). Dostop do roba je takojšen, zanj pa moramo poiskati trikotnik
za začetek korakanja (O(1)). Sledi korakanje po trikotnikih, pri čemer sta izbira
naslednjega trikotnika in brisanje opravljena prav tako v konstantnem času O(1). Če
je k število sekanih trikotnikov, je časovna zahtevnost korakanja O(k). V najslabšem
primeru dobimo dve regiji, ki vsebujeta skupaj približno k točk. Časovna zahtevnost
2
triangulacije regij je 2 O( k4 ). Ker je k n, lahko za triangulacijo podamo oceno
O(n). Vstavljanje m robov torej opravimo v času T2b = m O(n) = O(n2 ), če je
m ≈ n. Časovna zahtevnost prebiranja je torej T2 = T2a +T2b = O(n log n)+O(n2 ) =
O(n2 ).
Finalizacijo izvedemo v linearnem času T3 = O(n). Najslabša časovna zahtevnost
algoritma je:
T = T1 + T2 + T3 = O(n log n) + O(n2 ) + O(n) = O(n2 ),
pričakovana pa T = O(n log n).
4.5 Rezultati
Pri delovanju algoritmov običajno analiziramo časovno in prostorsko zahtevnost.
Časovna zahtevnost zavisi od značilnosti podatkov (število točk, število robov in
njihove porazdelitve). Ponavadi napravimo analizo najslabših in pričakovanih časov
izvajanja, v praksi pa uporabnike bolj zanimajo dejanski časi izvajanja na praktičnih
primerih. Zavedati se moramo, da so rezultati meritev odvisni od faktorjev, kot so
programski jezik, izkušnje ali stil programiranja posameznika, ki je določen algoritem
implementiral, pa od operacijskega sistema ali računalnika, na katerem smo meritve
izvajali. Kljub temu takšni eksperimenti podajo dragoceno informacijo o tem, kako
učinkovit je algoritem, ko ga primerjamo z drugimi.
Naš algoritem (označimo ga s SL) smo primerjali s tremi znanimi algoritmi, ki
jih je implementiral Shewchuk v svojem paketu Triangle [77, 78]. Njegove algoritme
18. POGLAVJE 4. PREBIRNI ALGORITEM CDT 63
zaradi stabilnosti in robustnosti implementacije avtorji triangulacijskih algoritmov
pogosto uporabljajo kot referenčne implementacije. V paketu Triangle smo izbrali
tri različne algoritme omejene Delaunayeve triangulacije:
• algoritem Deli in vladaj avtorjev Leeja in Schachterja [61] (označimo z LS-
D&C),
• prebirni algoritem, ki ga je razvil Fortune [42] (označimo z F-SL) in
• naključni inkrementalni algoritem s korakanjem, ki ga je razvil Mücke [69]
(označimo z M-INC).
Meritve smo opravili na osebnem računalniku s procesorjem Intel Pentium M
2.9 GHz z 1 GB delovnega pomnilnika, algoritme smo poganjali pod operacijskim
sistemom Windows XP. Vsi algoritmi so implementirani v jeziku C ali C++ in
prevedeni s prevajalnikom VisualC.
Slika 4.15 prikazuje primer triangulacije podatkov iz katastra, slika 4.16 pa
predstavlja triangulacijo višinskih črt. Oba primera smo triangulirali z vsemi štirimi
algoritmi. Rezultate smo predstavili v tabeli 4.1, hitrost delovanja pa smo uprizorili
z grafom (slika 4.14). Izvajalne čase smo pričeli meriti na manjših vhodnih množicah,
kjer se je pokazalo, da algoritmi za triangulacijo potrebujejo skoraj enak čas. Ko smo
povečevali število točk in robov (dejansko smo uporabili druge vhodne podatke), se je
izkazalo, da je naš algoritem v večini primerov vsaj podobno hiter ali celo hitrejši od
LS-D&C. M-INC je pri množicah nad 5 mio točk in robov odpovedal, v splošnem se
je izkazal za najpočasnejšega. Nekoliko hitrejši pri našem testiranju je bil algoritem
F-SL, a tudi ta je za dane primere potreboval več časa. Najbolje se je odrezal
algoritem LS-D&C, ki se je v vseh testnih primerih dobro obnesel. Ponekod je bil
malenkost hitrejši, kjer je bil pa počasnejši, je bil naš algoritem tudi do dvakrat
hitrejši.
Tabela 4.2 prikazuje izvajalne čase posameznih delov algoritma. Razvidno je,
19. POGLAVJE 4. PREBIRNI ALGORITEM CDT 64
Tabela 4.1: Primerjava izvajalnih časov z obstoječimi algoritmi.
čas CPE [s]
št. točk št. robov M-INC F-SL LS-D&C SL
23262 28155 0.1624 0.1030 0.0690 0.0658
93048 112620 0.7996 0.4656 0.3376 0.3227
162244 162312 1.2844 0.7848 0.5124 0.5313
372192 450480 4.5940 2.0312 1.6185 1.2397
1297360 1296020 21.1436 8.7032 4.3500 4.8907
1488768 1801920 26.5833 9.6303 7.7188 4.7813
2444700 2933200 56.5155 29.2453 22.8850 8.7660
5189440 5184080 / 64.9476 19.9814 20.4637
5955072 7207680 / 119.7030 45.0468 23.4323
da faza inicializacije porabi več kot polovico izvajalnega časa v primerjavi s fazo
prebiranja, medtem ko je finalizacija zanemarljivo majhen strošek.
Tabela 4.2: Izvajalni časi posameznih delov algoritma SL.
št. točk št. robov inicializacija prebiranje finalizacija
93048 112620 0.1093 0.2033 0.0000
1488768 1801920 1.6406 3.1976 0.0000
2444700 2933200 3.7343 5.8853 0.0053
Slika 4.14: Graf odvisnosti hitrosti izvajanja od števila omejitev.
20. POGLAVJE 4. PREBIRNI ALGORITEM CDT 65
Slika 4.15: Primer vhoda pri katastrskih podatkih (a) in rezultat triangulacije (b).
21. POGLAVJE 4. PREBIRNI ALGORITEM CDT 66
Slika 4.16: Primer vhoda pri triangulaciji površja (a) in rezultat triangulacije (b).
22. Poglavje 5
Rekonstrukcija površja iz oblaka točk
Poglavje predstavlja uvod v drugi del naše disertacije. Ker se je pristop s
prebiranjem izkazal za uspešnega v primeru ravninske triangulacije, bi lahko
podobno poskusili tudi pri tvorbi triangulacije v 3D. Pravo posplošitev sicer
predstavlja tetraedrizacija [43], vendar je v praksi veliko bolj zanimiv problem tvorbe
trikotniškega površja iz oblaka točk, imenovan rekonstrukcija površja. Zato bomo
najprej opisali najpopularnejše rešitve za rekonstrukcijo površja in nato prešli na
opis lastnega postopka, temelječega na paradigmi prebirne ravnine.
5.1 Uvod
Problem rekonstrukcije je zelo pogosta tema v računalniški geometriji in njenih
aplikacijah, kar je vsekakor posledica razvoja prebirnih naprav ali prebirnikov
(angl. scanners). Cilj rekonstrukcije je ustvariti računalniški model površja iz
točk v prostoru, pridobljenih z različnimi postopki prebiranja (laser, bela svetloba,
mehansko prebiranje) [16]. Ker nas zanima izključno tvorba površja, se s prebirniki
in tehnikami pridobivanja točk ne bomo ukvarjali.
Rekonstrukcija površja se prične z oblakom točk (angl. point cloud). Oblak
točk je množica točk P v prostoru, ki predstavlja vzorce originalnega površja S,
67
23. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 68
dobljene s prebiranjem. Zato velikokrat namesto o točkah govorimo o vzorcih, vzorec
pa opišemo s trojico koordinat p(x, y, z). Oblak točk je podmnožica množice točk
površja (P ⊂ S). Včasih poleg koordinat razpolagamo še z normalami točk, odvodi
in sosednostmi. Nas zanimajo izklučno oblaki točk brez dodatnih informacij. Naloga
razvijalca postopka rekonstrukcije je, da s povezovanjem točk P zgradi računalniški
model površja S (slika 5.1). Ta bo le približek S, saj imamo končen nabor
vzorcev. Površje bomo predstavili s trikotniško mrežo, ki je danes najpopularnejša
predstavitev površja na področju rekonstrukcije.
Pri oblakih točk se lahko pojavi šum, ki je rezultat nenatančnosti prebiranja.
Točke šuma so tiste, ki ne ležijo na originalnem površju S in kot take povzročajo
anomalije v rekonstruiranem površju S . Drug nezaželjen pojav pri oblakih točk so
točke, ki so bile zajete po pomoti. To so osamele točke, ki ležijo daleč od površja
(angl. outliers) in motijo postopek rekonstrukcije. Med napake zajemanja vzorcev
sodijo tudi luknje. Te lahko predstavljajo območja na površju, ki jih prebirnik ni
uspel zajeti, ali pa gre za dejanske luknje, ki so lastnost oblike.
Površje lahko tvorimo na dva načina. Če površje poteka skozi vse točke
P , pravimo, da gradimo interpolacijsko površje. Tak način gradnje površja je
občutljivejši na šum. Drug način aproksimira površje S. Za aproksimacijsko površje
je značilno, da ne poteka nujno skozi točke iz P , ampak leži blizu njih. Zaradi tega
se na predelih, kjer je prisoten šum, le-ta zaradi povprečenja porazgubi. Rezultat je
sicer manj natančen, vendar pa je aproksimacijsko površje odpornejše na šum.
Glede na obliko lahko tvorimo vodotesna površja (angl. watertight) ali površja
z mejo (angl. boundary). Pri vodotesnih površjih za vsak rob velja, da pripada
natanko dvema trikotnikoma. Nasprotno, površja z mejo dovoljujejo robove, ki
pripadajo natanko enemu trikotniku. Takšni robovi predstavljajo mejo površja.
Primer površja z mejo je polovica krogle brez osnovne ploskve (slika 5.2a). Če
24. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 69
dodamo osnovno ploskev, dobimo vodotesno površje (slika 5.2b).
Slika 5.1: Proces izgradnje površja od zajemanja vzorcev do rezultata programske
rekonstrukcije.
5.1.1 Vzorčenje
Zelo pomemben faktor pri rekonstrukciji je vzorčenje, saj bo rekonstruirano površje
iz oblaka točk le približek originalnega površja. Nemogoče je npr. rekonstruirati
ostre robove. Spomnimo se Nyquistovega teorema, ki pravi, da mora biti najnižja
frekvenca vzorčenja (imenovana Nyquistova frekvenca) fny = 2fmax , kjer je fmax
maksimalna frekvenca v frekvenčnem spektru funkcije s končno amplitudo, vsaj
dvakratnik le-te. Za točno rekonstrukcijo potrebujemo neskončno gosto vzorčenje,
kar pa ni izvedljivo. Rezultat rekonstrukcije močno zavisi od gostote vzorčenja.
Obstajata dva kriterija, ki povesta, kako je površje vzorčeno. Prvi kriterij temelji
na velikosti lokalne značilnosti (angl. local feature size ali LFS), drugi pa na
takoimenovani vzorčni poti (angl. sampling path).
25. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 70
(a) (b)
Slika 5.2: Primer površja z mejo (a) in vodotesnega površja (b).
Kriterij vzorčne poti je določen s parametrom ε, ki predstavlja polmer krogle. Za
površje S pravimo, da je zajeto z vzorčno potjo ε, če katera koli krogla s polmerom
ε s centrom v vzorcu iz P vsebuje vsaj eno vzorčno točko. Primer vzorčne poti
ε vidimo na sliki 5.3. Če vzorčimo po kriteriju vzorčne poti, kot rezultat dobimo
enakomerno porazdelitev vzorcev. Ti so pri rekonstrukciji zelo zaželjeni, vendar niso
nujno optimalni za končno predstavitev objekta, saj v primeru monotonih predelov
dobimo preveč vzorcev. Naravno se zdi, da je vzorcev več v bolj razgibanih predelih
površja in manj tam, kjer je ukrivljenost površja majhna.
Temu ustreza drugi kriterij. Velikost lokalne značilnosti LF S(p) točke p ∈ P je
funkcija, ki vsaki točki p priredi realno vrednost, ki predstavlja najbližjo razdaljo
do srednje osi (angl. medial axis) [3]. Srednja os nad množico P je definirana kot
zaprtje vseh točk v R3 , ki imajo več kot eno najbližjo točko na S, tako da se krogi,
ležeči na srednji osi, vsaj dvakrat dotikajo površja S. Ker nimamo površja ampak
le oblak točk, srednje osi ni mogoče zgraditi in tako izračunati pravilne LF S. Tako
algoritmi uporabljajo aproksimacijo srednje osi [4, 17].
26. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 71
Slika 5.3: Vzorčenje po kriteriju vzorčne poti (a) in rekonstruiran objekt s slabo
rekonstruiranim robom (b).
5.2 Sorodne raziskave
Do danes je bilo na področju rekonstrukcije razvitih že veliko algoritmov. Glede na
način gradnje površja jih delimo v naslednje skupine [66]:
• algoritmi z delitvijo prostora (angl. spatial subdivision),
• algoritmi rekonstrukcije s funkcijo razdalje (angl. distance function),
• algoritmi z ukrivljanjem površja (angl. warping),
• inkrementalni algoritmi (angl. incremental algorithms).
5.2.1 Algoritmi z delitvijo prostora
Postopkom, ki jih združujemo v množico algoritmov s prostorsko delitvijo, je skupno,
da vhodnim podatkom podajo oklepajočo škatlo (angl. bounding box), ki jo razdelijo
v manjše celice. Načinov delitve prostora je več in so odvisne od pristopa, s katerim
gradimo površje. Najpogostejše delitve prostora so regularne mreže, osmiška drevesa
ali neregularne tetraedske mreže. Cilj deljenja je najti celice, ki vsebujejo vzorce iz
27. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 72
(p)
S
LF
Slika 5.4: Kriterij LFS in srednja os (modra barva)(a) ter rekonstruirano površje
(b).
P . Izbira celic je lahko usmerjena ploskovno (angl. surface-oriented) ali prostorsko
(angl. volume-oriented).
5.2.1.1 Ploskovno usmerjena izbira celic
Ta pristop se sestoji iz naslednjih osnovnih korakov:
• razdelitev prostora v celice,
• iskanje celic, skozi katere površje poteka, in
• izračun površja v izbranih celicah.
Postopek, ki so ga razvili Algorri s sodelavci [2], oklepajočo škatlo razdeli v
enakomerno vokselsko mrežo. V drugem koraku obdržimo le voksle, ki vsebujejo
vsaj 1 vzorčno točko. V tretjem koraku z zunanjimi pravokotniki izbranih vokslov
sestavimo prvi približek površja. Da bi dobili zadovoljivejšo predstavitev površja,
površje pretvorimo v trikotniško mrežo s povezovanjem normal v štirikotnikih. Ker je
trenutno zgrajeno površje kockasto, s pomočjo filtriranja z nizkim sitom izračunamo
28. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 73
nove položaje oglišč trikotnikov, ki jih dobimo z izračunom uteženega povprečja
starega položaja točke in njenih sosednjih točk. Aproksimacijo površja izboljšamo
z ukrivljanjem proti položaju vzorčnih točk.
Postopek Hoppeja s sodelavci [50] temelji na funkciji razdalje, ki za vsako točko
površja zaprtega objekta pove najmanjšo predznačeno razdaljo do površja. Točke
na površju imajo oddaljenost 0, medtem ko je oddaljenost točk znotraj objekta
negativna in oddaljenost točk zunaj objekta pozitivna. V prvem koraku algoritma
zgradimo regularno vokselsko mrežo. Vokselske celice, ki jih izberemo v drugem
koraku, so tiste celice, ki vsebujejo nasprotno predznačene točke. To so točke,
skozi katere poteka površje. V tretjem koraku zgradimo površje z algoritmom
sprehajajočih kock (angl. marching cubes) [63], ki pri svojem delovanju uporablja
šablone za gradnjo krp površja s pomočjo predznakov točk v vokselski celici. Na
koncu izbrane vokselske celice zamenjamo s krpami, ki jih povežemo v končno
površje.
Postopek, ki sta ga predstavila Bajaj in Bernardini [12], se od predhodnih
postopkov razlikuje v tem, da je prostorska delitev neregularna in prilagodljiva.
Tudi ta metoda uporablja funkcijo razdalje. Prvotno aproksimacijo površja
zgradimo v fazi predprocesiranja s pomočjo alfa-teles (angl. alpha-solids), vsaki
točki pa izračunamo oddaljenost do tega površja. Ko so znane oddaljenosti
za vsako točko, inkrementalno razdelimo prostor v tetraedre, kjer začnemo s
tetraedrom, ki oklepa celotno množico vzorcev. Nato z opazovanjem predznakov
funkcije razdalje v posameznih točkah poiščemo vse tetraedre, skozi katere poteka
površje, in zgradimo aproksimacijo površja. Ker površje ni točno, v vsaki
točki izračunamo aproksimacijsko napako. Velike napake zahtevajo izboljšavo
tetraedrizacije, zato v takšne tetraedre vstavimo njihova središča in jih razdelimo.
Postopek inkrementalnega dodajanja središč ustavimo, ko je aproksimacijska napaka
zadovoljivo majhna. Tetraedrizacija je Delaunayeva, kar zagotavlja uravnoteženost
29. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 74
tetraedrov.
Edelsbrunner in Mücke [34] sta predstavila algoritem alfa-oblik (angl. alpha-
shapes). Prostor v prvem koraku razdelimo v Delaunayeve tetraedre, kjer so vzorčne
točke del Delaunayeve tetraedrizacije. V drugem koraku odstranjujemo tetraedre,
trikotnike in robove z uporabo tako imenovanih α-krogel, ki nastopajo kot orodje
za brisanje. Vsak rob, trikotnik ali tetraeder je izbrisan, če je njegova minimalna
oklepajoča krogla manjša od α-krogle. Tako dobimo alfa-obliko, ki jo sestavlja
množica preostalih robov, ploskev in tetraedrov. V tretjem koraku algoritma iz
alfa-oblike izluščimo trikotnike, ki pripadajo površju z upoštevanjem pravila praznih
krogel. Trikotniku očrtamo dve krogli s polmerom α in če vsaj ena izmed njiju ne
vsebuje nobene druge točke, je trikotnik sprejet kot del površja. Največja težava
algoritma je primerna izbira polmera α. Premajhen α vodi do nepovezanega površja,
prevelik pa izpusti detajle.
5.2.1.2 Prostorsko usmerjena izbira celic
Prostorski pristop sestavljajo naslednji koraki:
• razdelitev prostora v celice,
• odstranitev celic, ki ne vsebujejo vzorcev površja, in
• izračun površja iz izbranih celic.
Boissonatov volumetričen pristop [21] začne z Delaunayevo tetraedrizacjo.
Tetraedri z dvema licema, s petimi robovi in s štirimi točkami ali tetraedri z enim
licem, tremi robovi in tremi točkami na konveksni lupini poliedra so izločeni. Zaradi
tega pravila je moč rekonstruirati le objekte brez lukenj. Tetraedre te vrste iterativno
odstranimo glede na zmanjševanje odločitvenih vrednosti. Odločitvena vrednost
predstavlja maksimalno razdaljo lica tetraedra od njegove očrtane krogle. Tako
30. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 75
odstranimo tanke tetraedre Delaunayeve tetraedrizacije, saj običajno ležijo zunaj
objekta in pokrivajo območja z več podrobnostmi. Algoritem se ustavi, ko vse
točke ležijo na površju ali če brisanje tetraedra z največjo odločitveno vrednostjo ne
izboljša vsote odločitvenih vrednosti vseh tetraedrov na obrobju.
Pristop z γ-indikatorjem je opisal Veltkamp [81]. Indikator γ je vrednost, ki jo
priredimo krogli skozi tri mejne točke poliedra in je lahko pozitivna ali negativna.
r
Njegovo absolutno vrednost izračunamo kot 1 − R
, kjer je r polmer kroga, ki ga
očrtamo mejnemu trikotniku, in R polmer krogle, ki jo očrtamo mejnemu tetraedru.
Vrednost je pozitivna, če središče krogle leži znotraj poliedra in negativna, če je
središče zunaj. Indikator γ je neodvisen od velikosti trikotnika oz. tetraedra na meji
in se tako prilagaja območjem spreminjajoče gostote točk. Lice, ki ga odstranimo, je
lice s pozitivno vrednostjo indikatorja γ. Prvi korak algoritma je tvorba Delaunayeve
tetraedrizacije. V drugem koraku tvorimo uravnoteženo dvojiško drevo s tetraedri, ki
bodo odstranjeni, te pa uredimo po velikosti indikatorja γ. Tetraedri za odstranitev
so istega tipa kot pri Boissonatovi metodi [21]. Iz tetraedrizacije odstranimo
tetraeder z največjo vrednostjo γ in osvežimo površje. Postopek ponavljamo, dokler
ne zmanjka tetreadrov, ki jih lahko odstranimo. Prednost algoritma je, da je
indikator γ prilagodljiv različnim gostotam porazdelitev, algoritem pa je primeren
za gradnjo objektov brez lukenj.
Prvi algoritem s teoretičnim zagotovilom za pravilnost površja je razvila Amenta
s sodelavci [3]. Predstavili so ε-vzorčenje oz. kriterij LFS in z uporabo srednje osi
pokazali, da je rekonstrukcija geometrijsko blizu originalnemu površju. Algoritem
so poimenovali CRUST in je danes vsekakor najbolj popularen algoritem za
rekonstrukcijo površja. Zanj obstajata dve osnovni različici, enoprehodna in
dvoprehodna. Pri dvoprehodni različici najprej zgradimo podmnožico Delaunayeve
tetraedrizacije in dobimo množico polov, iz katerih v kombinaciji z Voronoijevim
diagramom v drugem prehodu zgradimo novo Delaunayevo tetraedrizacijo. Nato
31. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 76
poiščemo trikotnike, ki ležijo na površju (njihova oglišča so točke iz P ). Tiste
trikotnike, ki vsebujejo vsaj eno oglišče pola, odstranimo. Pri enoprehodni različici
algoritma lahko izberemo trikotnike, ki ležijo na površju, že iz prvotne Delaunayeve
tetraedrizacije. Izhajamo iz dejstva, da so Voronoijeve celice pri ε-vzorčenju
podolgovate in tako dokaj natančno aproksimirajo normalo trikotnika znotraj celice.
Nadgradnja algoritma, ki izboljša predvsem časovno zahtevnost in se spopade s
šumom ter robnimi primeri, se imenuje PowerCRUST [4]. Razširitev algoritma
CRUST je razvil tudi Dey [26] in ga poimenoval COCONE. Osredotočil se je na
velike množice vhodnih podatkov, na podvzorčenost, šum in robne primere (ostri
robovi, luknje).
5.2.2 Rekonstrukcija površja s funkcijo razdalje
Funkcija razdalje vrne najkrajšo razdaljo katerekoli točke v prostoru do površja.
Za zaprto površje so lahko razdalje pozitivne ali negativne, odvisno od tega, ali
točka leži znotraj ali zunaj podprostora, omejenega s površjem. Poleg algoritma
sprehajajočih kock je razdalja pomembna tudi pri algoritmih, ki uporabljajo srednjo
os.
Hoppe in sodelavci [50, 51] so predstavili algoritem, kjer površje predstavlja
množica ničel funkcije predznačene razdalje. V prvem koraku ocenimo normalne
vektorje z uporabo k-najbližjih sosedov. Na podlagi tega zgradimo graf, iz
katerega izluščimo evklidsko minimalno vpeto drevo, s katerim določimo orientacijo
normalnih vektorjev, saj morajo le-ti biti usmerjeni bodisi v notranjost bodisi v
zunanjost telesa. Na koncu izračunamo funkcijo razdalje za vsako točko, množico
ničel funkcije razdalje pa vstavimo v algoritem sprehajajočih kock [63], ki zgradi
končno površje.
Pristop, ki so ga predstavili Bittar in sodelavci [17], prostor razdeli v voksle,
s pomočjo funkcije razdalje pa aproksimira srednjo os. S postavitvijo krogel na
32. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 77
srednjo os in s presečišči med kroglami opišemo končno površje.
Učinkovit algoritem, ki je zmožen rekonstruirati površje z luknjami v fazi
postprocesiranja in deluje na velikih oblakih točk, sta predstavila tudi Curless and
Levoy [24].
5.2.3 Rekonstrukcija površja z ukrivljanjem
Rekonstrukcija z ukrivljanjem površja (angl. warping) zgradi površje tako, da
najprej tvori prvotno različico površja in ga nato ukrivi tako, da se čim bolj prilagodi
vhodni množici točk P . Proces si lahko predstavljamo kot napihnjeno žogo, v katero
postavimo točke P . Nato pričnemo iz žoge spuščati zrak, zato se žoga manjša, vse
dokler se v celoti ne prilagodi iskanemu površju. Geometrijsko žogo predstavimo
kot trikotniško mrežo okrog oblaka točk. Za vsako točko začetne mreže poiščemo
zvezo s točko iz P , nato pa točke začetne mreže postavimo na položaj točke iz P .
Med premikom točk na njihove nove lokacije se preoblikuje tudi preostanek mreže,
rezultat pa je aproksimacija originalnega površja.
Ideja je že relativno stara. Med zgodnjimi postopki najdemo aproksimacijo 2.5D
trikotniške mreže, ki jo je predstavil Muraki [70]. Fizikalno orientiran pristop sta
predstavila Szelinski in Tonnensen [80]. Pristop uporablja delce (angl. particles), ki
so povezani z vzmetmi, vsak delec pa vsebuje nekaj parametrov, katerih vrednosti se
spreminjajo med modeliranjem. Vsaka točka je predstavljena kot delec s parametri,
površje pa se tvori z modeliranjem interakcije med delci (privlačnost in odbojnost).
Nekatere metode za rekonstrukcijo površja uporabljajo nevronske mreže. Metoda, ki
sta jo predstavila Baader in Hirzinger [11], uporablja Kohonenove nevronske mreže
za rekonstrukcijo v 2.5D, kjer je vsaka točka predstavljena kot nevron. Yu [86] je
predstavil robustnejši pristop, ki deluje tudi v 3D.
33. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 78
5.2.4 Inkrementalni algoritmi za rekonstrukcijo površja
Osnovna ideja inkrementalnih postopkov je zgraditi interpolacijsko ali aproksimacij-
sko površje z upoštevanjem ploskovno usmerjenih lastnosti točk. Nekateri algoritmi
pričnejo graditi površje s poljubnim robom površja, ki ga tvorimo s povezavo dveh
točk, za kateri verjamemo, da sta sosednji točki na površju. Začetnemu robu in
nadaljnim robovom dodajamo trikotnike in tako iterativno širimo mejo tvorjenega
površja.
Ploskovno usmerjen algoritem [21] prične s tvorbo površja z najkrajšim robom,
ki ga dobimo s povezavo točk iz P . Temu in nadaljnim robom, ki ležijo na
obrobju površja, dodamo nov trikotnik tako, da lokalno ocenimo tangentno ravnino
s pomočjo robu sosednjih točk. Sosednje točke projiciramo na izračunano tangentno
ravnino, potem pa tvorimo trikotnik tako, da eno izmed teh točk povežemo z
obravnavanim robom. Izberemo tisto točko, ki z robom tvori trikotnik, katerega
notranji koti so maksimalni. Algoritem se zaključi, ko ne najdemo več nobenega
prostega roba. Drug način tvorbe napravi grobi približek površja, nato pa površje
dokončno oblikuje s sprotnim dodajanjem točk [66, 67].
Zelo popularni inkrementalni algoritmi so zagotovo algoritmi, temelječi na
napredujoči fronti. Najbolj znan algoritem te vrste je algoritem z vrtečo kroglo
(angl. ball-pivoting), ki ga je predstavil Bernardini s sodelavci [15], kjer površje
širimo z vrtenjem krogle okrog mejnih robov. Algoritem, kjer fronte predstavimo s
trodimenzionalno mejo delnega površja, je predstavil Scharf s sodelavci [75]. Začetne
fronte ustvarimo kot zaprte trikotniške mreže, ki z dodajanjem točk rastejo in se
raztezajo proti površju, dokler le-tega v celoti ne opišejo.
34. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 79
5.2.5 Gručenje
Zgodi se lahko, da en oblak točk predstavlja več ločenih oblik, kar lahko obstoječim
postopkom povzroči težave. Oblak točk razdelimo na posamezne dele, kjer vsak
del oblaka opiše samostojen objekt. Med postopki najdemo algoritem Fua in
Sanderja [44] ter Mencla in Müllerja [66, 67].
35. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 80
5.3 Algoritem PowerCrust
Algoritem PowerCrust je razvila Amenta s skupino [4] leta 2001 in je razširitev
prvotne ideje [3]. Sodi v skupino algoritmov z delitvijo prostora. Algoritem
zgradi površje tako, da najprej aproksimira srednjo os objekta, nato pa z inverzno
transformacijo iz srednje osi rekonstruira površje. Algoritem je prvi rekonstrukcijski
algoritem z močnim teoretičnim ozadjem, ki zagotavlja, da lahko iz kakršnega koli
(slabo vzorčenega, neenakomerno porazdeljenega) oblaka točk zgradimo površje.
Teorija zagotavlja tudi, da je rezultat rekonstrukcije vodotesno površje, ki ne
potrebuje dodatnega koraka krpanja lukenj po sami rekonstrukciji. Implementacija
algoritma je robustna, algoritem je odporen tudi na šum. Trenutno je PowerCrust
eden najpopularnejših algoritmov, zato bomo opisali osnove njegovega delovanja.
Za opis postopka moramo razložiti pojme, kot so srednja os in transformacija srednje
osi, poli, srednja krogla in diagram moči.
Srednja os objekta je množica točk, ki imajo vsaj dve najbližji točki na površju
objekta, tako da se krogla, ki leži na srednji osi, površja dotakne vsaj dvakrat.
Transformacija srednje osi (angl. medial-axis transform) ali MAT je pred-
stavitev skeleta objekta, kjer objekt namesto s točkami na površju predstavimo
s kroglami, ki v celoti ležijo v njegovi notranjosti. Prazna krogla je krogla, ki
v svoji notranjosti ne vsebuje nobene točke površja S, srednja krogla pa je
maksimalna prazna krogla, ki ni v celoti vsebovana v nobeni drugi prazni
krogli. Transformacija srednje osi površja S je definirana kot množica vseh
srednjih krogel. Središča srednjih krogel opišejo srednjo os objekta (slika 5.5).
Voronoijev diagram v 2D smo opisali že v prvem delu naše disertacije. Voronoijev
diagram v 3D razdeli prostor v konveksne poliedrične celice. Točka p ∈ P
definira Voronoijevo celico kot delitev prostora v množico točk px , za katere
velja, da je razdalja dist(px , p) manjša ali enaka razdalji med p in katero
36. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 81
koli drugo točko iz P . Točke p predstavljajo Voronoijeva središča, oglišča
Voronoijevih celic pa Voronoijeve točke.
Pol označuje skrajni Voronoijevi točki glede na Voronoijevo središče p, ki ležita na
nasprotnih straneh površja (znotraj in zunaj objekta). Označimo ju s p+ oz.
p− . Zanju velja, da je skalarni produkt med − − in − + negativen.
−
→ pp
pp −→
Slika 5.5: Črna krivulja prikazuje površje, modra srednjo os in krožnice
transformacijo srednje osi.
Če P predstavlja dovolj gost vzorec (ustreza vzorčenju LFS), so Voronoijeve
celice na predelih večje gostote točk ozke, dolge in skoraj pravokotne na površje.
Množica polov izloči vse Voronoijeve točke, ki so blizu površja S. Tako vektorja − +
−
→
pp
in − − aproksimirata normalo površja v točki p (slika 5.6).
−
→
pp
Ker je dual Voronoijevega diagrama Delaunayeva triangulacija oz. Delaunayeva
tetraedrizacija v 3D, Voronoijeve točke predstavljajo središča praznih krogel, ki
jih imenujemo tudi Voronoijeve krogle. Voronoijeva krogla je razpeta nad točke
podmnožice točk P Delaunayevega tetraedra, znotraj katere se ne nahaja nobena
druga točka iz P . Voronoijeve krogle s središči v polih imenujemo polarne krogle
(angl. polar ball), množica polarnih krogel pa aproksimira transformacijo srednje
osi. MAT vsebuje krogle zunaj in znotraj objekta. Unija notranjih polarnih krogel
opiše dober približek objekta, omejenega s površjem S, unija zunanjih krogel pa
37. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 82
Slika 5.6: Voronoijeva celica točke p, pola p− in p+ ter normala površja v točki p.
komplement objekta.
Diagram moči (angl. power diagram) je utežen Voronoijev diagram, ki ga zgradimo
iz množice polov z uteženo razdaljo, imenovano razdalja moči (angl. power distance).
Z Bc,ρ označimo kroglo s središčem v c in polmerom ρ. Kroglo si predstavljajmo
kot točko c z utežjo ρ2 . Razdalja moči med običajno točko px v prostoru in Bc,ρ je
definirana kot:
dpow (px , Bc,ρ ) = d2 (c, px ) − ρ2 ,
kjer d predstavlja navadno evklidsko razdaljo. Diagram moči v 2D in njegov dualni
graf, uteženo Delaunayevo triangulacijo (imenovano tudi regularna triangulacija),
prikazuje slika 5.7. Ko se px nahaja znotraj krogle Bc,ρ , je dpow negativna, sicer
pa pozitivna. Skorja moči (angl. power crust) predstavlja mejo med zunanjimi
in notranjimi celicami diagrama moči. Dvodimenzionalno lice skorje ločuje celici,
ki pripadata zunanjemu oz. notranjemu polu. Lica skorje moči ležijo med unijo
zunanjih in notranjih polarnih krogel blizu površja S. Z izrekom [3] je dokazano,
da skorja moči interpolira površje S. Aproksimacija srednje osi je površje, ki
je podmnožica regularne triangulacije v 3D. Imenujemo jo oblika moči (angl.
power shape), ki jo dobimo s povezovanjem polov sosednjih celic v diagramu moči
(slika 5.8).
38. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 83
Slika 5.7: Diagram moči (polne črte) in dualna regularna triangulacija (črtkane črte).
Krogi predstavljajo polarne kroge v 2D.
5.3.1 Algoritem
Algoritem PowerCrust poteka v naslednjih korakih:
1. Zgradimo Voronoijev diagram iz točk P .
2. Izračunamo pole za vsako točko p ∈ P .
3. Iz polov zgradimo diagram moči.
4. Vsak pol označimo glede na to, ali leži zunaj ali znotraj objekta.
5. Določimo lica diagrama moči, ki ločujejo celice zunanjih in notranjih polov oz.
skorjo moči (površje).
6. Določimo lica, ki povezujejo notranje pole in določajo obliko moči (aproksi-
macija MAT).
Pomemben korak je označevanje polov na zunanje in notranje z opazovanjem
diagrama moči. Definiramo naravni graf (angl. natural graph) nad celicami
diagrama moči. Dve celici povežemo, če si delita skupno dvodimenzionalno lice ali če
pripadata poloma istega vzorca. Če velja predpostavka o dobrem vzorcu, označimo
39. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 84
Slika 5.8: Objekt in približek srednje osi (vir: Amenta).
pole z upoštevanjem dveh dejstev. Prvo je to, da se zunanja in notranja polarna
krogla komaj dotikata druga druge, če se. Drugo dejstvo pa je, da sta dva pola
nad istim vzorcem vselej eden zunanji in drug notranji. Ker velikost celic omejimo s
škatlo, ki zaobjame ves objekt (implementacija uporabi petkratnik oklepajoče škatle
objekta, je pol, ki leži na škatli, zagotovo zunanji. Če p1 predstavlja zunanji pol, ki
meji na celico še neoznačenega pola p2 in je kot med tangentama njunih polarnih
krogel skozi presečišče velik, označimo pol p2 kot zunanji (slika 5.9). Sicer pol p2
označimo kot notranji. Podobno velja, če je pol p1 že označen kot notranji in če je
kot med tangentama v presečišču velik, je p2 prav tako notranji, sicer pa zunanji.
Ker v praksi vzorec ni nujno dober, lahko takšno označevanje privede do napak,
kar vodi do nepravilnega površja. V tem primeru uporabimo hevristike, s katerimi
40. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 85
najprej označimo tiste pole, pri katerih lahko z gotovostjo ugotovimo njihov položaj
in šele nato označimo preostale. Slika 5.10 prikazuje notranje rekonstruiran objekt
noge.
Slika 5.9: Polarna kroga sosednjih celic in kot α med presečiščem.
Algoritem Crust predpostavlja, da je površje gladko in vodotesno ter vzorčeno po
kriteriju LFS. Če temu ni tako, lahko nastanejo težave pri označevanju polov in kot
rezultat dobimo slabo aproksimacijo srednje osi ter posledično slabšo rekonstrukcijo
površja. Algoritem PowerCrust je odporen na šum. Z analizo polarnih krogel je na
površju možno puščati tudi luknje (če luknje predstavljajo lastnost objekta), nekaj
težav pa ima algoritem pri rekonstrukciji ostrih robov. Slabost algoritma so nekoliki
višji časi izvajanja.
41. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 86
Slika 5.10: Notranje polarne krogle objekta (a) in skorja moči kot rekonstruirano
površje (b) (vir: Amenta).
42. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 87
5.4 Algoritem BPA
Algoritem z vrtenjem krogle BPA (angl. ball-pivoting) spada v skupino
inkrementalnih algoritmov. Tvori interpolacijsko površje, ki ga širi z napredovanjem
fronte s pomočjo vrtenja krogle, kjer površje nastaja z rastjo regij. Algoritem,
ki ga bomo opisali, je predstavil Bernardini [15], temelji pa na ideji algoritma α-
oblik [34]. Na vhodu poleg koordinat točk prejme še točkovne normale, s katerimi si
pomagamo pri tvorbi trikotnikov in v situacijah slabega vzorčenja. Algoritem BPA
bomo predstavili zato, ker je trenutno eden najuspešnejših algoritmov z napredujočo
fronto.
Predpostavljamo, da je površje S vzorčeno dovolj gosto, tako da v množici točk
P z vrtenjem krogle vselej najdemo točko (kriterij vzorčne poti). Algoritem prične s
postavitvijo krogle tako, da na njenem obodu ležijo natanko tri točke. Veljati mora,
da se znotraj krogle ne nahaja nobena druga točka iz P . Tri začetne točke pripadajo
začetnemu ali semenskemu trikotniku (angl. seed triangle), kjer njegovi robovi
predstavljajo napredujočo fronto. Fronti dodajamo trikotnike tako, da vzamemo
enega izmed njenih robov in okrog njega zavrtimo kroglo. Pri tem mora krogla ves
čas na svojem obodu ohraniti položaj točk roba, saj ta predstavlja os vrtenja. Med
vrtenjem lahko najdemo več točk, vzamemo pa tisto, pri kateri krogla ne vsebuje
nobene druge točke. Nato tvorimo trikotnik in fronto razširimo z novimi robovi.
Postopek ponavljamo, dokler ne zmanjka robov. Slika 5.11 prikazuje delovanje
algoritma BPA na ravnini. Krog s polmerom ρ vrtimo od točke do točke in gradimo
robove (slika 5.11a). Če je gostota vzorčenja premajhna, nekaterih robov ni mogoče
ustvariti, zato nastanejo luknje (slika 5.11b). Če zaradi ukrivljenosti nekaterih točk
ni mogoče obiskati, se zgodi, da ne rekonstruiramo detajlov (slika 5.11c).
Napredujoča fronta je predstavljena kot zbirka povezanih seznamov robov.
Začetna fronta nastane ob tvorbi semenskega trikotnika kot skupek njegovih robov.
43. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 88
Slika 5.11: Delovanje algoritma BPA v 2D pri dovolj gostem vzorčenju (a), pri
premalo gostem vzorčenju (b) in pri preveliki ukrivljenosti površja (c).
Vsak rob pi pj je predstavljen s točkama pi in pj . Poleg tega rob hrani še nasprotno
točko po , ki je središče očrtane krogle K priležnega trikotnika, in povezave do
sosednjih robov na fronti.
V algoritmu nastopajo tri vrste robov:
• aktivni robovi so tisti, ki še niso bili uporabljani za širitev površja z vrtenjem
krogle,
• mejni robovi so tisti, pri katerih z vrtenjem krogle nismo našli nobene točke,
in
• zamrznjeni robovi služijo za pohitritev delovanja algoritma, zato se lahko
obnašajo kot aktivni ali neaktivni.
5.4.1 Preiskovanje prostora
Algoritem za svoje delovanje potrebuje iskanje v prostoru. Gre za preiskovanje
bližnje okolice, zato algoritem BPA uporablja enakomerno delitev prostora, kjer je
44. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 89
vsaka celica prostorska kocka oz. voksel s stranico δ = 2ρ. Točke so shranjene v
urejenem seznamu, točke znotraj voksla pa tvorijo povezan podseznam. Vsak voksel
vsebuje kazalec na začetek seznama točk ali kazalec do naslednjega podseznama,
če je le-ta prazen. Če imamo dano točko p, lahko voksel, v katerem se p nahaja,
najdemo tako, da koordinate točke delimo z ρ. Točke, ki so kandidati za tvorbo
novega trikotnika, so tiste, ki so od p oddaljene za 2ρ. Podatkovna struktura z
vokselsko mrežo omogoča konstanten dostop do točk.
5.4.2 Izbira semenskega trikotnika
Semenski trikotnik predstavlja začetek rasti površja. Izberemo ga na sledeč način:
• poiščemo poljubno točko pi , ki še ni del površja,
• vsi pari pa in pb naj bodo ustrezno oddaljeni od pi ,
• zgradimo potencialne semenske trikotnike pi pa pb ,
• preverimo, če je normala trikotnika konsistenta z normalami točk (enaka
usmeritev izven objekta),
• preverimo, če se krogla s polmerom ρ in s središčem v zunanjem delu
polprostora dotakne vseh treh točk in ne vsebuje nobene druge točke,
• ustavimo se, ko smo našli ustrezen semenski trikotnik.
Ker lahko imamo nepopolne podatke ali pa je prisoten šum, je pomembno
izbrati učinkovito strategijo za iskanje semenskega trikotnika. Dobra izbira
semena omogoča, da algoritem lokalno zgradi največje možno površje. Problem
predstavljajo točke šuma, ki so od rekonstruiranega površja oddaljene za nekoliko
več kot 2ρ. Če z njimi tvorimo seme, postopoma zgradimo neželjene dele površja,
ki ležijo blizu pravilnega površja. Neželjena površja je sicer možno odstraniti v fazi
post-rekonstrukcije, vendar je bolje, če se lahko temu izognemo in prihranimo čas.
45. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 90
Rešitev je, da se pri iskanju semenskega trikotnika omejimo le na eno točko za vsak
voksel. Tako bomo našli seme, s katerim je možno zgraditi površje, ki se razteza
čez več vokslov. Za dani voksel izračunamo povprečno točkovno normalo →, ki
−n
predstavlja povprečno normalo površja v dani regiji. Ker želimo, da naša krogla
potuje po zunanji strani površja, se pri točkah omejimo na tiste, katerih projekcije
na → so večje in pozitivne. Semenske trikotnike iščemo v nepraznih vokslih. Ko
−
n
najdemo semenski trikotnik, pričnemo z vrtenjem krogle graditi površje. Ko vrtenje
ni več mogoče (vsi robovi fronte so mejni), nadaljujemo z iskanjem semena tam, kjer
smo končali, pri čemer preskočimo vse voksle, pri katerih naletimo na točko, ki je že
del trikotniške mreže. Algoritem se zaključi, ko semena ne najdemo več.
5.4.3 Vrtenje krogle
Postopek vrtenja krogle se prične takoj, ko imamo semenski trikotnik. Naj bo
pi pj rob fronte, ki s točko po tvori trikotnik ijo z normalo − . Temu je očrtana
→
n
krogla s polmerom ρ (slika 5.12). Os vrtenja krogle pri vrtenju je rob pi pj , ki
leži na osi z in je usmerjen proti gledalcu. Krogla s središčem cijo je v začetnem
položaju prazna, zato je trikotnik ijo lahko semenski trikotnik ali pa je bil zgrajen
z vrtenjem krogle v predhodnih korakih. Koordinatni sistem je postavljen tako, da
center krogle cjio leži na pozitivni strani osi x. Vrtenje krogle je zvezno pomikanje
krogle po površju, kjer je krogla ves čas v stiku z robom pi pj . Zaradi stalnega
stika z njim središče cijo oriše krožno trajektorijo γ, ki leži na ravnini, pravokotni
1
na rob pi pj in poteka skozi njegovo srednjo točko pm = (p
2 i
+ pj ) (točka pm na
sliki 5.12 leži v izhodišču koordinatnega sistema). Središče vrteče krogle je v točki
pm , polmer pa dist(cijo , pm ). Med gibanjem se krogla lahko dotakne točke pk . Če
ob vrtenju ne najde nobene točke, rob pi pj označimo kot mejni. Sicer s točkami pi ,
pj in pk tvorimo trikotnik ijk , krogla pa v svojem zaključnem položaju ne vsebuje
nobene druge točke, zato je pripravljena nadaljevati vrtenje kot nova začetna krogla.
46. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 91
V praksi najdemo pk tako, da poiščemo vse točke, ki so od pm oddaljene za
največ 2ρ. Za vsako najdeno točko px izračunamo središče krogle cx , ki se dotika
oglišč pi , pj in px , če seveda takšna krogla obstaja. Vsako središče cx leži na krožni
trajektoriji γ okrog pm , ki ga dobimo s presečiščem krogle s centrom v px s krožnico
γ. Med vsemi točkami cx izberemo tisto, ki je prva v smeri trajektorije (torej tisti
cx , ki vrne najmanjši kot med premico lx in trikotnikom ijo ).
Slika 5.12: Vrtenje krogle okrog roba pi pj (pravokoten na sliko) najde točko pk , s
katero ustvarimo nov trikotnik.
5.4.4 Operatorja združevanja in lepljenja
Algoritem BPA obdela vse možne situacije s pomočjo dveh preprostih topoloških
operatorjev, ki med dodajanjem trikotnikov skrbita za obnašanje front:
• operator združevanja (angl. join),
• operator lepljenja (angle. glue).
47. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 92
Slika 5.13: Operator združevanja doda trikotnik ijk in osveži fronto.
Operator združevanja je preprostejši: uporabi se, ko kroglo zavrtimo okrog roba
pi pj in se dotaknemo še neuporabljane točke pk . Operator zgradi nov trikotnik ijk
in lokalno spremeni fronto tako, da odstrani rob eij in fronti doda robova eik in ekj
(slika 5.13). Če je pk že del trikotniške mreže, lahko nastopita dva primera:
1. pk je notranje oglišče trikotniške mreže, ki ne leži na fronti. Takšnega trikotnika
ne moremo tvoriti, zato rob eij predstavlja mejni rob.
2. pk pripada fronti. Če je normala trikotnika ustrezna, izvedemo operator
združevanja in ustvarimo trikotnik ijk .
Operator lepljenja poskrbi, da se vsak rob v površju nahaja le enkrat. Algoritem
BPA tvori usmerjene robove. Zgradimo lahko trikotnik z robom, ki pripada
drugi fronti, zato moramo poskrbeti za odstranitev parov prekrivajočih se robov z
nasprotno usmerjenostjo (algoritem ne tvori isto usmerjenih prekrivajočih se robov).
Če rob ekj že leži na fronti (slika 5.13), operator lepljenja ne naredi nič drugega kot
to, da odstrani oba robova ekj in ejk ter ustrezno preuredi fronto. Možni so štirje
različni primeri, kot prikazuje slika 5.14. Če oba robova tvorita zanko, ju odstranimo
(slika 5.14a). Če robova pripadata isti zanki in sta sosednja, ju prav tako odstranimo
in skrajšamo zanko (slika 5.14b). Če robova nista sosednja in pripadata različnima
48. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 93
zankama, zanki združimo (slika 5.14c). Zanko razdelimo takrat, ko robova pripadata
isti zanki in nista sosednja (slika 5.14d).
Slika 5.14: Operator lepljenja v različnih situacijah.
Če želimo algoritem uporabiti za velike količine podatkov, potrebujemo
razširitev, ki varčno upravlja s pomnilnikom. V hitri pomnilnik shranimo vse
podatke, ki so trenutno v uporabi za obdelavo, in odstranimo tiste, ki jih več ne
potrebujemo. Uporabimo dve osno-poravnani ravnini π0 in π1 , s katerima definiramo
aktivno območje vrtenja. Začetno π0 postavimo tako, da nobena točka ne leži
pod njo, π1 pa nad π0 , oddaljeno za neko uporabniško definirano razdaljo. Ko
ustvarimo nov rob, preverimo, če sta njegovi krajišči nad π1 . Takrat rob označimo
49. POGLAVJE 5. REKONSTRUKCIJA POVRŠJA IZ OBLAKA TOČK 94
za zamrznjen. Ko so vsi robovi v vrsti zamrznjeni, premaknemo ravnini π0 in π1
navzgor ter pretvorimo vse zamrznjene robove v aktivne.
Za rekonstrukcijo z neenakomerno vzorčenim površjem avtor predlaga večkratni
prehod z različnimi polmeri krogle. Tako uporabnik kot vhodni parameter definira
seznam n polmerov {ρ0 , ..., ρn−1 }, kjer velja ρi < ρi+1 , i < n − 1. Za vsak polmer
ρi algoritem prične vstavljati točke v mrežo vokslov velikosti δ = 2ρi . Algoritem
teče, dokler v vrsti obstajajo aktivni robovi. Ko se postopek ustavi, se postavimo
na naslednji polmer ρi+1 in se sprehodimo skozi vse mejne robove ter preverimo, če
vsak rob s svojo nasprotno točko po tvori pravilen semenski trikotnik za kroglo s
polmerom ρi . Če to drži, potem rob dodamo v vrsto aktivnih robov in nadaljujemo
s tvorbo površja z vrtenjem krogle.
50. Poglavje 6
Prebirni algoritem za rekonstrukcijo
površja
Algoritem, ki smo ga razvili, lahko uvrstimo v skupino algoritmov z napredujočo
fronto, ki fronto propagira s prebiranjem. Temelji na predpostavki, da je originalno
površje S vzorčeno po kriteriju vzorčne poti. Parameter r mora biti takšen, da
vsaka krogla s središčem v p ∈ P in polmerom r vsebuje vsaj en vzorec. Naš
pristop na prvi pogled deluje podobno kot algoritem BPA [15], vendar se precej
razlikuje. Pri algoritmu z vrtečo kroglo naslednjo točko p poiščemo z vrtenjem krogle
za vsak aktiven rob fronte. Točko p, s katero ustvarimo nov trikotnik, izberemo
z upoštevanjem praznosti krogle. Kandidate med točkami iščemo v prostoru,
zato potrebujemo trodimenzionalno podatkovno strukturo, primerno za iskanje
(algoritem BPA uporablja delitev prostora z voksli in dinamične sezname za vsak
voksel). Naš algoritem se problema loteva iz nasprotne strani. Po shemi prebiranja
naslednjo točko p obiščemo ob pomiku prebirne ravnine, točki pa poiščemo najbližji
rob fronte. Ker dejansko opazujemo projekcijo fronte na ravnino, potrebujemo za
iskanje dvodimenzionalno podatkovno strukturo. Zaradi razpršenosti vstavljanja
nastopi veliko situacij, ki jih je potrebno skrbno preučiti. Algoritem tvori vodotesno
površje.
95
51. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 96
Slika 6.1: Predogled delovanja algoritma na krogli (a) in obroču (b, c).
Opazujmo drsenje prebirne ravnine skozi površji krogle in stožca, ki poteka od
gledalca proti sliki pravokotno na njo (slika 6.1). Preseki med prebirno ravnino
in površjem orišejo krivulje. Ob postankih v nekaj točkah vidimo, da presečišča
s kroglo vrnejo le eno krivuljo (slika 6.1a). To je krožnica, ki ima na začetku
polmer 0, nato do sredine krogle njen polmer doseže vrednost r (zadnji prerez na
sliki), potem pa krožnica na enak način tudi izgine. Obroč lahko opazujemo iz
več gledišč. V primeru na sliki 6.1b kot presečišče najprej dobimo eno krožnico, ki
predstavlja vrh obroča. Kaj kmalu se v preseku pojavita dve krivulji, kjer zunanja
krožnica predstavlja zunanji del obroča (črna barva), notranja pa njegov notranji
del (rdeča barva). Zunanja krožnica na polovici prebiranja doseže svojo maksimalno
velikost, notranja pa minimalno. Sledijo prerezi, kjer se krožnici spet bližata, dokler
ne dobimo spet ene krožnice, ki izgine, ko dosežemo dno obroča. Če izberemo
52. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 97
gledišče na sliki 6.1c, opazimo, da prerez sprva oriše točko in nato krivuljo, ki
raste ter do polovice prebiranja preide v dve ločeni krivulji. Iz opazovanja presekov
krivulj se je rodila ideja algoritma, ki bo temeljil na tvorbi krivulj in obenem tvoril
površje. Krivulje bomo opisali z napredujočimi frontami, površje pa bo nastajalo
ob spremembah krivulj oz. napredujočih front. Vidimo, da je napredujoča fronta v
nekem trenutku nastala, se razvijala (ožila in širila) in se zaključila. Iz opazavanja
so razvidni vsaj trije dogodki v življenju front [64]:
• odprtje fronte,
• spreminjanje fronte in
• zaprtje fronte.
V nadaljevanju naloge bomo opisali naš algoritem, ki tvori površje z obravnavo
omenjenih dogodkov, se srečali z robnimi problemi in predstavili rezultate, najprej
pa bomo predstavili gradnike, ki jih potrebujemo za razvoj algoritma.
6.1 Gradniki
Gradniki, ki jih naš algoritem potrebuje, so:
• napredujoča fronta, ki predstavlja mejo tvorjenega površja,
• iskanje najbližje točke, ki vrne mesto vstavljanja trikotnikov,
• hierarhična struktura, ki vodi vsebnostne relacij med frontami.
6.1.1 Napredujoča fronta
Napredujočo fronto definiramo kot množico točk F = {p0 , p1 , p2 , .., pn−1 }. Fronta
lahko nastopa v dveh stanjih:
53. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 98
• Fronta je neaktivna takrat, kadar s točkami F ni možno zgraditi trikotnika.
Neaktivna fronta vsebuje največ dve točki (slika 6.2a). Neaktivne fronte na
slikah obrobimo s črtkano elipso.
• Fronta je aktivna takrat, ko množica točk F predstavlja enostavni mnogokotnik
s konkavnimi in konveksnimi oglišči brez lukenj. Aktivno stanje predstavlja
delujočo fronto (slika 6.2b). Aktivne fronte lahko gnezdimo. Fronte na lihem
nivoju imenujemo zanke, fronte na sodem nivoju gnezditve pa prstani. Zanke
orientiramo v pozitivni smeri oz. v nasproti smeri urinega kazalca (angl.
counter-clockwise ali CCW), prstane pa v negativni oz. v smeri urinega kazalca
(angl. clockwise ali CW). Zanke bomo risali s črno, prstane pa z rdečo barvo
(slika 6.3). Aktivne fronte bomo zaradi lažje predstave večkrat narisali kot
zaprte krivulje, kadar bomo razlagali splošno idejo posameznega koraka, čeprav
vemo, da gre za mnogokotnike.
(a) (b)
Slika 6.2: Neaktivne (a) in aktivne fronte (b).
Vsaka fronta zasede obe stanji, pri čemer je začetno stanje vselej neaktivno.
Fronte bomo večinoma opazovali kot projekcije na ravnino xy. Izrecno bomo
povedali, kdaj upoštevamo projekcijo v 2D in kdaj bomo pri delu upoštevali dejanske
54. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 99
Slika 6.3: Zanki F0 in F2 ter prstan F1 . Puščice kažejo orientacijo front.
3D koordinate. Enako velja za računanje razdalj med točkami in računanje kotov
med robovi front.
6.1.2 Hierarhično vodenje front
Pri zelo razgibanih površjih se lahko zgodi, da imamo veliko gnezdenj, torej je veliko
zank in prstanov. Za uspešno rekonstrukcijo moramo poznati odnose med njimi.
Slika 6.4 prikazuje možno stanje med izvajanjem algoritma. Podatkovna struktura
za predstavitev medsebojnega položaja front je drevo, ki ga poimenujemo drevo
relacij RT . Relacija oče-sin označuje vsebnostni odnos med frontami (slika 6.5),
kjer fronta v očetovskem vozlišču v svoji notranjosti vsebuje fronto v sinu. Koren
grafa kaže na fronte 1. nivoja, povezave med frontami so dvosmerne, tako da lahko
dostopamo do višjih oz. nižjih nivojev.
Vozlišče vstavimo v RT takrat, ko tvorimo aktivno fronto. Mesto v RT
pričnemo iskati v korenu drevesa. Z vsebnostnim testom nove fronte s frontami
1. nivoja najdemo ustrezno poddrevo. Za vsebnostni test zadostuje preverjanje
vsebnosti ene točke nove fronte v mnogokotniku, kjer vsebnost računamo brez
upoštevanja orientacije mnogokotnikov. Če vsebnosti ne najdemo, fronto dodamo
na konec seznama front 1. nivoja. Nasprotno, če poddrevo najdemo, postopek
55. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 100
Slika 6.4: Gnezdenje front. S črno so označe zanke, z rdečo prstani, modra barva pa
označuje fronto, ki jo vstavljamo.
preverjanja rekurzivno ponovimo za naslednji nivo. Vozlišče iz drevesa odstranimo
ob zaprtju fronte. Spreminjanje drevesa bomo bolj natančno opisali pri posameznih
dogodkih v nadaljevanju.
Slika 6.5: Predstavitev front z drevesom. Z modro je prikazana vstavljena fronta,
puščica prikazuje iskanje, siva oglišča pa so tista, kjer smo izvajali vsebnostni test.
6.1.3 Iskanje najbližjih točk
Ko vstavimo točko p, moramo poiskati fronte, ki jih bomo spremenili. Iskanje točk
je eno najbolj raziskanih področij računalniške geometrije, med katerimi najdemo
iskanje najbližje točke [8, 14, 73], iskanje k-najbližjih točk [82, 83] ali iskanje točk
56. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 101
znotraj določenega intervala [18, 19]. Nas zanimajo točke, ki ležijo znotraj krožnice
s središčem v p s polmerom r. Ker v algoritmu lahko nastopa več front hkrati, naj
bo v času iskanja prisotnih nF front. Edine točke, ki jih hranimo v iskalni strukturi,
so tiste, ki ležijo na frontah. Formalno iščemo točke pk ∈ Fj , j = 0, .., nF − 1, kjer
je 2D razdalja dist(pk , p) ≤ r.
Za iskanje točk uporabimo dvonivojsko iskalno podatkovno strukturo z delitvijo
ravnine na trakove v 1. nivoju in seznamom s preskakovanjem na drugem nivoju [89].
Trakovi so med seboj enaki, strukturo prikazuje slika 6.6. Oceniti moramo, koliko
točk bo v povprečju prisotnih med prebiranjem, s tem pa določiti število trakov in
njihovo širino. Optimalno število trakov nT določimo s formulo, povzeto po [89]:
1 √ ln ln n
nT = 0.6
n ln n
Širino traku tw določimo trivialno:
bmax −bmin
tw = nT
,
kjer sta bmin in bmax koordinati y oklepajočega pravokotnika v prečnem prerezu
oblaka točk P .
Trakove predstavimo s sekljalno tabelo, kar omogoča dostop do ustreznega traku
v konstantnem času, kjer je ključ iskanja koordinata y točke p. Vsak trak je
implementiran kot determinističen seznam s preskakovanjem, kjer končno mesto
točke p v drevesu najdemo s koordinato x. Časovna zahtevnost vstavljanja in
brisanja točke p je logaritemska.
Iskanje točk pk znotraj krožnice s polmerom r poteka po naslednjih korakih:
1. Točko p navidezno vstavimo v iskalno strukturo, pri čemer si zapomnimo
identifikator vodoravnega traku Ti (Ti = T1 na sliki 6.6) in položaj v seznamu.
57. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 102
2. S krožnico polmera r s središčem v p ugotovimo, katere trakove bomo morali
preiskati. Trak pod Ti označimo s Ti+ , trak nad Ti pa s Ti− (Ti− = T1 , Ti+ = T2
na sliki 6.6).
3. V vsakem od trakov Ti− , .., Ti , .., Ti+ poiščemo skrajni točki pmin z xmin ≥
(x − r) in pmax z xmax ≤ (x + r), ki ležita zelo blizu krožnice ali na krožnici
vodoravno desno ali levo od p. Točke, ki jih v danem traku iščemo, se nahajajo
med tema točkama. Sledi sprehod po seznamu od pmin do pmax za vsak trak,
kjer vsaki točki pj izračunamo 2D razdaljo dist(pj , p). Če je dist(pj , p) ≤ r,
točko pj dodamo v seznam rešitev.
Seznam rešitev označimo z C = {pr0 , pr1 , .., prk−1 } in je urejen po oddaljenosti
od p.
Slika 6.6: Iskalna struktura.
58. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 103
6.2 Osnovne operacije algoritma
V tem poglavju bomo opisali pogoje za nastanek, odprtje in zaprtje fronte ter kriterij
za vstavljanje trikotnika v fronto.
6.2.1 Odprtje fronte
Algoritmi, ki uporabljajo napredujoče fronte, zahtevajo določitev prvega elementa,
s katerim se začne tvorba površja. Tak element imenujemo seme (angl. seed).
Največkrat je to semenski trikotnik [15], ki ga tvori tudi naš algoritem. Pogoj za
njegov nastanek so tri nekolinearne točke.
Fronta nastane, ko vstavljanje točke p ne najde točk v bližini. Začetno stanje
vsake fronte je neaktivno, fronta nastopa le kot shramba točk. Odprtje fronte nastopi
takrat, ko fronta preide iz neaktivnega v aktivno stanje. Takrat tvorimo semenski
trikotnik in fronto vstavimo v drevo RT . Orientacija oglišč in s tem smer normale
semenskega trikotnika zavisi od nivoja gnezdenja. Če je fronta zanka, normala kaže v
polprostor, ki ga je prebirna ravnina že obiskala, sicer pa v polprostor na drugi strani
prebirne ravnine. Ker je algoritem namenjen rekonstrukciji vodotesnih površij, ne
pričakujemo primerov, kjer bi bil semenski trikotnik pravokoten na prebirno ravnino.
Primer nastanka fronte prikazuje slika 6.7. Najprej vstavimo točko p0 , ki zaradi
prazne okolice ustvari fronto F0 = {p0 } (slika 6.7a). Točka p1 pade v neposredno
bližino točke p0 , zato jo dodamo fronti F0 = {p0 , p1 } (slika 6.7b). Točka p2 je
najbližje točki p1 , vendar fronta F0 ne more postati aktivna zaradi kolinearnosti
projekcij točk p0 , p1 in p2 , zato s točko p2 tvorimo novo fronto F1 = {p2 } (slika 6.7c).
Ko vstavimo točko p3 , odpremo fronto F0 (slika 6.7d). Rezultat vstavljanja sta
aktivna fronta F0 = {p0 , p1 , p3 } in neaktivna fronta F1 = {p2 }. Vstavljanje fronte v
RT vidimo na slikah 6.4 in 6.5.
59. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 104
Slika 6.7: Nastanek fronte (a in c), dodajanje točke v fronto (b) in odprtje fronte
(d).
6.2.2 Dodajanje trikotnika
Vstavljanje točke spremeni fronto. Fronto ožimo, ko vstavljajoča točka p leži v
njeni notranjosti, sicer fronto širimo. Če p pade neposredno na rob fronte, rob (in
priležen trikotnik) razbijemo na dva dela. Če p sovpada s točko fronte, vstavljanje
za točko p izpustimo. Položaj točke glede na fronto preverimo z vsebnostnim
testom točka-mnogokotnik [49, 73], pri čemer upoštevamo tudi nivo gnezdenja
fronte (notranjost prstana je dejansko zunanjost mnogokotnika, notranjost zanke
pa navadna notranjost). Fronto spremenimo s tvorbo novega trikotnika z najbližjim
robom fronte in točko p. Kje in koliko trikotnikov dodamo, pove kot ϕ, ki je kot med
→
−
bisektorjem b kota pc+ pc pc− in vektorjem − p (slika 6.8). S pc označimo najbližjo
p→
c
točko na fronti, s pc− točko pred pc in s pc+ točko za pc glede na vrstni red v fronti.
→
−
Kot med bisektorjem b in nosilko roba pc− pc označimo z α. Če je kot ϕ < |α|,
je možno tvoriti dva trikotnika naenkrat. Ker so rezultat lahko tanki trikotniki,
α
postavimo mejo s kotom β (β = 5
), ki je določen eksperimentalno. Tvorba ima 3
možnosti:
60. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 105
Slika 6.8: Določanje vstavljanja.
• če je ϕ > +β (slika 6.9), tvorimo nov trikotnik pc pc+ pi in v fronto dodamo
točko pi (F = {.., pc− , pc , pi , pc+ , ..}),
• če je ϕ < −β (slika 6.10), tvorimo nov trikotnik pc− pc pj in v fronto dodamo
točko pj (F = {.., pc− , pj , pc , pc+ , ..}),
• če je ϕ ≤ |β| (slika 6.11), lahko tvorimo dva trikotnika pc− pc p in pc pc +pk ,
točko pc pa odstranimo iz fronte (F = {.., pc− , pk , pc+ , ..}).
Enako storimo tudi v primeru, ko se p nahaja znotraj fronte. Če je p od roba
fronte oddaljena za manj kot toleranca ε, preverimo, ali bi morda s p razdelili
obstoječ trikotnik. Toleranca zavisi od polmera r, kjer velja ε r.
6.2.2.1 Uravnavanje fronte
Po vstavljanju točke pokličemo hevristične funkcije, ki pomagajo zakrpati morebitne
odprtine levo in desno od vstavljenega trikotnika. Želimo, da je fronta čim bližje
prebirni ravnini, da lahko brez večjih skrbi pri iskanju točk uporabljamo 2D razdalje.
Uporabimo enak pristop, kot smo ga uporabili pri algoritmu omejene Delaunayeve
61. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 106
Slika 6.9: Tvorba trikotnika pc ppc+ .
Slika 6.10: Tvorba trikotnika pc− ppc .
triangulacije [92], kjer kote med robovi front računamo v 3D.
6.2.3 Zaprtje fronte
Zaprtje fronte je dogodek, ki nastopi ob zaključku dela površja. Situacij, ki privedejo
do zaprtja fronte, je lahko več. Slika 6.12a prikazuje situacijo, ko vstavljena točka p v
svoji bližnji okolici najde vse točke, ki ležijo na fronti F, točka p pa se nahaja znotraj
F. Fronto zapremo tako, da s točko p in vsakim robom F zgradimo trikotnik. V
praksi se lahko zgodi, da vseh trikotnikov ni možno zgraditi na preprost način, zato
raje uporabimo algoritem za triangulacijo enostavnega mnogokotnika [93]. Rezultat
zaprtja vidimo na sliki 6.12b. Fronto odstranimo iz drevesa RT .
62. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 107
Slika 6.11: Tvorba trikotnikov pc− ppc in pc ppc+ .
Druga situacija, ki pripelje do zaprtja fronte, je navadno vstavljanje. Gradnji
trikotnika s točko p sledi preverjanje s hevrističnimi funkcijami, ki z računanjem
kotov med robovi fronte vstavijo dodatne trikotnike. Postopek lahko vstavi toliko
trikotnikov, da fronto zapremo.
Tretja možna situacija nastopi ob deljenju fronte, ki ga bomo opisali v
nadaljevanju. Pri deljenju lahko nastane nova fronta, ki jo, če je dovolj majhna,
prav tako zapremo. Pričnemo v točki pi , ki je postavljena tako, da predstavlja prvo
točko nove fronte. Če je dist(pi− , pi ) ≤ r in dist(pi+ , pi ) ≤ r, dodamo trikotnik
pi− pi pi+ , pi pa zbrišemo iz fronte. Nato se postavimo v pi+ in pi− , kjer enako
preverimo za vsako točko posebej. Trikotnik tvorimo s krajšimi robovi. Postopek
ponavljamo, dokler obstajajo robovi z dolžino ≤ r. Če pridemo do konca, fronto
zapremo. Primer vidimo na sliki 6.13.
6.3 Potek algoritma
Prebirni algoritem zahteva pripravo podatkov. Točke uredimo glede na koordinato
z. V primerih, ko se večja skupina točk nahaja na ravnini, je zaželjeno, da
63. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 108
Slika 6.12: Zaprtje fronte.
Slika 6.13: Vstavljanje trikotnikov s preverjanjem razdalj (a in b) in zaprtje fronte
(c).
vstavljamo točke lokalno blizu predhodno vstavljenih točk, saj tako zmanjšamo
število združevanj in osamelih točkovnih front. Za točke urejene množice P naj
velja:
pi < pj , e(zi < zj ) ∨ (zi = zj ∧ yi < yj ) ∨ (zi = zj ∧ yi = yj ∧ xi < xj ),
kjer je i < j. Prebirno premico postavimo v p0 . Trenutno obiskano točko označimo
s p, ki gre skozi naslednje korake:
1. Točki p poiščemo bližnjo okolico C.
64. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 109
2. Filtriramo C.
3. Točko p vstavimo.
6.3.1 Filtriranje bližnjih točk
Iskanje bližnje okolice smo že opisali v podpoglavju 6.1.3. Rezultat iskanja bližnje
okolice vrne seznam k točk C, urejen po oddaljenosti od točke p. Bližnje točke
najprej uredimo v skupine po pripadnosti glede na fronto, zato G preoblikujemo
v obliko C = {C0 , C1 , .., Cn−1 }, kjer n predstavlja število različnih front. Z Ci pa
označimo skupino vseh točk, ki pripadajo fronti Fi . Upoštevati moramo dejstvo,
da je lahko polmer r prevelik za dano vzorčenje. V tem primeru bomo našli preveč
bližnjih točk, zato moramo nujno odstraniti tiste, ki so odveč. Točke v Ci razdelimo
v intervale znotraj fronte Fi , če je fronta Fi aktivna. Z Cij označimo skupino točk
j−tega intervala fronte Fi , Ci pa opišemo z Ci = {Ci0 , Ci1 , .., Cimi −1 }, kjer je mi
število podskupin v Ci . Skupino točk neaktivne fronte Fi označimo z Ci0 .
Poglejmo si primer na sliki 6.14. Iskanje točk vrne množico točk C =
{p2 , p1 , p3 , p4 , p0 , p10 , p11 , p7 , p8 } (slika 6.14a). Razdelitev na skupine glede na
pripadnost frontam vrne C0 = C, saj vse točke pripadajo fronti F0 . Nato C0
razdelimo v zvezne intervale glede na vrstni red v F0 in kot rezultat dobimo
0 1 2
C0 = {p0 , p1 , p2 , p3 , p4 }, C0 = {p7 , p8 } in C0 = {p10 , p11 } (slika 6.14b). Iz primera
lahko sklepamo, da je edina skupina točk, s pomočjo katerih bomo fronto spreminjali
0
(in pri tem ohranili enostavnost mnogokotnika), skupina C0 . Za odstranitev
nezaželenih skupin točk vpeljemo pojem vidnosti, ki smo ga spoznali že pri omejeni
Delaunayevi triangulaciji. Množico omejitev Ec nadomestimo z napredujočimi
frontami in vidnost definiramo na naslednji način:
Točki pi in pj sta medsebojno vidni, če rob pi pj ne seka nobenega roba
napredujočih front.
65. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 110
Slika 6.14: Razdelitev točk na intervale (a) in odstranitev točk z upoštevanjem
vidnosti (b).
Iz skupin Cij izločimo vse točke, ki niso vidne iz p. Izločanje v primeru na
1 2
sliki 6.14a zbriše skupini C0 (p7 , p8 ) in C0 (p10 , p11 ) ter točko p0 , tako da je rezultat
0
C0 = {p1 , p2 , p3 , p4 } (slika 6.14b).
Rezultat iskanja bližnjih točk vrne seznam rešitev urejen po oddaljenosti, ki vsebuje
k točk C = {pr0 , pr1 , .., pr(k−1) }. Bližnje točke najprej uredimo v skupine po
pripadnosti glede na fronto, zato C preoblikujemo v obliko C = {C0 , C1 , .., Cn−1 },
kjer n predstavlja število različnih front, z Gi pa označimo skupino vseh točk, ki
pripadajo fronti Fi . Glede na število front n ločimo:
• vstavljanje točke v eno fronto, če je n = 1,
• vstavljanje točke v več front, če je n > 1.
6.3.2 Vstavljanje točke v eno fronto
Upoštevati moramo dejstvo, da je lahko polmer r prevelik za dano vzorčenje. V tem
primeru bomo našli preveč bližnjih točk, zato moramo nujno odstraniti tiste, ki so
66. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 111
odveč. Vstavljanje točke p v eno fronto se lahko konča na različne načine:
• navadno vstavljanje (opisano v podpoglavju 6.2.2),
• zaprtje fronte (opisanu v podpoglavju 6.2.3) ali
• delitev fronte.
Če točke v C0 predstavljajo celotno fronto F0 , gre za zaprtje fronte. Če imamo
opravka le z eno skupino točk Ci0 , zgradimo trikotnik z robovoma ob najbližji točki
intervala. Če je število skupin m > 1, bomo fronto F0 delili.
6.3.2.1 Delitev fronte
Delitev front je postopek, kjer fronta razpade na več manjših front, ki vsaka naprej
samostojno tvori svoj del površja. Če z nI označimo število skupin, fronta razpade
na nI front, na kakšen način pa bomo delili, pove vsebnostni test:
• Če p leži znotraj F0 , gre za priredno delitev fronte, rezultat pa je nI front
na istem nivoju gnezdenja kot F0 . Na sliki 6.15a vidimo primer deljenja fronte
F0 na dva dela. F0 delimo tako, da območje med skupinami točk zakrpamo s
trikotniki (slika 6.15b), rezultat pa sta spremenjena fronta F0 in nova fronta
F3 , ki ima enak nivo gnezdenja kot F0 (slika 6.15c). Spremembo v drevesu RT
vidimo na sliki 6.15d, kjer leva stran predstavlja stanje pred in desna stanje
po vstavljanju. Če je fronta F0 pred delitvijo vsebovala sinove, jih razdelimo
med F0 in F3 .
• Če p leži zunaj F0 , gre za podredno delitev, ustvarimo nI − 1 novih front
na nivoju globlje od F0 . Na sliki 6.16a vidimo postopek deljenja, ki ustvari
1 novo fronto. Območje med frontama zapolnimo s trikotniki (slika 6.16b),
spremenimo F0 in ustvarimo novo fronto F1 (slika 6.16c), ki jo v RT postavimo
pod F0 (slika 6.16d).
67. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 112
Slika 6.15: Priredna delitev fronte.
(a) (b) (c)
(d)
Slika 6.16: Podredna delitev fronte.
68. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 113
Natančen postopek priredne delitve v dve novi frotni prikazuje slika 6.17. Za
j
vse skupine točk C0 izberemo najbližje točke pcj in mesta vstavljanja razvrstimo
v krožnem zaporedju glede na točko p (slika 6.17a). Nato zgradimo trikotnike z
vstavljanjem točke p k vsaki pcj (slika 6.17b). Rezultat vstavljanj vrne pare točk
(psj , pej ), ki predstavljajo začetno oz. končno točko spremembe j−tega dela fronte.
Da lahko tvorimo nove fronte, zgradimo trikotnike pej ps(j+1) p (slika 6.17c). Rezultat
so fronte Fj = {pej , .., ps(j+1) } (slika 6.17d). Postopek za podredno delitev je enak,
razlika je le v orientaciji novih front.
Slika 6.17: Delitev fronte F0 .
Delitev, bodisi priredna bodisi podredna, lahko vrne zelo majhne fronte, ki
se v nadaljevanju ne bodo več spreminjale. Zato takoj po deljenju poskusimo z
69. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 114
upoštevanjem razdalj med sosednjimi robovi zgraditi čim več trikotnikov. Postopek
smo opisali pri zapiranju front v poglavju 6.2.3.
6.3.3 Vstavljanje točk v več front
Vstavljanje v več front hkrati predstavlja dogodek združitve. Razpolagamo s
skupinami točk C0 , C1 , .., Cn−1 . Združitev izvedemo s pomočjo postopka za
vstavljanje točke v eno fronto, opisanega v predhodnem poglavju, opravimo pa ga v
treh korakih:
1. Skupine Ci uredimo v krožnem vrstnem redu glede na točko p.
2. Točko p vstavimo v Fi po načinu vstavljanja v eno fronto. Mesto spremembe
si zapomnimo z dvojico (psi , pei ).
3. Fronte Fi združimo.
Nato preverimo, kakšne fronte bomo združevali glede na njihova stanja:
• združevanje neaktivnih front,
• združevanje aktivnih front in
• mešano združevanje.
Postopek združevanja neaktivnih front je prikazan na sliki 6.18. Pričnemo
z najbližjimi točkami fronte in poskusimo zgraditi prvi trikotnik (slika 6.18a).
Takrat ustvarimo fronto F, ostale točke pa dodamo v krožnem zaporedju po
navadnem postopku vstavljanja (slika 6.18b-d). V primeru, da trikotnika ni možno
tvoriti (slika 6.19a) zaradi kolinearnosti, s točko p ustvarimo novo neaktivno fronto
(slika 6.19b).
70. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 115
Slika 6.18: Združitev neaktivnih front kot odprtje.
Slika 6.19: Združitev neaktivnih front ni mogoča zaradi kolinearnosti projekcij (a),
zato tvorimo novo neaktivno fronto (b).
Združitev aktivnih front lahko nastopa v dveh oblikah. Če združujemo fronte
na istem nivoju gnezdenja v RT , govorimo o priredni združitvi (slika 6.20), sicer
govorimo o podredni združitvi (slika 6.21).
Mešana združitev front združi aktivno in neaktivno fronto. Če združujemo
aktivno fronto F0 in aktivno fronto F1 , vstavimo vse točke F0 v F1 .
Slika 6.22 in slika 6.23 prikazujeta deljenje oz. združevanje front na primeru.
6.3.4 Dogodkovne točke
Dogodkovne točke so nujen mehanizem za pravilno delovanje algoritma. Njihova
naloga je medsebojno izključevanje nasprotujočih si dogodkov. Razlog leži v
parametru r polmera kroga, ki je osnovni pogoj za izbiro dogodkov. Para
nasprotujočih si dogodkov sta odprtje-zaprtje in delitev-združitev.
71. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 116
Slika 6.20: Priredna združitev
Slika 6.21: Podredna združitev.
72. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 117
Slika 6.22: Deljenje na primeru.
73. POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA 118
Slika 6.23: Združevanje na primeru.