5. peatόkk Graafika
Viiendas peatükis käsitleme põhjalikumalt graafikat. Juhendi piiratud maht ei võimalda anda sellest teemast täiesti ammendavat ülevaadet, seetõttu on materjali esitatud valikuliselt, eelistades tähtsamat ja kergemini mõistetavat.

§1. KAHEMÕÕTMELINE GRAAFIKA

1.1. Primitiivid

Ühe olulise osa kõigist Mathematica joonistest moodustavad funktsioonide graafikud. Graafikute kujundamist tutvustasime lühidalt eelmises peatükis. Teine liik jooniseid on sellised, kus joonis koostatakse üksikutest objektidest. Mõnes mõttes meenutab see graafikaprogrammi kirjutamist näiteks Basic’us, süntaks on muidugi täiesti erinev. Mathematica joonise tegemisel saab kasutada erinevaid objekte (näiteks punkt, sirglõik, ring), mida nimetatakse graafika primitiivideks (graphics primitives). Tuleb koostada graafikaavaldis, milles loetletakse kõik joonisel olevad primtiivid koos oma koordinaatidega.
Kahemõõtmeliste jooniste korral saab kasutada järgmisi primitiive:

    Point[{x, y}] — Punkt koordinaatidega (x; y).
    Line[{{x1, y1}, {x2, y2},…}] — Murdjoon läbi punktide (x1; y1), (x2; y2), … .
    Polygon[{{x1, y1}, {x2, y2},…}] — Hulknurk tippudega (x1; y1), (x2; y2), … .
    Rectangle[{x1, y1}, {x2, y2}] — Ristkülik vastastippudega (x1; y1) ja (x2; y2).
    Circle[{x, y}, r] — Ringjoon keskpunktiga (x; y) ja raadiusega r.
    Disk[{x, y}, r] — Ring keskpunktiga (x; y) ja raadiusega r.
    Raster[maatriks] — Halltoonides raster e. ruudukeste masiiv.
    RasterArray[maatriks] — Värviline raster.
    Text[avaldis, {x, y}] — Teksti kirjutamine joonisele.
    PostScript[„string1”, „string2”,…] — PostScripti koodi kasutamine.

Esimesed kuus primitiivi on suhteliselt lihtsad ja toodud selgitustele on nende korral väga vähe lisada. Seetõttu peaks nende kasutamine olema arusaadav järgmises punktis toodud näidete abil. Rastritest ja tekstist räägime edaspidi pikemalt, PostScripti koodi tööpõhimõtteid aga antud juhendis selgitama ei hakkaks.

Kahemõõtemelise joonise jaoks koostatakse graafikaavaldis käsuga Graphics, mille üldkuju on:
Graphics[{primitiiv1, primitiiv2, …}] See korraldus teostab kõik vajalikud arvutused, kuid ei too joonist ekraanile. Et tulemust näha, läheb lisaks tarvis käsku Show. Kuidas seda konkreetselt teha, sellest allpool. Käsuga Graphics saab kasutada suuremat osa Plot-käsu juures toodud parameetritest. Erandiks on PlotStyle, PlotPoints ja veel mõned ainult graafiku joonestamisel mõtet omavad parameetrid.

1.2. Näiteid primitiivide kasutamisest

Näide 1. Joonestame ringjoone keskpunktiga (0; 0) ja raadiusega 2.
Kui primitiive on rohkem kui üks, tuleb nad esitada loendina, s. t. primitiivide loetelu paigutatakse loogelistesse sulgudesse ja nad eraldatakse üksteisest komadega. Üheainsa primitiivi korral võib aga sulud ära jätta.
    In[1]:=   Graphics[Circle[{0,0},2]]
    Out[1]=  -Graphics-
Väljundreale trükitud sõna -Graphics- näitab, et koostati mingi kahemõõtmeline joonis. Joonise ekraanile toomiseks peame väljundile rakendama korraldust Show. Arvestame, et Mathematica püüab anda kõigile joonestele kuldlõikes ristküliku kuju, joonist vajaduse järgi ühes suunas kokku surudes ja teises välja venitades. Loomuliku joonise saamiseks tuleks määrata parameetri AspectRatio väärtuseks Automatic. Pole oluline, kas parameeter AspectRatio kirjutada käsu Graphics juurde või käsu Show juurde.
    In[2]:=  Show[%1,AspectRatio->Automatic]

    Out[2]=  -Graphics-
