DISLIN-aliohjelmakirjaston käytöstä Numeerisen laskennan peruskurssi
DISLIN-aliohjelmakirjasto Aliohjelmakirjasto graafiseen tulostamiseen. 2D- ja 3D-kuvat erikoiskuvat: pylväsdiagrammit, sektoridiagrammit, tasa-arvokäyrät, vektorit, ellipsit, monikulmiot jne. Useille ohjelmointikielille: Fortran, C, Java, Perl, Python ja DISGCL. Useita käyttöjärjestelmiä: UNIX, Linux, MS-DOS, Windows, FreeBSD, OpenVMS. Oulussa käytössä v. 10.3.6 usage dislin dishlp rutiini = tietoa rutiinista disman = DISLIN-manuaali Dokumentit esim: http://www.dislin.de
Käytön perusteet Piirtäminen tapahtuu suorakulmaiselle alueelle eli sivulle (page). Kaikki sivurajat ylittävä grafiikka jää piirtämättä. DISLIN-aliohjelmat käyttävät kolmenlaisia koordinaatteja: kuvakoordinaatteja (100 pistettä/cm) kuvan fyysisen origon suhteen. Oletuksena origo on kuva-alueen vasen ylänurkka. suhteellisia koordinaatteja (user coordinates) käyttäjän määrittelemän akseliston suhteen absoluuttisia 3D-koordinaatteja 3D-piirtämisessä Lähes aina käytetään suhteellisia koordinaatteja. Aliohjelmat: SETPAG (COPT) PAGE (NXP, NYP)
Tulostuksen muoto Tiedostoon tulostus vektoriformaatissa: GKSLIN, CGM, PS, EPS, PDF, HPGL, WMF, SVG Tiedostoon tulostus kuvaformaatissa: TIFF, GIF, PNG, PPM, BMP Näytölle tulostaminen: CONS, XWIN Tulostusta kontrolloidaan aliohjelmilla: METAFL(Format) ja SETFIL(Filename)
DISLIN tasojärjestelmä Suurinta osaa DISLIN-aliohjelmista voidaan kutsua missä tahansa vaiheessa ohjelman suoritusta. Tietyt aliohjelmat käyttävät muiden aliohjelmien määräämiä parametreja, joten niitä täytyy kutsua tietyssä järjestyksessä. Tätä varten DISLIN käyttää tasojarjestelmää (levels), jonka määräämässä järjestyksessä aliohjelmia kutsutaan. Tasot ovat Taso 0: Ennen DISLINin alustusta (DISINI -kutsu ) tai piirtämisen loputtua DISFIN-kutsun jälkeen. Taso 1: Alustuksen (DISINI) jälkeen tai akseliston poiston jälkeen (ENDGRF). Taso 2: 2D akseliston alustuksen (GRAF-kutsu) jälkeen. Taso 3: 3D akseliston alustuksen (GRAF3- tai GRAF3D-kutsu) jälkeen.
Ohjelman rakenne Kun piirrettävä data on hankittu/laskettu, tulisi ohjelman noudattaa seuraavaa rakennetta: (1) Sivukoon, tulostustiedoston tyypin ja tiedoston nimen asetus (SETPAG, PAGE, METAFL, SETFIL). (2) DISLINin alustus (DISINI). Siirrytään tasolle 1. (3) Parametrien asetus. (4) Akseliston piirtäminen (GRAF, POLAR, GRAFMP, GRAF3, GRAF3D). Siirrytään tasolle 2 tai 3. (5) Piirretään otsikko (TITLE). (6) Piirtetään data (CURVE, CURVE3, CURV3D, BARS, PIEGRF, SURFCE, CONTUR) (7) Akseliston ja DISLINin lopettaminen (DISFIN). Palataan tasolle 0.
Tekstin ja numeroiden piirtäminen MESSAG (CSTR, NX, NY) NUMBER (X, NDEZ, NX, NY) SYMBOL (NSYM, NX, NY) HEIGHT (NH) ANGLE (NANG) COMPLX, SIMPLX, DUPLX, SERIF, HELVE, HELVES PSFONT (CFNT) BMPFNT (CFNT) WINFNT (CFNT) X11FNT (CFONT, COPT) plots text plots a number plots symbols sets the character height defines the character angle define vector fonts defines PostScript fonts defines a bitmap font defines a Windows font defines an X11 font
2D akselit ja otsikot GRAF (XA, XE, XOR, XSTP,YA, YE, YOR, YSTP) POLAR (XE, XOR, XSTP, YOR, YSTP) TITLE () AXSPOS (NXA, NYA) AXSLEN (NXL, NYL) TICKS (N, CAX) LABELS (CSTR, CAX) NAME (CSTR, CAX) AXSSCL (COPT, CAX) TITLIN (CSTR, I) plots an axis system plots a polar axis system plots a title defines the position defines axis lengths sets the number of ticks defines axis labels sets axis titles defines the axis scaling defines text for titles
2D kuvaajan piirto CURVE (XRAY, YRAY, N) INCMRK (NMRK) MARKER (NHSYMB) HSYMBL (NH) POLCRV (COPT) THKCRV (N) CHNCRV (COPT) LINTYP (N) COLOR (COPT) plots curves selects symbols or lines defines a symbol sets the size of symbols sets an interpolation method defines curve thickness sets attributes that will be automatically changed by CURVE defines line styles sets a colour
Esimerkki: 2D viivakuva PROGRAM pallo!! Ohjelma piirtää pallon korkeuden ajan funktiona.! USE dislin REAL :: x(10) = (/ 0.5, 12., 19., 25., 37., 50., 62., 75., 87., 99. /), & y(10) = (/ 3., 55., 76., 104., 93., 0., 338., 196., 248., 437. /) CHARACTER(30) :: cstr = "Pallon korkeus ajan suhteen" CALL metafl("ps") CALL setpag("da4p") CALL disini() CALL titlin(cstr, 4) CALL name("aika startista (min)", "X") CALL name("korkeus (m)","y") CALL graf(0., 100., 0., 20., 0., 600., 0., 100.) CALL title() CALL curve(x, y, 10) CALL endgrf() CALL disfin() END PROGRAM pallo
Esimerkki: 2D viivakuva REAL-muuttujat ovat yksinkertaista tarkkuutta (single precision) Kääntäminen ja linkkaaminen tapahtuu komennolla f90link -a pallo. Ohjelman tekemää PostScript-tiedostoa voi katsoa esimerkiksi ghostview-ohjelmalla tai evince-ohjelmalla.
3D grafiikka 3D-objektit täytyy piirtää kolmiulotteisen laatikon sisällä, jonka sivujen suhteet voi tarvittaessa määritellä rutiinilla AXIS3D. Oletuksena 3D-laatikon kaikkien särmien pituus on 2. 3D-laatikon avulla saadaan käyttöön absoluuttiset 3D-koordinaatit, joiden origona on 3D-laatikon keskipiste. Laatikon sisälle piirretyn grafiikan DISLIN-projisoi 2D-alueeseen ja katselukulman voi haluttaessa valita komennolla VIEW3D. Käyttäjän on määriteltävä 3D-akselisto aliohjelmalla GRAF3D, joka siirtää DISLINin tasolle 3.
3D grafiikka Kolmiulotteinen käyrä tai pinta voidaan piirtää: taulukoitujen x-, y- ja z-koordinaattien avulla jonkin funktion z = f (x, y) avulla matriisin Z avulla johon on laskettu jonkin funktion f (x, y) arvoja funktiosta voidaan piirtää tasa-arvokäyrät (contours) eli 2D-kuva. 2D-kuva voidaan projisoida 3D-akseliston halutulle tasolle: GRFINI palauttaa tasolle 1 piirretään 2D-kuva GRFFIN siirrytään takaisin tasolle 3
3D akselistot GRAF3D (XA, XE, XOR, XSTP, YA, YE, YOR, YSTP,ZA, ZE, ZOR, ZSTP) GRID3D (NX, NY, COPT) AXIS3D (XLEN, YLEN, ZLEN) VIEW3D (XVU, YVU, ZVU, COPT) VFOC3D (XFOC, YFOC, ZFOC,COPT) VUP3D (ANG) ANG3D (ANG) plots an axis system plots a grid in the 3-D box defines the lengths of 3-D box sets the viewpoint defines the focus point defines the rotation of the camera around the viewing axis specifies the field of view of the lens
3D kuvat Pintakuva: CURV3D (XRAY, YRAY, ZRAY, N) SURFCE (XRAY, N, YRAY, M, ZMAT) SURFUN (ZFUN, IXP, XDEL, IYP, YDEL) plots curves plots a surface grid of a matrix plots a surface grid of a function Tasa-arvopinta: CONTUR (XRAY, N, YRAY, M, ZMAT, ZLEV) CONMAT (ZMAT, N, M, ZLEV) LABELS (COPT, CONTUR) plots contours of the function Z=F(X,Y) plots contours defines labels for contours
Quickplots DISLIN tarjoaa myös joitakin ns. Quickplot-rutiineja (7 kpl), joiden avulla voidaan data piirtää yhdellä aliohjelmakutsulla, jolloin DISLIN huolehtii esim. akseleiden skaalauksesta. QPLOT yhdistää datapisteet eli piirtää yksinkertaisen 2D-käyrän QPLSUR piirtää matriisista pintakuvan QPLCON piirtää matriisin perusteella tasa-arvokäyräkuvan Quickplot-aliohjelmia voidaan käyttää yksinkertaisissa datan visualisointitehtävissä. Jos halutaan määritellä akselistoja itse, piirtää samalle sivulle useampia kuvia, piirtää samaan akselistoon useita datajoukkoja tms., niin Quickplot-aliohjelmat eivät ole käyttökelpoisia.
Harjoitustehtäviä Tehtävissä mainitut lähdekoodit ja datatiedostot ovat kopioitavissa hakemistosta ~/ejl/matk/dislin/koodit 1. Tutustu ohjelmaan pallo.f90, joka piirtää yksinkertaisen 2D-käyrän. Tee ohjelma pallo_qplot.f90, joka käyttää quickplot-rutiineja. 2. Ohjelma pns_sovite.f90 piirtää pienimmän neliösumman sovitteen sovite.dat eräälle mittausdatalle pisteet.dat. Miksi tässä tehtävässä ei voida käyttää quickplot-aliohjelmia (pns_qplot.f90) tai se ei ole ainakaan järkevää? 3. Tutustu ohjelmaan interp_piirto.f90, jonka avulla voidaan piirtää alla olevan taulukon funktiolle tehdyn interpolaatin kuvaaja. Syöte on tiedostossa interpolointi.dat ja interp_piirto.dat. x i 0.0 0.1 0.3 0.4 0.5 0.7 1.0 f i 0.90 0.85 0.12 0.05 0.05 0.20 1.0
4. Tutustu ohjelmaan pinta.f90, joka piirtää funktion f (r) = cos r 0.2r 2 + 1.0, r = x 2 + y 2 kuvaajan. Piirrä sama kuva myös sopivalla quickplot-aliohjelmalla (pinta_qplot.f90). Piirrä pinnan tasa-arvokäyrät sopivalla quickplot-aliohjelmalla (tasa_arvo_qplot). 5. Tutkitaan funktiota f (x, y) = sin(πx) sin(πxy). Ohjelma tasa.f90 piirtää samalle sivulle funktion f pintakuvan, tasa-arvokäyrän sekä pintakuvan ja tasa-arvokäyrän samaan 3D-laatikkoon. Kuinka voit valita, mille 3D-laatikon tasolle 2D-kuva projisoidaan?