obj(10) (OBJEKT - moj tip) poln (LOGICAL - če je model v uporabi) sprememba (LOGICAL - če se bo na njem izvedla naslednja operacija) izrisi (LOGICAL - če bo izrisan na zaslon) st_tock (INTEGER - število točk) st_robov (INTEGER - število robov) st_ploskev (INTEGER - število ploskev) v (POINTER) (TOCKA - moj tip točke (spremenljive obsežnosti)) x, y, z (REAL - koordinata točke) e (POINTER) (ROB - moj tip robu (spremenljive obsežnosti)) t1, t2 (INTEGER - št. obeh točk robu) pl (POINTER) (PLOSKEV - moj tip ploskve (spremenljive obsežnosti)) st_robov(INTEGER - število robov ploskve) rob(10) (INTEGER - številka robu) tezisce (V - točka težišča) normala (V - normala na ploskev) komentar (CHARACTER*80 - komentar modela)V fortranu izgleda definicija baze tako:
TYPE tocka !definicija točke SEQUENCE REAL x,y,z END TYPE tocka TYPE rob !definicija robu SEQUENCE INTEGER t1,t2 END TYPE rob TYPE ploskev !definicija ploskve SEQUENCE INTEGER st_robov INTEGER rob(10) !maksimalno 10 robov TYPE (tocka) :: tezisce TYPE (tocka) :: normala END TYPE ploskev TYPE objekt !definicija objekta SEQUENCE LOGICAL poln, sprememba, izrisi INTEGER st_tock, st_robov, st_ploskev TYPE (tocka),POINTER :: v(:) TYPE (rob),POINTER :: e(:) TYPE (ploskev),POINTER :: pl(:) CHARACTER*80 komentar END TYPE objektStruktura podatkov je zasnovana tako, da ni omejitve pri številu točk, robov in ploskev modela, pri tem pa program porabi za model le toliko pomnilnika, kot ga potrebuje. Torej, velikost baze se samodejno spreminja.
Tetraeder - komentar modela (do 80 znakov) 4 - število točk 0. 0. 0. - koordinata točke 1. 5. 0. 0. - ... 2.5 4.330127 2.5 2.5 4.330127 -2.5 6 - število robov 1 3 - rob 1. (od točke 1. do 3.) 3 2 - ... 2 4 4 1 4 3 1 2 4 - število ploskev 4 1 5 - robovi, ki povezujejo 1. ploskev 3 5 2 - ... 6 2 1 6 4 3V tako definirani bazi smo omejeni na ravninske modele brez sferičnih ploskev, cilindrov, izvrtin, zaokroženih robov ter podobno.
Naslednji način prikaza je prikaz ploskovnih modelov. Tu smo omejeni le na prikaz ploskev, katere se lahko s grafičnimi procesorji senči in skriva nevidne robove. Pri takem načinu dobi uporabnik boljšo predstavo o geometriji modela. Na ploskve modela se lahko 'lepi' teksture, ki še izboljšajo predstavo o stanju modela. Ne moremo pa rezati modela, delati prerezov
Najbolj popoln pa je volumski prikaz modelov. Pri tem načinu modeliranja pa imamo vse informacije o volumnu modela. To so material, specifična masa, vse mehanske lastnosti, s katerimi lahko računamo napetostna stanja in podobno. Na takih modelih se lahko vršijo Boolove operacije s katerimi dosežemo združevanje in rezanje. Volumske modelirnike se uporablja predvsem za načrtovanje modelov, ki se jih kasneje izdela z računalniško krmiljenim obdelovalnim strojem.
Moj program je narejen za prikaz žičnih modelov, ki so omejeni le z ravnimi ploskvami. Prikaz zaokrožitev robov, skrivanje robov ter senčenje ploskev zahteva veliko programerske spretnosti, s čimer pa se v okviru teh vaj ne bi ukvarjal.
Izračun težišča ploskve bom poenostavil in računal težišče črtovja, kar pa ni hkrati tudi težišče ploskve. Težišče črtovja se izračuna z enačbo:
pri čemer je Txe težišče robu v x smeri in l dolžina robu.
Analogno velja za y in z koordinato.
Za izračun normale je najprej potrebno izračunati orientiranost ploskve. Program preverja, če so robovi zvezno razporejeni, kar je pogoj, da lahko izračunamo orientiranost ploskve. Predpostavil sem, da ima ploskev pozitivno orientiranost, če si navedba robov sledi v nasprotnem smislu urinega kazalca. Tako bi pri navedbi robov '1 2 3 4' normala kazala v pozitivni smeri z osi, pri '4 3 2 1' pa v negativni smeri. Definicija ploskve '2 4 1 3' nima pomena in program javi napako.
Algoritem za iskanja normale vzame prva dva robova kot vektorja in izračuna vektorski produkt med njima.
Dobimo vektor, ki je pravokoten na oba vektorja in s tem smernico normale. Prave usmerjenosti pa še vedno ne kaže, ker ne vemo, ali robova oklepata ostri ali topi kot ploskve. Zato je potrebno izračunati vektorski produkt v vsakem oglišču ploskve, dobljene vektorje pa med seboj sešteti,
pri čemer je n število robov ploskve, vi pa točke ploskve.
Dobljeni vektor N nam daje pravo usmerjenost in neko dolžino. Normalni vektor pa ima dolžino 1, zato ta vektor delimo z njegovo dolžino.
Dobili smo normalo ploskve ki jo izrisujemo na težišču ploskve oz. težišču črtovja.
Pred vsakim izrisom se morajo izračunati nove perspektivne koordinate, delovne pa ostanejo nespremenjene. Upoštevati je potrebno, da mora biti točka v neskončnosti vidna na sredini ekrana, zato moramo pred izračunom koordinat, ki se bodo izrisale na zaslon prilagoditi tako, da je zaslonsko koordinatno izhodišče na sredini zaslona.
maxy - maksimalna y koordinata zaslona
miny - minimalna y koordinata zaslona
Nove koordinate perspektive izračunamo s pomočjo podobnih trikotnikov:
rmax je maksimalna oddaljenost točke od računskega koordinatnega izhodišča. f je oddaljenost točke opazovanja od projekcijske ravnine (zaslona). Ta razdalja mora biti proporcionalna z velikostjo predmeta na ekranu oz. maksimalno oddaljenostjo točke od računskega koordinatnega izhodišča.
f0 - konstanta perspektivnega pogleda
Slika 5 fo=1,4; Slika 6 fo=0,3
Dobljene koordinate je pred izrisom potrebno prilagoditi nazaj na dejanske zaslonske koordinate:
Analogno velja za koordinate x.
Končne dobljene koordinate lahko nato izrišemo na ekran.
Slika 7 Primer ortogonalne paralelne projekcije
Slika 8 Primer centralne projekcije z enim bežiščem (perspektiva)
Za translacijo nastavimo sledečo matriko:
za skalacijo:
ter za rotacijo v vseh treh smereh:
Vektor, ki ga množimo z matrikami pa je četrte dimenzije in je sestavljen iz treh koordinat točke, četrti člen pa je 1:
Dobimo vektor četrte dimenzije, v katerem so prvi trije členi koordinate nove točke.
Program je narejen tako, da se lahko modele premika poljubno po koordinatnem sistemu modelov tako, da ohranimo medsebojno relacijo med modeli. Ker pa imamo koordinate modelov v pomnilniku prirejene na zaslonske koordinate, nam transformacijske matrike transformirajo modele le po koordinatnih oseh zaslona. Zato je potrebno pred translatornim premikom, skalacijo ter rotacijo po glavnih oseh modelov (torej pred vsako transformacijo, ki se ne tiče vrtenja pogleda), najprej uskladiti oba koordinatna sistema med seboj. To naredi rutina PLAN, ki zavrti modele in koordinatne osi okoli vseh treh zaslonskih osi tako, da se osi obeh sistemov skladajo. Nato se izvrši želena transformacija. Po tem se točka pogleda vrne nazaj na začetno mesto tako, da se pogled zavrti v obratnem vrstnem redu za nasprotne kote, kot se je pri rutini PLAN. S tem dobimo občutek, da se je premaknil samo en model ali več (odvisno od tega, koliko jih je izbranih), ostali pa so ostali na istem mestu.
Pri branju novega modela se meje zaslona samodejno prilagodijo vsem modelom, ki so že v pomnilniku vključno z novim, tako da noben model ne izpade iz zaslona. Za to skrbi rutina INIT_WINDOW, ki išče najmanjše in največje koordinate in jih prilagodi razmerju stranic zaslona tako, da so si stranice modelov med seboj proporcionalne, modeli pa so na zaslonu centrirani.
Slika 9 Centriranje modela na zaslon
Sedaj imamo koordinate robov zaslona, ki niso nujno v pravem razmerju z širino in višino ekrana, zato jih je potrebno korigirati, tako da je
.
Sledi, da je
,
.
Glede na ta razmerja je potrebno spremeniti še maxx, minx ter maxy in miny.
Pri premikanju okna levo, desno, gor in dol se pred risanjem samo spremenijo koordinate okna izrisa in se na modelih ne vršijo nobene geometrijske transformacije.
Pri branju novega modela v pomnilnik se preverja konsistentnost podatkov. Ploskve morajo biti sklenjene z robovi, vse točke ploskve pa morajo ležati na isti ravnini. Koplanarnost točk se preverja tako, da se preverja vzporednost vseh normal ravnin, ki jih oklepajo sosednji robovi ploskve. Torej, kot med normalami mora biti 0° ali 180°, v vseh drugih primerih ploskev ni koplanarna. Pri numeričnem izračunu je seveda potrebno upoštevati toleranco kota 0.1°, drugače bi lahko prišlo do zapletov pri ploskvah, ki ne ležijo v glavnih ravninah koordinatnega sistema in so definirane z decimalnimi vrednostmi.
Slika 10 Preverjanje koplanarnosti ravnine
V slučaju, da sta sosednja robova vzporedna, je normala nedefinirana, zato se ta dva roba smatrata kot en sam rob.
Normala se izračuna z:
kot med dvema normalama pa:
Program omogoča tudi nastavitev enote dolžine koordinatnih osi, barvo koordinatnih osi, kot ene rotacije pogleda pri obračanju perspektive, velikost izpisa oglišč, robov in ploskev. Slednje lahko tudi poljubno vklapljamo in izklapljamo. Prav tako lahko skrijemo modele, da se ne izrisujejo, pri tem se zaslonske koordinate samodejno prilagodijo le modelom, ki so izrisani. Vsak model je izrisan s svojo barvo. Modele se po želji lahko tudi briše iz pomnilnika in namesto njih naložimo druge.
Slika 11 Primer brisanja modelov iz pomnilnika
Za brisanje pritisnemo tipko 'D'. Na zaslonu se izpišejo vsi komentarji naloženih modelov. Program zahteva navedbo vseh modelov, ki jih želimo izbrisati. V tem primeru želim izbrisati modela št. 1 in 3. Po brisanju se pojavi na ekranu Slika 12.
Za interaktivno obračanje modelov tiščimo pritisnjeno tipko za obračanje tipke od 1 do 6. Pri takem obračanju je procesor zelo obremenjen z grafičnim delom programa, ker so fortranove rutine za risanje zelo počasne. Zato je priporočljivo, da se izklopi označevanje točk, robov in ploskev. S tem dosežemo mehkejše obračanje modelov. Za izklop prikaza oznak služi rutina KONFIGURACIJA. Ko program teče, jo sprožimo s tipko 'K', na ekranu se izpiše:
Spreminjamo lahko dolžino osi, barvo osi, kot, za katerega se bodo zavrteli modeli pri enem koraku interaktivnega vrtenja, velikost izpisa črk, vklapljamo lahko prikaz točk, robov ter ploskev, izris normal na ravnine. Nastavimo lahko faktor perspektivnega prikaza fo in preklapljamo med perspektivo in ortogonalno aksonometrično projekcijo. Oznaka 'T' oz. 'F' je kratica za angleški TRUE oz. FALSE.
Po izklopu točk, robov, ploskev in normal se izrišejo le osnovne konture modelov:
Ko zaključimo s programom se vsi podatki o modelih, ki so v pomnilniku in vseh nastavitvah samodejno shranijo v datoteko z imenom delovni.prj. Ob ponovnem zagonu programa se ta datoteka samodejno naloži. Prav tako lahko kadarkoli med delovanjem programa shranimo vse nastavitve in modele v poljubno datoteko ali jo naložimo.
Pomanjkljivost programa je ta, da ne omogoča izrisa modelov na tiskalnik ali risalnik oz. ne omogoča izvoza datotek v standardnih formatih (npr. HGL, IGS, DXF). Prav tako ne omogoča združevanja dveh modelov v enega. To možnost bi lahko pričakovali pri volumskih modelirnikih.
Program je napisan je v jeziku F90, prevaja pa se lahko s prevajalnikom Fortran PowerStation 4.0. Izvorna koda je 32-bitna, zato potrebuje za delovanje Win95 ali WinNT.