Geometrijske lastnosti rastra

Seminar

FAKULTETA ZA STROJNISTVO V LJUBLJANI, April 1996

Avtorja:

Mentor: Leon Kos


Opomba: Program deluje le z hotJava ali Mozilla, verzija 2.01 ali visjo.
Izvorna koda.

Kazalo:

UVOD

Program Raster Calculator, napisan v programskem jeziku "JAVA", je nastal v laboratoriju LECAD pri predmetu POSTOPKI KONSTRUIRANJA. Namenjen je temu, da na osnovi predlozenega lika, ki je podan v datoteki v rasterski obliki, izracuna koordinate tezisca, glavne vztrajnostne momente, nagib glavnih vztrajnostnih osi in povrsino, nato pa na sliki danega lika se izrise osi, izpise rezultate ter narise histogram pogostosti uporabljenih barv na sliki.Lik oziroma slika je prikazana v polju tock na zaslonu (pixels).Vsaka tocka ima doloceno barvo, neka barva pa je v racunalniku dolocena z ustrezno stevilcno kodo od 0 (crna barva) do 255 (bela barva). Datoteka, napisana v dveh dimenzijah, na osnovi katere se prikaze slika, torej vsebuje mnozico stevilk, ki pomenijo barve; Branje datoteke zacne v zgornjem levem kotu in poteka po vrsticah (koordinata x).Koordinato y pomenijo stolpci, torej y tece pocasneje kot x. Program prepozna lik tako, da za izracun uposteva le kode, ki pomenijo belo barvo (255) in njihovo lego (trenutne koordinate x in y). Primer zacetka datoteke;
     P2
     # komentar
     sirina  visina
     stev. barve
P2 pomeni tip datoteke(tip pgm - portable grey map), s komentarjem povemo, kaj slika predstavlja, na mesti "sirina" in "visina" ter "stev. barve" pa vpisemo stevilke, ki ustrezno priredijo dolocene vrednosti.Kreiranje datotek iz ostalih formatov je mozno s programom "XVIEW".

UPORABA IN ZAGON PROGRAMA

Program zaganjamo s pomocjo interaktivnega okna "appletviewer" z gumbi, ravno tako na tem oknu dobimo izpisane rezultate, izris slike in osi ,ter izris histograma.

