9. Grafika v rovině a v prostoru

Motivace

V této lekci se naučíme vyrábět rovinné a prostorové obrázky sestavené z geometrických útvarů, jako jsou body, úsečky, kružnice, šipky, apod.

Příklad 2D grafiky (dláždění roviny):

({{, , }})

Escher's Combinatorial Patterns
Použitý zdroj: Stan Wagon, Mathematica in Action (2nd edition), Springer, 1999

Příklad 3D grafiky (interaktivní model motoru, k jeho spuštění je nutné zvolit “Enable Dynamics”):

Radial Engine
Použitý zdroj: "Radial Engine" from the Wolfram Demonstrations Project, contributed by: Yu-Sung Chang, http://demonstrations.wolfram.com/RadialEngine/

Geometrické útvary v rovině

Rovinné obrázky se vyrábějí pomocí Graphics; v argumentu je seznam geometrických útvarů, které chceme vykreslit.
K elementárním útvarům patří bod (Point), úsečka a lomená čára (Line), šipka (Arrow), vyplněný obdélník (Rectangle), vyplněný mnohoúhelník (Polygon), kružnice, elipsa a oblouk kružnice (Circle), kruh, vyplněná elipsa a kruhová výseč (Disk).

Graphics[{Circle[{5,5},4],Disk[{3.5,6.5},0.45],Disk[{6.5,6.5},0.45],
Circle[{5,5.5},3,{225°,315°}],Line[{{5,5.5},{4.5,4.5},{5,4.5}}]}]

(Symbol stupně ° lze zadávat pomocí palety Basic Math Assistant nebo klávesovou zkratkou EscdegEsc. Místo tohoto symbolu lze psát Degree, např. 225 Degree. V případě, že uvedeme samotné číslo, jej Mathematica chápe jako velikosti úhlu v radiánech.)

Příklad použití Arrow – vektory tečny a normály k zadané křivce:

f[t_]:={t,Sin[t]}(* f je rovinná křivka zadaná parametricky - zde sinusoida, je možné změnit *)

g[t_]=D[f[t],t] (* derivace udává vektor tečny *)

rotace[{x_,y_}]:={-y,x} (* pomocná funkce pro otočení vektoru o 90 stupňů *)
tecna[t_]:=g[t]/Norm[g[t]] (* jednotkový vektor tečny; ekvivalentně: Normalize[g[t]] *)
normala[t_]:=rotace[tecna[t]] (* jednotkový vektor normály *)

t0=Pi/4;
Show[Graphics[{Point[f[t0]],Arrow[{f[t0],f[t0]+tecna[t0]}],Arrow[{f[t0],f[t0]+normala[t0]}]}],ParametricPlot[f[t],{t,0,2Pi}]] (* Graphics vykreslí vybraný bod, vektory tečny a normály; ParamatericPlot sestrojí křivku *)

Interaktivní verze s posouváním bodu vyrobená pomocí Manipulate (budeme probírat později):

Manipulate[Show[Graphics[{Point[f[t0]],Arrow[{f[t0],f[t0]+tecna[t0]}],Arrow[{f[t0],f[t0]+normala[t0]}]}],ParametricPlot[f[t],{t,0,2Pi}],PlotRange->{{-1,7},{-2,2}}],{t0,0,2Pi}]

Uvnitř obrázků lze sázet nápisy pomocí Text.
Nejjednodušší příklad použití, kdy zadáváme řetězec a pozici, kde má být umístěn střed nápisu (pro kontrolu zapínáme souřadnicové osy):

Graphics[Text["Mathematica",{0.5,0.5}],Axes->True]

Pomocí Style lze nastavovat font, styl písma a velikost. Style je pouze formátovací příkaz, je nutné jej vložit do prvního argumentu Text.

t=Style["Mathematica",FontWeight->Bold,FontFamily->"Arial",FontSize->20]

Graphics[Text[t,{0,0}],Axes->True]

Sofistikovanější varianta je Text[výraz,{x,y},{dx,dy}]. Orámuje řetězec neviditelným obdélníkem a v něm zavede relativní souřadnicový systém, jehož počátek je uprostřed obdélníku, jednotka na vodorovné ose je polovina šířky obrázku a jednotka na svislé ose je polovina výšky obrázku. Text je poté umístěn do grafiky tak, aby bod s relativními souřadnicemi {dx,dy} splýval s bodem s absolutními souřadnicemi {x,y}.
Tato varianta Text je užitečná pro zarovnávání nápisů.