Joonis kuvatakse kohe sisendrea järele, väljundreale aga trükitakse ainult sõna Graphics, sest väljundiks on joonist kirjeldav graafikaavaldis, mitte joonis ise. Ruumi kokkuhoiu huvides on käesolevas juhendis joonistel väljundrida enamasti trükkimata jäetud.

Näide 2. Joonestame 10 ringjoont, mille raadiused on 1, 2, … , 10 ja keskpunktid vastavalt (1; 0), (2; 0), … , (10; 0). Ringjoonte loendi koostame käsu Table abil. Ringjoonte keskpunkt ja raadius määratakse muutuja i abil, mis omandab väärtusi 1, 2, … , 10.
    In[3]:=   Table[Circle[{i,0},i],{i,0,10}]
    Out[3]=  {Circle[{1, 0}, 1], Circle[{2, 0}, 2],
            Circle[{3, 0}, 3], Circle[{4, 0}, 4],
            Circle[{5, 0}, 5], Circle[{6, 0}, 6],
            Circle[{7, 0}, 7], Circle[{8, 0}, 8],
            Circle[{9, 0}, 9], Circle[{10, 0}, 10]}

In[4]:=  Show[Graphics[%3], AspectRatio->Automatic]

Näide 3. Kujundame punktidest siinusfunktsiooni graafiku. Koostame käsu Table abil punktide loendi ja anname talle nimeks pts (lühend inglisekeelsest sõnast points, sageli kasutatav muutujanimi). Muutuja x, mis on punkti x-koordinaadiks, omandab väärtusi 0; 0,2; 0,4; … .
    In[5]:=  pts = Table[ Point[{x,Sin[x]}],
             {x, 0, 2 Pi, 0.2 }];
Kuna eelmine rida lõppes semikooloniga, siis punktide loendit ekraanile ei trükitud. Et tulemusest ettekujutust saada, küsime loendi nelja esimese elemendi väärtust.
    In[6]:=  pts[[{1,2,3,4}]]
    Out[6]= {Point[{0, 0}], Point[{0.2, 0.198669}],
           Point[{0.4, 0.389418}],
           Point[{0.6, 0.564642}]}

    In[7]:=  Show[ Graphics[pts],
            Axes->True,
            AspectRatio->Automatic]

Näide 4. Teame, et väljend Circle[{x,y},r] annab ringjoone keskpunktiga (x, y) ja raadiusega r. Käsuga Circle saab joonestada ka ellipseid ja ringjoonte ning ellipsite kaari.

Circle[{x, y}, {a, b}] Ellips keskpunktiga (x; y) ning pooltelgedega a ja b.
Circle[{x, y}, r, {a , b }] Ringjoone kaar, mille algnurk on a ja lõppnurk b . Nurgad a ja b esitatakse radiaanides. Nurki mõõdetakse x-telje positiivsest suunast vastupäeva.
Circle[{x, y}, {a, b}, {a , b }] Nurkade a ja b vahele jääv ellipsi kaar.
Analoogiliselt primitiiviga Circle saab primitiiviga Disk joonestada seest värvitud ellipseid ja ringide ning ellipsite sektoreid.

Joonestame 15 ellipsit, millel on ühine keskpunkt, kuid pooltelgede pikkused on erinevad. Olgu esimese pooltelje pikkused 1, 2, … , 15 ja teise pooltelje pikkused vastavalt 15, 14, … , 1.
    In[8]:=  Table[ Circle[{0,0},{i,16-i}], {i,1,15}];
    In[9]:=  Show[Graphics[%8],AspectRatio->Automatic]

Saab tõestada, et selle ellipsite parve mähisjooneks on astroid.

Näide 5. Joonestame korrapärase viisnurga. Arvutame viisurga tippude koordinaadid, lähtudes ringjoone parameetrilistest võrranditest x = sin t, y = cos t, kui t muutub sammuga 2p /5. Et saada kinnist murdjoont, peab punktide loendi viimane element olema sama, mis esimene element.
    In[10]:=  pts = Table[{N[Sin[t]],N[Cos[t]]},
            {t,0,2 Pi,2 Pi/5}]
    Out[10]= {{0, 1.}, {0.951057, 0.309017},
            {0.587785, -0.809017}, {-0.587785, -0.809017},
            {-0.951057, 0.309017}, {0, 1.}}

    In[11]:=  Show[ Graphics[Line[pts],
               AspectRatio->Automatic]]