Ce hocemo dobiti zeljene rezultate, mora program najprej izvesti branje ze napisane datoteke. To naredimo s pritiskom na gumb "Read" in pocakamo, da se izrise ustrezna slika.Se pred tem pa v "padajocem menuju" izberemo ime datoteke, od koder naj se berejo podatki. Kot smo ze uvodoma omenili, program uposteva kot lik le bele tocke, torej bi morala biti slika crno-bela (podlaga-lik). Ponavadi pa ni tako, ampak je slika sestavljena iz vecih barv. Zato moramo dolocene barve spremeniti v belo, ostale pa v crno barvo. Ker so barve dolocene z stevilcnimi kodami, izberemo doloceno stevilko, ki pomeni mejo-vse barve, ki imajo enako ali manjso stevilcno koda predstavlja crno barvo-podloga, ostale pa belo-lik, stevilko vpisemo v ustrezno okence. Porazdelitev posameznih barv si lahko ogledamo na "histogramu" in tako lazje dolocimo zgoraj omenjeno mejo. Da se sprememba v crno oziroma belo dejansko izvede, pa uporabimo gumb "Trig". Pomembno je da ima lik, s katerim delamo, na sliki belo barvo, kar pa po izvedbi funkcije Trig ni nujno. Zato uporabimo gumb "Invert", da je lik dejansko bel. Preostane nam se racunanje, to pozenemo s pritiskom na gumb "Calc". Izpisejo se nam ustrezni rezultati in izrisejo osi (glavne vstrajnosne osi in koordinate tezisca.

Poleg navedenih gumbov imamo se gumba "Edge" in "URL". Pritisk na gumb "Edge" povzroci, da se izrisejo le robovi izbranega lika, notranjost je enaka barvi podlage.Gumb "URL" rabimo podobno kot "Read" za branje podatkov, vendar ne iz ze obstojecih datotek, ampak iz mreze; ime datoteke, ki jo klicemo, vpisemo v tekstovno polje poleg gumba "URL".

OBLIKOVANJE INTERAKTIVNEGA OKNA 'APPLETVIEWER'

Celotno okno je velikosti 400 tock po sirini in 400 tock po visini.Lego posameznih elementov (rezultati,histogram) razen gumbov dolocimo s koordinatami - oddaljenost v stevilu tock od izhodisca. Izhodisce predstavlja zgornji levi vogal, sirina se meri v desno, visina pa navzdol.

1. IZPIS REZULTATOV

Rezultate izpisujemo z ukazom g.drawString(___), ki ga v "Javi" uporabljamo za izpis simbolov. Znotraj oklepaja navedemo argumente, ki jih zelimo izpisati, ter navedemo zacetne koordinate izpisa. V nasem primeru se rezultati izpisujejo vsak v svojo vrstico; le-te so medsebojno locene za 14 tock.Primer:
      g.drawString("xt= "+xCOG,sx,sy);
Izracunani xCOG zelimo izpisati kot xt, sx in sy pa pomenijo referencne koordinate, ki jim predhodno dolocimo vrednosti. Za izpis naslednjega rezultata pod predhodnega naredimo podobno, le da koordinati sy pristejemo 14, itd.

2. PRIKAZ HISTOGRAMA IN OSI

Histogram je prikazan na podoben nacin kot rezultati, le da uporabimo za risanje ukaz g.drawLine(____). V oklepaju so koordinate dveh tock, med katerima naj se dolocena crta izrise.Na tak nacin risemo tudi osi.

3. POSTAVITEV GUMBOV

V jeziku "Java" obstaja vec funkcij za postavitev gumbov (buttons). V nasem primeru imamo gumbe in dve tekstovni polji (tekstfield) prikazane v dveh vrsticah, zato uporabimo za postavitev le-teh funkcijo "GridBagLayout", kjer pomenijo gumbi in tekstovna polja elemente, katerim lahko nastavimo razseznosti,lego,ipd. Primer izvrsilnega stavka za postavitev gumba v okviru funkcije GridBagLayout:
     makebutton("Calc",gridbag,z);
Dobimo gumb, na katerem pise "Calc", z pomeni prej definirano kontrolno spremenljivko .Da pa lahko s tem gumbom dejansko zazenemo nek podprogram, potrebujemo posebno "if" zanko z nizom ukazov, katera opravi ustrezne izracune, ali pa klice dolocen podprogram.Primer:
      if(label.equals("Calc")){
      calculate();
      return true;
     }
Ob pritisku na gumbek "Calc" se izvaja podprogram "public void calculate", ki racuna kot in vztrajnostne momente.

Razseznosti elementov so v programu nastavljene z ukazi, kot so:

      z.fill = GridBagConstraints.HORIZONTAL;
Pri tem postanejo komponente ravno toliko siroke, da po sirini ni vmesnega prostora med komponentami;
      z.weightx = 1.0;
Ukaz razsiri polje elementov do robu prikazovalnega obmocja.

IZRACUN

1. IZRACUN TEZISCNIH KOORDINAT xCOG in yCOG

Tezisce se izracuna po sledecih formulah:
                        sum(x*A)               sum(y*A)
                   xCOG=----------   ,   yCOG=----------
                         sum(a)                 sum(A)
Pri tem upostevamo, da je povrsina ene tocke enaka 1, zato pri izracunu program v "for" zanki le sesteva ustrezne koordinate posameznih tock;
                   xokn=+x;

                   yokn=+y;
Teziscne koordinate nato izracunamo izven zanke:
         
                   xCOG=xokn/stp;

                   yCOG=yokn/stp;
Povrsino lika nadomestimo z stevilom tock-pikslov stp, ki ga ravno tako dolocimo v zgoraj omenjeni "for" zanki.

2. IZRACUN VZTRAJNOSTNIH MOMENTOV

Za izracun glavnih vztrajnostnih momentov, tako kot tudi za dolocitev kota nagiba glavnih osi potrebujemo teziscne vztrajnostne momente, ki jih v programu izracunamo po naslednjih formulah:
                   Ix += ry*ry; 
                   Iy +=rx*rx;
                   Ixy+=rx*ry;

3. IZRACUN GLAVNIH VZTRAJNOSTNIH MOMENTOV IN KOTA ODKLONA OSI

Glavne vztrajnostne momente in kot odklona racunamo v programu po znanih formulah iz trdnosti:

                 alfa=(float)((Math.atan2((-2)*Ixy,(Ix-Iy)))/2);
                      
                 gl1=(float)((Ix+Iy)/2+Math.sqrt(((Ix-Iy)/2)*((Ix-Iy)/2)+Ixy*Ixy));

                 gl2=(float)((Ix+Iy)/2-Math.sqrt(((Ix-Iy)/2)*((Ix-Iy)/2)+Ixy*Ixy));          
Izracunane vrednosti je potrebno izpisati na "appletviewer", ravno tako izrisati osi.Osi glavnih vztrajnostnih momentov dolocimo na podlagi izracunanega kota alfa, ce vemo, da sta osi medsebojno pravokotni in da potekata skozi tezisce.V programu dolocimo podve tocki za vsako os, med katerimi se izriseta crti, ki predstavljata osi, na sledec nacin:
                 x1=(int)(xCOG+r*Math.cos(alfa)); 
                 y1=(int)(yCOG-r*Math.sin(alfa));
                 x2=(int)(xCOG-r*Math.cos(alfa));
                 y2=(int)(yCOG+r*Math.sin(alfa));
                 x3=(int)(xCOG-r*Math.sin(alfa));
                 y3=(int)(yCOG-r*Math.cos(alfa));
                 x4=(int)(xCOG+r*Math.sin(alfa));
                 y4=(int)(yCOG+r*Math.cos(alfa));