SlideShare ist ein Scribd-Unternehmen logo
1 von 101
Downloaden Sie, um offline zu lesen
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 )
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
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.
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
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
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
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
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.
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.
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
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
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
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
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.
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.
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
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
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,
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.
POGLAVJE 4. PREBIRNI ALGORITEM CDT                                                65




Slika 4.15: Primer vhoda pri katastrskih podatkih (a) in rezultat triangulacije (b).
POGLAVJE 4. PREBIRNI ALGORITEM CDT                                                 66




Slika 4.16: Primer vhoda pri triangulaciji površja (a) in rezultat triangulacije (b).
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
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
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).
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].
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
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
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
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
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
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
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.
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.
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].
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
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
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).
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
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
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.
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).
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.
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
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.
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.
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).
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
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
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.
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
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
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:
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
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
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
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.
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.
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.
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:
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
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 .
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
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.
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.
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
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).
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.
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
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).
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.
POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA   116




                  Slika 6.20: Priredna združitev




                  Slika 6.21: Podredna združitev.
POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA   117




                 Slika 6.22: Deljenje na primeru.
POGLAVJE 6. PREBIRNI ALG. ZA REKONSTRUKCIJO POVRŠJA   118




                Slika 6.23: Združevanje na primeru.
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted
Un encrypted

Weitere ähnliche Inhalte

Andere mochten auch

Andere mochten auch (7)

© Adict Online Eyetracking Case Study L'arome
© Adict Online Eyetracking Case Study L'arome© Adict Online Eyetracking Case Study L'arome
© Adict Online Eyetracking Case Study L'arome
 
Mai Po Project
Mai Po ProjectMai Po Project
Mai Po Project
 
Interconnecting devices
Interconnecting devices Interconnecting devices
Interconnecting devices
 
Stb.FördPr2010_Entsch.pdf
Stb.FördPr2010_Entsch.pdfStb.FördPr2010_Entsch.pdf
Stb.FördPr2010_Entsch.pdf
 
PPC
PPCPPC
PPC
 
Logistics of electrical and electronics
Logistics of electrical and electronicsLogistics of electrical and electronics
Logistics of electrical and electronics
 
Nuevas F
Nuevas FNuevas F
Nuevas F
 

Un encrypted

  • 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.