Muudame punktide järjekorda.
    In[12]:=  pts1 = pts[[{1,3,5,2,4,6}]]
    Out[12]=  {{0, 1.}, {0.587785, -0.809017},
             {-0.951057, 0.309017}, {0.951057, 0.309017},
             {-0.587785, -0.809017}, {0, 1.}}
    In[13]:=  Show[Graphics[Line[pts1],
             AspectRatio->Automatic]]

Joonestame loendite pts ja pts1 abil kaks hulknurka.
    In[14]:=  Show[ Graphics[Polygon[pts],
              AspectRatio->Automatic]]

    In[15]:=  Show[ Graphics[Polygon[pts1],
             AspectRatio->Automatic]]

1.3. Teksti kirjutamine joonisele

Mathematica joonisele saab lisada ka teksti, kasutades vastavat graafika primitiivi.
Text[avaldis, {x, y}] Lisab joonisele avaldisega määratud teksti. Punkt (x; y) määrab teksti keskpunkti asukoha. Kui avaldis asetada jutumärkidesse, siis käsitletakse teda stringina ja trükitakse joonisele täht-tähelt nii, nagu sisendreal kirjas on. Kui jutumärke ei ole, trükitakse avaldis joonisele nii, nagu väljundreale. See tähendab, et muutujate nimed asendatakse nende väärtustega, harilikud murrud kirjutatakse murrujoone abil ja astendaja tõstetakse põhireast kõrgemale.

Näide 6. Kirjutame joonisele teksti "Sin[x]/(x+1)" ja seejärel võrdluseks sama teksti ilma jutumärkideta.
    In[16]:=  Show[Graphics[{Text["Sin[x]/(1+x)",{1,2}],
                          Text[ Sin[x]/(1+x) ,{1,1}]},
                     Axes->True,
                     PlotRange->{0,3} ]]

Kirja fonti ja suurust on võimalik muuta korraldusega FontForm.
Text[FontForm[avaldis, {"font", suurus}], {x, y}] Määratud kirjasuurus säilib joonise suurendamisel ja vähendamisel, s. t. et teksti suurus ei muutu proportsionaalselt joonise ülejäänud mõõtmetega. Kui tekst ei mahu joonisele ära, aitab mõnikord joonise suurendamine (hiirega). Teine võimalus on vähendada kirja suurust.
Mathematica verisiooni 2.2 korral ei ole võimalik kasutada neid fonte, mille nimetus koosneb mitmest sõnast, näiteks Monotype Corsiva, Century Gothic. Mõnede fontide (Times, Helvetica, Courier) korral saab kasutada kaldkirja ja rasvast kirja. Selleks tuleb fondi nimi esitada kujul "nimi-Bold", "nimi-Italic" või "nimi-BoldItalic".

Näide 7.
    In[17]:=  Show[ Graphics[{
          Text[FontForm[ "See on Frankensteini font", {"Frankenstein",12}],{0,1}],
          Text[FontForm[ "aga see Timesi kursiiv", {"Times-Italic",12}],{0,-1}]},
           Axes->True,
           PlotRange->{-2,2}]]

1.4. Direktiivid

Direktiivide (directives) abil saab täpsustada eraldi iga üksiku graafikaprimitiivi omadusi. Direktiivide abil on võimalik muuta näiteks objekti värvi, joonete jämedust jms. Kahemõõtmelises graafikas on kasutusel järgmised direktiivid:

    GrayLevel[g] — Objekti värv, määratakse hallskaalas.
    RGBColor[r, g, b] — Värv, määratakse RGB-värvimudeli alusel.
    CMYKColor[c, m, y, k] — Värv, määratakse CMYK-värvimudeli alusel.
    Hue[h], aga ka Hue[h, s, b] — Värv, määratakse HSB-värvimudeli alusel.
    Dashing[{d1, d2,…}] — Kriipsjoon, pikkused antakse suhtelistes ühikutes.
    AbsoluteDashing[{d1, d2,…}] — Kriipsjoon, kasutatakse absoluutset pikkusühikut.
    Thickness[d] — Joone jämedus suhtelisestes ühikutes.
    AbsoluteThickness[d] — Joone jämedus absoluutsetes ühikutes.
    PointSize[s] — Punkti raadius suhtelistes ühikutes.
    AbsolutePointSize[s] — Punkti raadius absoluutsetes ühikutes.

Direktiivid tuleb loetleda enne primitiive, millele neid rakendada tahetakse. Graafikaavaldise üldkuju on sel juhul:
    Graphics[{direkt1, direkt2, …, prim1, prim2}]