Graphics[Text[t,{0,0},{1,0}],Axes->True] (* relativní souřadnice {1,0} odpovídají středu pravého okraje, ten bude umístěn do počátku *)

Graphics[Text[t,{0,0},{-1,-1}],Axes->True] (* relativní souřadnice {-1,-1} odpovídají levému dolnímu rohu, ten bude umístěn do počátku *)

Volitelný čtvrtý argument Text je vektor odpovídající směru, ve kterém bude text sázen.

Graphics[Text[t,{0,0},{0,0},{1,1}],Axes->True]

Geometrické útvary v prostoru

Prostorové obrázky se vyrábějí pomocí Graphics3D. Kromě bodů, úseček a dalších útvarů známých z roviny se zde mohou objevit i některé nové útvary:

Graphics3D[Cuboid[{0,0,0},{1,2,3}]](* kvádr zadaný souřadnicemi dvou nejvzdálenějších vrcholů *)

Graphics3D[Ball[{0,0,0},1]] (* koule zadaná středem a poloměrem *)

Graphics3D[Cylinder[{{0,0,0},{1,0,1}},0.2],Boxed->False,Axes->True,AxesOrigin->{0,0,0}] (* válec zadaný svou osou a poloměrem *)

Graphics3D[Cone[{{0,0,1},{0,0,0}},0.4],Boxed->False,Axes->True,AxesOrigin->{0,0,0}](* kužel zadaný svou osou a poloměrem podstavy *)

Graphics3D[Tetrahedron[{{1,0,0},{1,0,1},{1,1,1},{0,0,1}}]](* čtyřstěn *)

Graphics3D[Pyramid[{{0,0,0},{2,0,0},{2,2,0},{0,2,0},{1,1,2}}]](* čtyřboký jehlan *)

Graphics3D[Parallelepiped[{0,0,0},{{1,0,0},{1,1,0},{0,1,1}}]](* rovnoběžnostěn zadaný bodem a třemi vektory *)

PolyhedronData je databáze konvexních i nekonvexních mnohostěnů, na které se lze odkazovat anglickým názvem (podrobnosti v dokumentaci):

PolyhedronData["Dodecahedron"]

Příklad 3D grafiky:

Graphics3D[{Ball[{0,0,0},.6],Black,Ball[{-.2,-.5,.2},.1],Ball[{.2,-.5,.2},.1],Lighter[Blue],Ball[{-.2,-.57,.2},.04],Ball[{0.2,-0.57,0.2},0.04],Orange,Cone[{{0,-.5,-.1},{0,-1,-.1}},.1],Yellow,Cone[{{0,0,.4},{0,0,.8}},.7],Red,EdgeForm[],Table[Cylinder[{{.3Cos[t],0,.3Sin[t]},{.3Cos[t],-.5,.3Sin[t]-0.1}},0.03],{t,3Pi/2-Pi/4,3Pi/2+Pi/4,Pi/32}]},Boxed->False,ViewPoint->{-1,-3,0},Lighting->"Neutral"]

Poznámky:

Kromě geometrických útvarů se v předchozím příkladu objevují i tzv. direktivy (např. názvy barev), kterým je věnována následující sekce.

K nasvícení prostorových obrázků Mathematica standardně používá barevné zdroje světla. To má za následek, že i bílé objekty vypadají barevně a ostatní barvy mohou být zkresleny. Volba Lighting->”Neutral” říká, že místo barevných světel mají být použitá bílá (vyzkoušejte, co se stane, když volbu vynecháte).

Grafické direktivy

Často používanými direktivami, které se mohou objevit v seznamu uvnitř Graphics nebo Graphics3D, jsou specifikace barev.

Graphics[{Circle[{5,5},4],Blue,Disk[{3.5,6.5},0.45],Disk[{6.5,6.5},0.45],Red,
Thick,Circle[{5,5.5},3,{225°,315°}],Line[{{5,5.5},{4.5,4.5},{5,4.5}}]}]

Barvy lze zadávat anglickými názvy nebo specifikací v modelu RGB (RGBColor[r,g,b], argumenty jsou tři čísla z intervalu [0, 1]). Další možnosti jsou stupně šedi (GrayLevel[g], argument je číslo z intervalu [0, 1]).

