Avtorja:
P2 # komentar sirina visina stev. barveP2 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".
Razseznosti elementov so v programu nastavljene z ukazi, kot so:
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.
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));