Üldjuhul mõjub iga direktiiv ainult temale järgnevatele primitiividele. Näiteks kirjutise
    Graphics[{prim1, direkt1, prim2}]
korral rakendatakse direktiivi direkt1 ainult teisele primitiivile prim2.
Üksikute primitiivide omaduste määramiseks võib kasutada loogelisi sulge, näiteks
    Graphics[{direkt1, {direkt2, prim1}, prim2}]
Siin mõjub direktiiv direkt1 mõlemale graafikaprimitiivile, direktiiv direkt2 aga ainult primitiivile prim1.

1.5. Värvid

Objekti värvi määramiseks on olemas neli erinevat direktiivi: GrayLevel, RGBColor, CMYKColor ja Hue. Selgitame nende kasutamist lähemalt.

GrayLevel[g] Võimaldab värvida objekte erinevates halltoonides. Siin g on reaalarv 0 ja 1 vahelt ning mida suurem on g, seda heledamat halli kasutatakse.
Näide 8. Joonestame kolm ringi, mille raadiused on 1, 2 ja 3 ühikut ja värvime nad erinevates halltoonides.
    In[18]:=  Show[Graphics[{
            GrayLevel[0.8], Disk[{0,0},3],
            GrayLevel[0.5], Disk[{0,0},2],
            GrayLevel[0],  Disk[{0,0},1]},
           AspectRatio->Automatic]]

RGBColor[r, g, b] Sellest direktiivist oli juba juttu punktis 2.5.1. seoses funktsiooni graafikute joonestamisega. Kõik seal öeldu jääb käesolevas punktis kehtima, kaasaarvatud värviselektori kasutamine. Meenutame, et RGBColor määrab objekti värvi RGB-värvimudeli, s. o. põhivärvide punane, roheline ja sinine alusel. Värvitoon segatakse kokku kolme värvikomponendi r, g ja b põhjal.
    r – red – punane;
    g – green – roheline;
    b – blue – sinine.
Komponendid r, g ja b on reaalarvud 0 ja 1 vahelt. Mida suurem on arv, seda rohkem vastavat värvikomponenti lisatakse.

Näide 9. Vaatame, kuidas muutub värvitoon, kui punane komponent muutub 0-st 1-ni, roheline ja sinine komponent on aga nullid. Joonestame üksteise kõrvale 40 ristkülikut. Iga ristküliku värvi määrab direktiiv RGBColor[i,0,0], kusjuures i muutub vasakult paremale liikudes 0-st 1-ni sammuga 1/39. Ristkülikute loendi koostame käsuga Table. Lõpuks joonestame saadud värviriba ümber raamjoone.
    In[19]:=  Show[ Graphics[{
             Table[
             {RGBColor[i/39,0,0], Rectangle[{i,0},{i+1,8}]},{i,0,39}],
             Line[{{0,0},{40,0},{40,8},{0,8},{0,0}}] },
           AspectRatio->Automatic]]

CMYKColor[c, m, y, k] Määrab objekti värvi CMYK-värvimudeli alusel. Värvitoon segatakse kokku nelja komponendi c, m, y ja k põhjal.
    c – cyan – tsüaan, helesinine;
    m – magneta – magneta, lilla;
    y – yellow – kollane;
    k – black – must.
Kõik komponendid on reaalarvud 0 ja 1 vahelt. Mida suurem on arv, seda rohkem vastavat värvikomponenti lisatakse. Näiteks
    CMYKColor[0,0,1,0] kollane;
    CMYKColor[1,0,1,0] heleroheline;
    CMYKColor[0,0,0,0] valge;
    CMYKColor[0,0,0,1] must.

Hue[h] Määrab objekti värvi vastavalt värviringile. Kui arv h muutub 0-st 1-ni, siis värvitoon Hue[h] muutub punasest üle kollase, rohelise, sinise ja lilla jälle punaseks. Ühest suuremate h väärtuste korral hakatakse neid värve tsükliliselt kordama.
Hue[h, s, b] Värvitooni saab täpsustada suuruste s ja b abil.
s – saturation – küllastatus;
b – brightness – heledus, s ja b on reaalarvud piirkonnst [0; 1].
Hue[h] annab sama tulemuse kui Hue[h,1,1].
Seda, kuidas küllastatuse ja heleduse muutmine värvitoonile mõjub, võib uurida eelmises näites toodud värviribasid joonistades. Näiteks värvide ülemineku valgest punaseni saame direktiiviga Hue[0,i,1], (i muutub 0-st 1-ni) ja ülemineku mustast punaseni direktiiviga Hue[0,1,i].