K tvorbě obrázků hýřících mnoha barvami se dobře hodí Hue. Argumentem je číslo z intervalu [0, 1], které je převedeno na jistý barev odstín, viz následující ukázku.

f[n_]:=Table[{Hue[i/n],Disk[{Cos[i*2Pi/n],Sin[i*2Pi/n]},0.1]},{i,1,n}](* funkce vrací seznam n kruhů se středy na jednotkové kružnici, i-tý kruh má barvu Hue[i/n] *)

Graphics[f[25]]

Graphics[f[200]]

Některé další direktivy:

Opacity nastavuje průhlednost, argument je číslo z intervalu [0, 1], přičemž 0 = zcela průhledný objekt, 1 = zcela neprůhledný objekt.

Graphics[{Opacity[.5],Red,Disk[{0,0},1.5],Green,Disk[{2,0},1.5],Blue,Disk[{1,Sqrt[3]},1.5]}]

PointSize a AbsolutePointSize nastavují velikosti bodů. Argumentem PointSize je relativní velikost bodu vzhledem k šířce obrázku, argumentem AbsolutePointSize je absolutní velikost v typografických bodech.

Graphics[{PointSize[0.5],Point[{0,0}],AbsolutePointSize[20],Point[{0,1}]},Axes->True](* zkuste měnit velikost obrázku a pozorujte velikosti bodů *)

Styly čar se nastavují pomocí Thick, Thin, Thickness (relativní šířka vzhledem k šířce obrázku), AbsoluteThickness (šířka v typografických bodech) a Dashed, Dotted, DotDashed (čárkovaná, tečkovaná, čerchovaná čára). Zkuste je použít v úvodním příkladu z této sekce!

Direktiva EdgeForm říká, jak budou vykreslovány hranice vyplněných objektů (Disk, Rectangle, Polygon). Ve výchozím nastavení má hranice stejnou barvu jako výplň.

Graphics[{Yellow,EdgeForm[{Thick,Black}],Disk[{0,0},1,{Pi/8,15Pi/8}],Green,Disk[{0.3,0.5},0.1]}] (* hranice tlustou černou čarou *)

Direktivy v Graphics/Graphics3D zůstávají v platnosti tak dlouho, dokud se neobjeví jiná direktiva měnící danou vlastnost.

d1=Disk[{0,0},1]

d2=Disk[{2,0},1]

d3=Disk[{4,0},1]

Graphics[{Red,EdgeForm[{Thick,Black}],d1,d2,Blue,d3}] (* první dva kruhy jsou červeně s tlustou černou hranicí,třetí je modře s tlustou černou hranicí *)

Místo seznamu se v Graphics/Graphics3D může objevit seznam seznamů. Po skončení každého dílčího seznamu se obnoví výchozí hodnoty všech direktiv. Tímto způsobem se lze snadno vrátit k výchozím nastavením, aniž bychom museli znát příslušné hodnoty.

Graphics[{{Red,EdgeForm[{Thick,Black}],d1},{d2},{Blue,d3}}]
(* první kruh červeně s tlustou černou hranicí, druhý černě, třetí modře bez vyznačené hranice *)

Kombinace obrázků

Občas se stává, že do obrázku vyrobeného pomocí Plot, ParametricPlot apod. chceme přidat popisky, šipky či jiné geometrické útvary.

Ke sloučení Plot a Graphics lze použít Show:

Show[Plot[Sin[x],{x,0,2Pi}],Graphics[{Arrow[{{3Pi/2,1/2},{Pi,0}}],Text[Style["Nulový bod",FontSize->14],{3Pi/2,0.55},{0,-1}]}]]

Jednodušší řešení: Plot a příbuzné funkce mají volby Epilog a Prolog, do kterých lze zadat seznam grafických útvarů a direktiv, které se mají do obrázku doplnit.

Plot[Sin[x],{x,0,2Pi},Epilog->{Arrow[{{3Pi/2,1/2},{Pi,0}}],Text[Style["Nulový bod",FontSize->14],{3Pi/2,0.55},{0,-1}]}]

Rozdíl mezi Epilog a Prolog je v pořadí vykreslování. Objekty uvedené v Prolog se vykreslují před provedením Plot, objekty v Epilog až poté. V předchozím příkladu se žádné útvary nepřekrývají, a proto nezáleží na tom, zda použijeme Epilog nebo Prolog.