grafički prikaz podataka
TRANSCRIPT
Graficki prikaz podataka« Numericke metode »
Ivo Batistic
Fizicki odsjek, PMFSveucilište u Zagrebu
predavanja 2005/2006
Pregled predavanja
Graficke datoteke
Graficki paketi
Graficki paket DISLIN
MathGL biblioteka
Izrada animacija/kratkih filmova
Uporaba grafickih biblioteka
◮ Kada govorimo o grafickim bibliotekama misli se na zborkupodprograma i funkcija s kojima možemo stvoriti graficki prikazfunkcije ili nizova podataka bilo direktno na grafickom terminalu iliu nekoj datoteci, tipa slike (gif,tiff,jpeg,eps,. . . ) odnosno datotecinamijenjenoj pisacima (ps,hpgl,. . . ).
◮ Graficke datoteke tipa slika ili onih namijenjenih pisacima moguceje naknadno prikazati na ekranu (grafickom terminalu), ili ispisatina pisacu.
◮ Graficke je datoteke moguce i konvertirati jednu iz druge uzpomoc velike kolekcije alata koje inace postoje u svimoperacijskim sustavima.
Graficke datoteke
Postoji ogroman broj razlicitih vrsta grafickih datoteka. Ovje cemospomenuti samo neke od njih.
◮ GIF (Graphics Interchange Format) je jedan on najcešcih nacinacuvanja slika u digitalnom obliku na racunalu. U GIF datotecislika je prikazana dvodimenzionalnim nizom obojenih tockica.Postoji i animirani gif format za prikazivanje animacija.
◮ JPEG (jpg, Joint Photographic Experts Group) se prvenstvenokoristi za prikazivanje fotografija zbog mogucnosti sažimanjapodataka.
◮ TIFF (tif, Tag Image File Format) format najcešce se koristi koduredivanja dokumenata za tisak.
◮ PNG (Portable Network Graphics) format je stvoren u prvom reduda zamijeni GIF s kojim je bilo problema oko patentnih prava do2003.
Graficke datoteke
◮ PS (Postscript) je vrst programskog jezika za pisace. Inacetekstualna datoteka, koja sadrži ili dvodimenzionalni bitmapprikaz slike i/ili niz procedura i naredbi cije izvršavanje stvarasliku. Ima mogucnost skaliranja pri povecanju dimenzije slike.
◮ EPS (Encapsulated PostScript) sadrži reducirani skup postscriptnaredbi i namjenjen je prvenstveno za unos postscript slika udruge dokumenate.
◮ PDF (Portable Document Format) je format koji u današnjevrijeme služi za distribuciju dokumenata u digitalnom obliku.
◮ HPGL datoteka sadrži sliku napisanu jezikom namjenjen HPpisacima i ploterima.
◮ SVG (Scalable Vector Graphics) je tekstualna datoteka gdje jeslika opisana pomocu programskog jezika nalik na xml-tagove.(slicno html stranici na web-u).
Primjer - postscript datoteka
/Helvetica-Bold findfont30 scalefont setfont/oshow %stack: (string){ true charpath stroke } def/circleofF90{ 15 15 345{ gsaverotate 0 0 moveto( F90) oshowgrestore} for} def% -- Pocetak programa --250 400 translate.5 setlinewidthcircleofF900 0 moveto(Numericke Metode) true charpathgsave 1 setgray fill grestorestrokeshowpage
Graficki paketi
Postoji veci broj razlicitih grafickih paketa (biblioteka) namijenjenihfortranu, a tek jedan manji broj je nekomercijalan ili je slobodan zauporabu u nekomercijalnim aplikacijama.
◮ Primjeri iz ovog poglavlja koristiti ce paket DISLIN, koji je zanekomercijalne aplikacije slobodan, te postoji za vecinuoperacijskih sustava (UNIX, MS-dos, MS-Windows te linux).
◮ Web-stranica paketa je http://www.mps.mpg.de/dislin/ gdje jemoguce saznati više o paketu, te samu binarnu verziju bibliotekeskinuti za odgovarajuci operacijski sustav.
Graficki paket DISLINinstalacija i uporaba pod MS windowzima
◮ Raspakirati ZIP arhivu dl_90_sf.zip, te pokrenuti setup program.DISLIN paket bit ce instaliran na lokaciju C:\dislin.
◮ Programe treba prevoditi
ftn95 /mod_path c:\dislin exa_f90.f90slink exa_f90.obj c:\dislin\disf95.lib
◮ Kod izvodenja programa postaviti varijable:
PATH=c:\dislin\win;%PATH%SET DISLIN=c:\dislin
Varijablu PATH treba postaviti da bi se mogli koristiti neki pomocniprogrami koje DISLIN instalira (konverzija izmedu grafickih datoteka isl.). Osim tih programa, u imeniku gdje je dislin instaliran postoje podacio geografskim mapama. Putanja do tih podataka je poznata prekovarijable DISLIN.
Graficki paket DISLINinstalacija i uporaba pod Linuxom
◮ Raspakirati dislin-9.0.linux.tar.gz, te ga instalirati u /opt/dislin imenik:
prompt> tar xfz dislin-9.0.linux.tar.gzprompt> cd dislin-9.0prompt> export DISLIN=/opt/dislinprompt> ./INSTALL
◮ Prevesti modul dislin.f90, te program exa_f90.f90 (priloženi primjer)
prompt> cp /opt/dislin/g95/dislin.f90 .prompt> ifort -c dislin.f90prompt> cp /opt/dislin/examples/exa_f90.f90 .prompt> ifort exa_f90.f90 -o exa_f90.x -L/opt/dislin -ldislin
◮ Izvodenje
prompt> export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/dislinprompt> export DISLIN=/opt/dislinprompt> ./exa_f90.x
DISLIN
Nekoliko napomena:
Varijable PATH, DISLIN i LD_LIBRARY_PATH mogu se automatskipostaviti kod login-a na racunalo pomocu .bashrc datoteke za bashshell, odnosno .cshrc datoteke za tcsh (csh) shell. Nakon toga više ihnije potrebno postavljati ikada.
.bashrc dodatak:
export PATH=/opt/dislin/bin/:$PATHexport DISLIN=/opt/dislin/export LD_LIBRARY_PATH=/opt/dislin/:$LD_LIBRARY_PATH
.cshrc dodatak:
set path=(/opt/dislin/bin/ $path)setenv DISLIN /opt/dislin/setenv LD_LIBRARY_PATH "/opt/dislin/:$LD_LIBRARY_PATH "
Primjer
PROGRAM kratki_programREAL, DIMENSION(100) :: x,yINTEGER :: iDO i=1,100
x(i) = 0.0 + (i-1)*0.1y(i) = 2.0*SIN(x(i))
END DOCALL METAFL(’xwin’)CALL QPLOT(x,y,100)
END PROGRAM
0 1 2 3 4 5 6 7 8 9
-1.5
-1.0
-0.5
0.0
0.5
1.0
1.5
Vrijednost argumenta xwin upodprogramu METAFLznaci dagraficki prikaz treba ici nagraficki prozor racunala gdje seprogram izvršava. Ako biargument bio ’gif’ dobili bi gifdatoteku sa slikom, odnosnoako bi bio ’ps’ dobili bipostscript datoteku.
Ako se program izvršava naudaljenom ra cunalu, nije(uvijek) mogu ce dobitidirektni prikaz slike nalokalnog radnoj stanici. Tadatreba graficki prikaz spremati udatoteke.
Složeniji primjer
PROGRAM probaUSE DISLINIMPLICIT NONEINTEGER, PARAMETER :: n = 32INTEGER, DIMENSION (n) :: inray,ipray,icrayINTEGER :: iinray=0ipray=0icray=255CALL METAFL(’xwin’)CALL SETPAG(’da4p’)CALL DISINICALL PAGERACALL HWFONT()CALL SETVLT(’small’)CALL INTAX()CALL TICKS(1,’xy’)CALL FRAME(3)....
Složeniji primjer - nastavak
CALL AXSLEN(1600,2200)CALL AXSPOS(400,2700)CALL NAME(’Meridijani’,’X’)CALL NAME(’Geo. sirina’,’Y’)CALL TITLIN(’Karta Hrvatske’,3)CALL LABELS(’map’,’xy’)CALL PROJCT(’conf’)CALL GRAFMP(8.,25.,8.,2.,42.,48.,42.,2.)CALL GRIDMP(1,1)CALL SHDEUR(inray,ipray,icray,n)CALL HEIGHT(50)CALL TITLE()CALL DISFIN()
END PROGRAM
Primjer
14o E 16o E 18o EMeridijani
42o N
44o N
46o N
Geo
. si
rina
Karta Hrvatske
Izvodenjem programa dobiva sekarta Hrvatske. Program koristipodatke koji se nalaze u imenikugdje je DISLIN instaliran, pa jepotrebno imati shell varijabluDISLIN postavljenu.
DISLIN ima nekoliko podprogramaza brzi prikaz podataka, te nizdodatnih podprograma kojima sekontroliraju razni detalji na slici.
Primjer
PROGRAM povrsinaINTEGER, PARAMETER :: n = 41INTEGER :: i,jREAL, PARAMETER :: pi = 3.14159REAL, DIMENSION(n,n) :: zzREAL :: rrDO i=1,nDO j=1,n
rr = ((i-21)**2+(j-21)**2)zz(i,j) = COS(pi*SQRT(rr)/8.0)/(rr+10*10)
END DOEND DOCALL METAFL(’xwin’)CALL DISINICALL COLOR (’green’)CALL QPLSUR (zz,n,n)
END PROGRAM
Primjer
Primjer
PROGRAM povrsina_3dREAL :: pi = 3.14159REAL :: stepstep=2*pi/30.CALL METAFL(’xwin’)CALL SETPAG(’DA4P’)CALL DISINI()CALL PAGERA()CALL INTAX()CALL GRAF3D(-4.,4.,-4.,4., &
-4.,4.,-4.,4., &-3.,3.,-3.,4.)
CALL SURMSH(’ON’)CALL ZSCALE(-1.,1.)CALL SURFCP(fun,0.,2*pi,step,&
0.,2*pi,step)CALL DISFIN()
CONTAINS
FUNCTION fun(u,v,sw) RESULT (rr)REAL, INTENT(IN) :: u,vINTEGER, INTENT(IN) :: swREAL :: rrIF (sw == 1) THEN
rr = COS(u)*(3+COS(2*u)*COS(v))ELSE IF (sw == 2) THEN
rr = SIN(u)*(3+COS(2*u)*COS(v))ELSE IF (sw == 3) THEN
rr = COS(2*u)*SIN(v)END IF
END FUNCTIONEND PROGRAM
Primjer
MathGL
◮ web adresa: http://mathgl.sourceforge.net/◮ Instalacija: Postoje gotovi paketi za instalaciju pod MS
windozama & Linux◮ win32 (MinGW) MS windoze◮ DevPak za MS windoze za DevC++◮ RPM paketi za linux (Fetora, Suse, . . . )◮ DEB paketi za linux (Debian, Ubuntu, . . . )
◮ Biblioteka je napisana u C++, ali postoji mogucnost korištenja u◮ C◮ Fortran (f77)◮ Python◮ . . .
MathGL galerija
MathGL galerija
Strujanje nestlacive idealne tekucine u poluravnini prekoprepreke
Rješenje hidrodinamickih jed-nadžbi za 2-dim idealnu nestla-civu tekucinu koja se giba prekoprepreke u poluravnini:
vx(x ,y) = ℜ(x + iy − x0)
√
(x + iy − x0)2 + y20
vy(x ,y) = ℑ(x + iy − z0)
√
(x + iy − x0)2 + y20
Program 1. dio
PROGRAM Hidrodinamika
IMPLICIT NONE
INTEGER, PARAMETER :: br = 20INTEGER :: i,jREAL :: i0,j0REAL(kind=kind(1.0d0)):: jmxCOMPLEX :: aa,bb,ccREAL(kind=kind(1.0d0)), DIMENSION(br,br) :: jx,jy
! ==========
integer(kind=8) :: gr, mgl_create_graph_zbinteger(kind=8) :: ex,ey,ez,mgl_create_data_sizeexternal :: mgl_create_graph_zb,mgl_create_data_size
...
Program 2. dio
jx = 0.0D0; jy = 0.0D0; jj = 0.0D0i0 = 10.5; j0 = 10.5
DO i=1,brDO j=1,br
aa = CMPLX(i-i0,REAL(j))bb = aa/SQRT(aa**2+j0**2)IF (REAL(i) < i0) THEN
jx(i,j) = -REAL(bb)jy(i,j) = -SIGN(AIMAG(bb),i-i0)
ELSE IF (REAL(i) > i0) THENjx(i,j) = REAL(bb)jy(i,j) = -SIGN(AIMAG(bb),i-i0)
END IFEND DOEND DO
jmx = SQRT(MAXVAL(jx*jx + jy*jy))jx = jx/jmx; jy = jy/jmx
Program 3. dio
ex = mgl_create_data_size(br,br,1)ey = mgl_create_data_size(br,br,1)
call mgl_data_set_double(ex,jx,br,br,1)call mgl_data_set_double(ey,jy,br,br,1)
gr = mgl_create_graph_zb(600,400)call mgl_box(gr,1);CALL mgl_line (gr,0.0,-1.0,0.0,0.0,0.0,0.0,’r2’,4)call mgl_vect_2d(gr,ex,ey,”,0.0)call mgl_show_image(gr,”,0)! call mgl_write_jpg(gr,TRIM(’slika_strujnica.jpg’),0 )call mgl_delete_graph(gr)
call mgl_delete_data(ey)call mgl_delete_data(ex)
END PROGRAM Hidrodinamika
Strujanje nestlacive idealne tekucine u poluravnini prekoprepreke
MathGL - opce upute
◮ Podaci koji se crtaju spremaju se u objekt tipa mglData za koji serezervira memorija naredbom:
ex = mgl_create_data_size(br,br,1)
Nakon crtanja taj se prostor oslobada
call mgl_delete_data(ex)
◮ Podaci spremljeni u niz jx prebacuju se u objekt za koji smorezervirali memoriju:
call mgl_data_set_double(ex,jx,br,br,1)
Umjesto, toga podaci se mogu i direkno izracunati i spremiti urezerviranu memoriju iz izraza, pomocu naredbe:
call mgl_data_fill_eq(gr, ex, ’x*sin(2*pi*x)’,0)
◮ Kada su podaci sprtemljeni u objekt, mogu se crtati.
MathGL - opce upute
◮ Crtanje uvijek zapocinje naredbom:gr = mgl_create_graph_zb(600,400)što stvara sliku velicine 600x400 tockica. Ako se želi raditi postscriptslika, tada je crtanje potrebno zapoceti naredbom:gr = mgl_create_graph_ps(600,400)Na kraju završetka crtanja porebno je osloboditi memoriju rezerviranu zacrtanje naredbom:call mgl_delete_graph(gr)
◮ Svi oni podaci kojui su spremljeni u objekt mglData sada se moguprikazivati na slici koristeci mnošvo raznih naredbi za crtanje:....call mgl_vect_2d(gr,ex,ey,’’,0.0).....
◮ Na kraju nacrtano se može prikazati na ekranucall mgl_show_image(gr,’’,0)ili/i upisati u datoteke:call mgl_write_jpg(gr,TRIM(’22-strujnice.jpg’),0)!call mgl_write_eps(gr,TRIM(’22-strujnice.eps’),0)
Izrada animacija/kratkih filmova
Više slicica koje prikazuju istu scenu ali s vremenskim pomakom možese objediniti u kratki film/animaciju.
Postoji veliki broj nacina digitalnog zapisivanja animacija.
Animirani GIF Gif-slicice pohranjuju se jedna iza druge u jednuzajednicku datoteku koja predstavlja animirani gif.
MPEG-formati Slicice se zapisuju u sažetom obliku, npr. zapisuju sesamo razlike izmedu slicica u razlicitim vremenskimtrenucima.Postoji veliki broj razlicitih nacina kompresije:
MPEG-1 Datoteke imaju ove nastavke: .mpg,.mpeg, .mp1, .m1v, .mpv, . . .(MP3-audio datoteke = MPEG-1 Layer III)
MPEG-2 DVD filmovi.MPEG-4 DivX, xvid, quicktime filmovi
Animirani GIF
◮ Za windoze postoji veliki broj razlicitih alata koji se mogu naci nainternetu.
◮ Na linux/unix/windouz racunalima može se rabiti programconvert koji je dio paketa razlicitih video aplikacijaImageMagick(http://www.imagemagick.org/)
Ako u imeniku postoji veliki broj slicica koji opisuju vremenski slijedneke pojave/dogadaja, npr: slika00.jpg, slika01.jpg, slika02.jpg, . . .animirani gif se može napraviti:
prompt> convert slika*.jpg dogadaj.gif
Animacija se može promatrati pomocu web-preglednika ako seanimirani gif stavi kao dio web-stranice,ili pomocu odgovarajuceg programa, npr. animate programa iz istoggrafickog paketa, ImageMagick :
prompt> animate dogadaj.gif
Primjer
Program hipnoUSE DISLINIMPLICIT NONECHARACTER(LEN=30) :: fileCHARACTER(LEN=2) :: cbrojREAL :: pomakREAL :: piINTEGER :: j,k
pi = 4.0*atan(1.0)k=40
DO j=0,k-1WRITE(cbroj,’(i2.2)’) jfile = ’hipno’//trim(cbroj)//’.png’pomak = pi*(j-1.0)/kCALL SETFIL(TRIM(file))CALL spirale(’PNG’,pomak)
END DOEnd program hipno
◮ Podprogram spiralecrta dvije spirale.
◮ Generirana slika seupisuje u datoteku cije jeime u varijabli file . Tipdatoteke je PNG.
◮ Prodprogram spiralepoziva se 40 puta, isvaki put spirale suzarotirane za dodatni kut(pi/40 rad.), a slika seupisuje u novu datoteku.
Primjer - nastavak
Subroutine spirale (datoteka,kut)CHARACTER(LEN=*),INTENT(IN)::datotekaREAL, INTENT(IN) :: kutINTEGER, PARAMETER :: n=300,n1=600REAL,DIMENSION(n) :: r,psiREAL,DIMENSION(n1) :: r2,psi2INTEGER :: i,n2REAL :: pi!pi = 4.0*atan(1.0)CALL page(2400,1800)CALL winsiz(640,480)CALL metafl(TRIM(datoteka))CALL disiniCALL nografCALL grafp(1.01,0., 1., 0., 360.)DO i=1,n
r(i) = 1.00psi(i)=2*pi*(i-1.0)/(n-1.0)
END DOCALL curve(r,psi,n)
◮ Svaka slika ima640x480 tockica
◮ Spirale su obrubljenekrugom nacrtanimpozivom potprogramacurve
Primjer - nastavak
Subroutine spirale (datoteka,kut)...! 1. spiralaDO i=1,n
r(i)= MIN((i-1.0)/(n-1.0),1.0)psi(i)=4*pi*(i-1.0)/(n-1.0) + kut
END DODO i=1,n1
r2(i)= MIN((i-1.0)/(n-1.0),1.0)psi2(i)=4*pi*(i-1.0)/(n-1.0)-0.5*pi+kutn2 = iIF (psi2(i) >= psi(n)) EXIT
END DOCALL shdpat(16)CALL shdcrv(r,psi,n,r2,psi2,n2)! 2. spirala...! krajCALL endgrfCALL disfinEnd subroutine spirale
◮ Spirala se crta tako dase popunjava prostorizmedu dvaju krivulja, r ir2 s bijelom bojom.
◮ Popunjavanje bojomizmedu krivuljapostignuto jepotprogramom shdcrv .
Primjer - nastavak
Rezultat izvodenja programa su ovakve slike, spremljene u datotekehipno00.png, hipno01.png, . . . hipno39.png
Animacije
◮ Animirani gif dobivamo:
prompt> convert hipno*.png hipno_animirani.gif
◮ Alati za izradu MPEG-1 animacija je mjpeg tools .Linux/unix/wondows verzije programa te dokumentacija dostupnesu s web-adrese: http://mjpeg.sourceforge.net/.
◮ Alat za izradu svih mogucih vrsta animacija (npr. MPEG-1,MPEG-4, Flash video - YouTube, . . . ) je mencoder .Linux/unix/wondows verzije programa te dokumentacija dostupnesu s web-adrese: http://www.mplayerhq.hu/.
MPEG TOOLs - primjer uporabe
◮ Konverzija PNG datoteka u JPG:
prompt> for i in *.png> do> convert $i ‘basename $i .png‘.jpg> done
◮ Izgradnja MPEG-1 animacije:
prompt> jpeg2yuv -f 25 -l 20 -j hipno%02d.jpg -I p \
| mpeg2enc -o hipno_mpeg2enc.m2v
Cijeli film se 20 puta ponavlja(malo slovo L).
◮ Prikazivanje animacije
prompt> smplayer hipno_mpeg2enc.m2v
mencoder - primjer uporabe
Primjeri uporabe mencoder programa:
◮ MPEG-1 animacija
prompt> mencoder "mf://*.png" -mf fps=25 -ovc lavc \-of mpeg -lavcopts vcodec=mpeg1video -o hipno_mencoder.m2v
◮ MPEG-4 animacija
prompt> mencoder "mf://*.png" -mf fps=25 -ovc lavc \-of avi -lavcopts vcodec=mpeg4 -o hipno_mencoder.avi
◮ Macromedia Flash Video (pogodno za YouTube)
prompt> mencoder "mf://*.png" -mf fps=25 -ovc lavc \-of lavf -lavcopts vcodec=flv -o hipno_mencoder.flv
Mandelbrotov skup
U matematici se mogu promatrati nelinearna preslikavanja tipa:
z → z2 + c
gdje je c neki kompleksni broj (x ,y), a pocetna vrijednost zakompleksni broj z je nula. U tom preslikavanju, apsolutna vrijednostbroja z ostaje konacna ili divergira, što ovisi o broju c. Takoder, brzinadivergencije ovisna je o c.
Mandelbrotov skup
Tocke (x ,y), u 2D ravnini koje predstavljaju kompleksni broj c,možemo razlicito obojati ovisno o brzini divergencije navedenogpreslikavanja. Kao rezultat se dobiva faktalni objekt:
Mandelbrotov skup
Svojstvo fraktalnih objekata je da uvecavanjem skale, uocavaju semanji detalji koji su posve slicni onim vecim objektima.
Program u primjerima 08-mandelbrot.f90 crta Mandelbrotov skup.Program traži tri argumenta, dvije koordinate tocke koja prestavljasredište kvadrata te kao treci argument linearnu dimenziju kvadrata.Kao rezulat se dobiva slika koja predstavlja brzinu divergencije tockicaunutar kvadrata.
Program iz primjera 09-mandelbrot-zoom.f90 radi slicice zumiranjaoko neke tocke u 2D ravnini. Takoder zahtijeva 3 argumenta, 2koordinate tocke zumiranja, te broj slicica. Slike se naknadno moguobjediniti u animaciju.
Mandelbrotov skup
Rezultat velikog broja zumiranja oko tocke(0.001643721971153,0.822467633298876).