1.6. Rastrid

Rastriteks nimetatakse graafika primitiive Raster ja RasterArray. Rastrid kujutavad endast värviliste ruudukeste tabeleid (masiive). Ruudukeste värv määratakse vastava maatriksiga, kus igale ruudule vastab üks maatriksi element.
Raster[{{h11, h12, …}, {h21, h22, …},…}] Halltoonides värvitud ruudukeste massiiv. Iga ruudukese värvi määrab temale vastav maatriksi element hij .
    Kui hij <= 0, siis värvitakse ruuduke mustaks,
    kui hij >= 1, siis valgeks ja kui
    0 < hij < 1, siis kasutatakse halltoone musta ja valge vahelt.
Näide 10. Sisestame 9-elemendilise maatriksi h ja joonestame temale vastava halltoonide rastri.
    In[20]:=  h = {{0, 0.3, 0.5},
                {0.3, 0.5, 0.8},
                {0.5, 0.8, 1}};
    In[21]:=  Show[ Graphics[ Raster[h],
             AspectRatio->Automatic,
             Axes->True]]

RasterArray[{{v11, v12, …}, {v21, v22, …},…}] Värviliste ruudukeste massiiv. Maatriksi iga element vij, peab olema üks värvidirektiividest GrayLevel, RGBColor, CMYKColor või Hue.
Näide 11. Koostame käsu Table abil maatriksi v, mille elementideks on dirkektiivi CMYKColor väärtused.
    In[22]:=  v = Table[ CMYKColor[i,j,1,0],
                {i, 0, 1, 0.1}, {j, 0, 1, 0.1}];
    In[23]:=  Show[ Graphics[ RasterArray[v],
                AspectRatio->Automatic]]

Kui rastri maatriksis on m veergu ja n rida, siis üldjuhul paigutatakse raster joonisele nii, et tema alumine vasak nurk asub punktis (0; 0) ja ülemine parem nurk punktis (m; n). Teistsuguse asukoha saab rastrile määrata alljärgneva süntaksiga:
Raster[maatriks, {{xmin, ymin}, {xmax, ymax}}] Raster paigutatakse nii, et ta täidaks ristküliku vastastippudega
(xmin; ymin) ja (xmax; ymax). Analoogiliselt saab määrata ka primitiivi RasterArray asukohta.

1.7. Joone jämedus, kriipsjoon ja punkti suurus

Joone jämeduse määramiseks on kaks direktiivi: AbsoluteThickness ja Thickness.
Thickness[d] Määrab joone jämeduse. Joone laiust mõõdetakse murdosana kogu joonise laiusest. Näiteks, kui d = 1/10, siis joone laius on 1/10 kogu joonise laiusest. Seega, joone jämedus määratakse suhtelise pikkusühikuga. Kahemõõtmelise graafika korral on vaikimisi d väärtuseks 0,004. (Kolmemõõtmelisel graafikal 0,001.)
AbsoluteThickness[d] Joone jämedust mõõdetakse absoluutsetes ühikutes — punktides. 1 punkt = 1/72 tolli » 0,35 mm.

Absoluutsetel ja suhtelistel ühikutel on üks oluline erinevus. Jooned, mille jämedus on määratud suhtelistes ühikutes, muutuvad joonise vähendamisel või suurendamisel vastavalt peenemaks või jämedamaks. Jooned, mille jämedus on määratud absoluutsetes ühikutes, säilitavad oma laiuse. See tähendab, et joonise suurendamisel (vähendamisel) joonte jämedus ei muutu proportsionaalselt ülejäänud mõõtudega.

Niisamuti on punkti suurust ja kriipsjoone kriipsude pikkust võimalik määrata kas absoluutsetes või suhtelistes ühikutes.
Dashing[{d}] Objektide joonestamisel kasutatakse kriipsjoont, kus ühe kriipsukese pikkus on d. Tühikute pikkus kriipsude vahel on samuti d. Pikkus d määratakse murdosana kogu joonise laiusest.
Dashing[{d1, d2, d3, …, dn}] Kriipsude ja tühikute pikkust muudetakse tsükliliselt. Esimese kriipsu pikkus on d1 , esimese tühiku pikkus d2 , teise kriipsu pikkkus d3 , teise tühiku pikkus d4 jne. (n + 1)-se kriipsu (või tühiku) pikkus on jälle d1.
Dashing[{}] Pidev joon.
AbsoluteDashing[{d1, d2, …}] Kriipsjoone kasutamine. Kriipsukeste pikkust mõõdetakse absoluutsetes pikkusühikutes.
Näide 11. Joonestame kaks kriipsjoont. Olgu esimesel nii kriipsude kui tühikute suhteline pikkus 1/10, teisel kriipsude pikkus vaheldumisi 0,01 ja 0,06 ning tühikute pikkus 0,03.
    In[24]:=  Show[ Graphics[{
                Dashing[{1/10}],  Line[{{0,2},{1,2}}],
                Dashing[{0.01,0.03,0.06,0.03}],  Line[{{0,1},{1,1}}]},
             Axes->True,
             PlotRange->{0,3}]]

PointSize[r] Määrab järgnevate punktide raadiuse. Raadius määratakse murdosana kogu joonise laiusest. Kahemõõtmelise graafika korral on r vaikimisi väärtuseks 0,008.
AbsolutePointSize[r] Määrab joonisele kantavate punktide raadiuse. Raadiust mõõdetakse absoluutsetes mõõtühikutes.

1.8. Plot, ParametricPlot ja primitiivid

Osutub, et käsud Plot, ParametricPlot ja ListPlot kasutavad funktsiooni graafikute joonestamisel samuti graafika primitiive. Selgitame seda näite abil.
Näide 12. Joonestame funktsiooni y = x graafiku. Lühema tulemuse saamiseks vähendame parameetri PlotPoints abil alajaotuspunktide arvu 8-le.
    In[25]:=  Plot[x, {x,0,1}, PlotPoints->8]

    Out[25]=  -Graphics-
Plot-käsk koostab esmalt joonise jaoks graafikaavaldise, siis kuvab joonise ja lõpuks esitab väljundi. Väljundiks on joonist kirjeldav graafikaavaldis, kuid Out-reale trükitakse sellest ainult esimene sõna -Graphics-. Mida tulemus tegelikult sisaldab, saab näha käsuga InputForm.
    In[26]:=  InputForm[%]
    Out[26]//InputForm=
         Graphics[{{Line[{{0., 0.},
         {0.1428571428571428, 0.1428571428571428},
         {0.2857142857142857, 0.2857142857142857},
         {0.4285714285714286, 0.4285714285714286},
         {0.5714285714285714, 0.5714285714285714},
         {0.7142857142857143, 0.7142857142857143},
         {0.857142857142857, 0.857142857142857}, {1., 1.}}]}},
         {PlotRange -> Automatic, AspectRatio -> GoldenRatio^(-1),
         DisplayFunction :> $DisplayFunction, ColorOutput -> Automatic,
         Axes -> Automatic, AxesOrigin -> Automatic, PlotLabel -> None,
         AxesLabel -> None, Ticks -> Automatic, GridLines -> None,
         Prolog -> {}, Epilog -> {}, AxesStyle -> Automatic,
         Background -> Automatic, DefaultColor -> Automatic,
         DefaultFont :> $DefaultFont, RotateLabel -> True, Frame -> False,
         FrameStyle -> Automatic, FrameTicks -> Automatic,
         FrameLabel -> None, PlotRegion -> Automatic}]

Plot-käsu väljundit saab kasutada uute jooniste tegemisel.

Näide 13. Eelmises väljundis on ainult üks graafikaprimitiiv — Line. Võtame punktid, mida see joon läbib ja asendame iga punkti (x; y) joonega punktide (x; 0) ja (x; y) vahel. Seda on lihtne teha asendamisreegli (replacement rule) abil. Asendamisreeglitest on pikemalt kirjutatud järgmise peatüki 3. paragrahvis.
    In[27]:=  %26[[1,1,1,1]] /. {x_,y_} -> Line[{{x,0},{x,y}}];
Esitame uue joonise.
    In[28]:=  Show[ Graphics[%27], Axes->True]

    Out[28]=  -Graphics-
 

§2. KOLMEMÕÕTMELINE GRAAFIKA

2.1. Primitiivid

Nii nagu kahemõõtmelise graafika korral, võib ka kolmemõõtmelise graafika jooniseid koostada üksikutest objektidest — primitiividest. Ruumigraafikas on erinevaid primitiive ainult viis. Esitame neist kokkuvõtte.

Point[{x, y, z}] — Punkt koordinaatidega (x; y, z).
Line[{{x1, y1, z1}, {x2, y2, z2}, …}] — Murdjoon, mis läbib punkte (x1 ; y1 ; z1), (x2 ; y2 ; z2), … .
Polygon[{{x1, y1, z1}, {x2, y2, z2}, …}] — Hulknurk tippudega (x1 ; y1 ; z1), (x2 ; y2 ; z2), … .
Cuboid[{x1, y1, z1}, {x2, y2, z2}] — Risttahukas, mille tahud on paralleelsed koordinaattasanditega ja kaks vastastippu on punktides (x1 ; y1 ; z1) ja (x2 ; y2 ; z2).
Text[avaldis, {x, y, z}] — Tekst keskpunktiga (x; y, z).

Ruumilise joonise jaoks koostatakse graafikaavaldis käsuga Graphics3D, mille üldkuju on
Graphics3D[{prim1, prim2, …}] See korraldus teostab joonise jaoks vajalikud arvutused. Joonise saab ekraanile tuua käsuga Show.
Primitiivid Point, Line, Polygon ja Text on analoogilised vastavate kahemõõtmeliste objektidega. Toome ühe näite kolmemõõtmelise joonise koostamisest.
Näide 1. Joonestame korrapärase 8-tahulise püstprisma. Tähistame tahkude arvu muutujaga n. Nii on võimalik n väärtust muutes hõlpsasti joonestada suvalise arvu tahkudega prismasid.
    In[1]:=  n = 8;
Arvutame prisma alumise ja ülemise tahu tippude koordinaadid.
    In[2]:=   pts1 = Table[ {Cos[i],Sin[i],0}, {i,0,2 Pi,2 Pi/n}];
           pts2 = Table[ {Cos[i],Sin[i],2}, {i,0,2 Pi,2 Pi/n}];
Prisma külgtahud saame, kui rakendame sobivalt valitud tippudele graafika primitiivi Polygon.
    In[3]:=  kyljed = Table[
                Polygon[{pts1[[i]], pts2[[i]],
                pts2[[i+1]], pts1[[i+1]] }],
            {i,1,n}];
Käsuga Graphics3D koostame joonise. Ilusama tulemuse saamiseks jätame parameetriga Boxed->False ära kasti, mis kolmemõõtmelist joonist vaikimisi ümbritseb, parameetriga ViewPoint muudame vaatepunkti.
    In[4]:=  Show[ Graphics3D[
               {Polygon[pts1], Polygon[pts2], kyljed},
            Boxed->False,
            ViewPoint->{1.3,-6.7,4.2}]]

2.2. Direktiivid

Kolmemõõtmelises graafikas saab kasutada kõiki tasandigraafikast teadaolevaid direktiive, vt. punkti 3.1.4. Illustreerime seda ühe näitega, mis on võetud raamatust [2, lk. 201].
Näide 2. Joonestame väikestest eri värvi kuupidest koosneva suurema kuubi. Parameeter Lighting->False lülitab välja valgustuse ja lubab näha joonist loomulikes värvides.
    In[5]:=  Show[ Graphics3D[
              Table[
                {RGBColor[i,j,k], Cuboid[10 {i,j,k}]},
              {i,0,1,0.2}, {j,0,1,0.2}, {k,0,1,0.2}]],
            Lighting->False,
            Boxed->False]

Lisaks on ruumiliste objektide jaoks olemas kolm täiendavat direktiivi. Need on:
EdgeForm[direkt] — Hulknurga äärejoone omaduste täpsustamine.
FaceForm[direkt1, direkt2] — Hulknurga üks pool värvitakse üht, teine teist värvi.
SurfaceColor[direkt] — Hulknurga värv ja valguse peegeldamisega seotud omadused.

EdgeForm[{direktiiv(id)}] Võimaldab muuta hulknurga äärejoonte ilmet. EdgeForm’iga antud direktiive rakendatakse hulknurga äärejoontele, nii nagu oleks tegemist objektiga Line.
EdgeForm[] Hulknurgale ei joonestata äärejoont.
Näide 3. Joonestame helesinise kolmnurga tumesinise äärejoonega. Et oleksid näha loomulikud värvid, keelame parameetriga Lighting->False valgustuse.
    In[6]:= Show[ Graphics3D[
            {RGBColor[0,1,1],
             EdgeForm[{RGBColor[0,0,1],Thickness[0.01]}],
             Polygon[{{0,0,0},{0,1,1},{2,2,0}}]},
           Lighting->False]]

FaceForm[direkt1, direkt2] Hulknurga esikülg värvitakse nii, nagu määrab direktiiv direkt1, tagakülg aga nii, nagu määrab direkt2. Direktiivid direkt1 ja direkt2 peavad olema kas värvid GrayLevel, Hue, RGBColor, CMYKColor või siis direktiiv SurfaceColor. Kõik värvimäärangud, mis on antud ilma FaceForm’ita, kehtivad hulknurga mõlema poole jaoks.
Näide 4. Koostame ristkülikutest spiraali s. Ristkülikute esikülje värvime punaseks, tagakülje kollaseks.
    In[7]:=  s = Table[
             Polygon[
              {{Cos[t], Sin[t], t/4},
               {Cos[t+0.2], Sin[t+0.2], t/4},
               {Cos[t+0.2], Sin[t+0.2], (t+2)/4},
               {Cos[t], Sin[t], (t+2)/4}}],
            {t, 0, 3 Pi, Pi/12}];
    In[8]:=  Show[ Graphics3D[
               {FaceForm[ RGBColor[1,0,0], RGBColor[1,1,0]], s},
            Lighting->False]]

SurfaceColor[direkt] Hulknurga värvi määramine. Kõigis eelmistes näidetes, kus oli tegemist värviliste hulknurkadega, kasutasime parameetrit Lighting->False. Põhjuseks oli asjaolu, et kui valgustus on sisse lülitatud (Lighting->True), siis värvitakse hulknurk vastavalt tema pinnale langevale valgusele, värvidirektiive aga ei arvestata. Direktiiviga SurfaceColor määratud värvi võetakse arvesse ka siis, kui valgustus on sisse lülitatud. Sel juhul leitakse hulknurga lõplik värvitoon valguse SurfaceColor’iga antud värvi summana. Surfacecolor’iga saab muuta ka pinna peegeldamisomadusi, kuid seda me siin pikemalt ei käsitle.
Näide 5. Joonestame veelkord eelmise näite spriaali, kuid ristkülikud värvime mõlemalt poolt punaseks. Kuna kasutame direktiive SurfaceColor[RGBColor[1,0,0]], siis jäävad mõned neist heledamad, teised tumedamad, sõltuvalt sellest, kuidas nad on valgustatud.
    In[9]:=  Show[ Graphics3D[
                {SurfaceColor[ RGBColor[1,0,0]], s}]]

2.3. Valgustusest

Ruumiliste objektide valgustus määratakse parameetriga
LightSources->{lamp1 , lamp2, …} . Iga lamp ehk valgusallikas kirjeldatakse loendiga {{xi , yi , zi},värvi}. Siin {xi , yi , zi} on lambi asukoht ja värvi direktiiv, mis määrab valguse värvi. Punkt {xi , yi , zi} määratakse koordinaatsüsteemis, mille x-telg suundub vasakult paremale, y-telg alt üles ja z-telg ekraani seest ettepoole. Joonis paikneb piirkonnas [ – 1; 1] × [ – 1; 1] × [ – 1; 1]. Vaikimisi on parameetri väärtus
LightSources->{{{1.,0.,1.},RGBColor[1,0,0]},
               {{1.,1.,1.},RGBColor[0,1,0]},
               {{0.,1.,1.},RGBColor[0,0,1]}}
Näide 6. Hea ettekujutuse valgusallikate paiknemisest saame sfääri abil.
    In[10]:=  ParametricPlot3D[
              {Cos[u] Cos[v], Cos[u] Sin[v], Sin[u]},
            {v,0,2 Pi}, {u,-Pi/2,Pi/2}]

Näide 7. Muudame sfääri valgustust nii, et punktis (1; 1; 1) oleks kollane lamp ja punktis ( – 1; – 1, 1) punane lamp.
    In[11]:=  ParametricPlot3D[
               {Cos[u] Cos[v], Cos[u] Sin[v], Sin[u]},
               {v,0,2 Pi}, {u,-Pi/2,Pi/2},
            LightSources->{{{ 1, 1,1}, RGBColor[1,1,0]},
                           {{-1,-1,1}, RGBColor[1,0,0]}}]

Kui parameetrile Lighting anda väärtuseks False, siis valgustust ei kasutata ja kõik objktid, millele direktiividega värvi määratud ei ole, värvitakse mustaks.

    Eelmine peatükk     Järgmine peatükk     Sisukord