Cvičení 4

Kurs: Informatická propedeutika II
Téma cvičení: Kreslení jednoduchých pérovek v MetaPostu.

Definice cesty. Jednoduché kreslení. Změna pera. Přerušované čáry. Manipulace s textem. Soustavy lineárních rovnic. Transformace. Ořezávání oblastí. Používání proměnných. Cyklus. Podmíněný příkaz. Parametrická manipulace s cestou.


1.  Ukázkový příklad

Úvodní příklad ukazuje základy jazyka MetaPost. Je v něm zachycena většina běžných konstrukcí a výrazů. Při vypracovávání dalších obrázků jich lze s výhodou použít. Předpokládejme, že chceme nakreslit graf funkce y=sqrt(x). U obrázku kromě samotného grafu funkce požadujeme rovněž osy a komentáře. Graf funkce bude pro zvýraznění vykreslen tlustší čarou. Viz obrázek.

Obrázek 1. Graf funkce.

Nejprve je potřeba vytvořit zdrojový soubor. Ve zdrojovém souboru může být definováno několik obrázků, proto každý obrázek začíná klausulí beginfig následovanou jeho číslem.

 beginfig (1)
   ux := 3.6cm; uy := 2.5cm; pr := 2mm;

Za hlavičkou byly definovány tři rozměry. Jedná se o proměnné určující velikost grafu funkce a přesah os. Při definici lze použít jednotky obvyklé v systému TeX. Dalším krokem je vykreslení os, včetně jejich přesahů.

   % nakresli osy
   draw (ux + pr, 0) --- (-pr, 0);
   draw (0, uy + pr) --- (0, -pr);

Řádky začínající znakem % jsou komentáře. Veškerý text začínající znakem % je až do konce řádku ignorován. Popis os je složen ze dvou textových nápisů. Ty je nutné vložit pomocí příkazu label. V případě osy y je navíc nutné provést rotaci textu.

   % popis osy
   label.lft (btex osa $y$ etex rotated 90, (0, .5uy));
   label.bot (btex osa $x$ etex, (.5ux, 0));

Vkládaný text je uzavřen mezi btexetex. Pro rotaci textu byl použit příkaz rotated, vytvářející požadovanou transformaci. Z příkladu je vidět, že rotated byl použit za textovým argumentem. Kdyby byl použit například na konci příkazu, nebo za argumentem posice textu, nevedlo by to k očekávanému výsledku. Posice textu je kromě souřadnic určena i příponami příkazu label.

Dalším krokem je vykreslení grafu funkce. Graf funkce lze vykreslit několika způsoby. Například je možné nejprve definovat cestu odpovídající grafu a s ní posléze manipulovat. Při definici cesty je použit příkaz cyklu for způsobem typickým pro jazyk MetaPost.

   % nakresli graf funkce
   path p;
   p := (0, 0){dir 60}
     for i := 0 upto ux:
       ... (i, sqrt (i))
     endfor;
   draw p yscaled .1uy withpen pencircle scaled .5mm;

Nejprve byla nadeklarována proměnná typu path. Proměnná dále byla inicialisována na počátek souřadnic. Argument {dir 60} určuje směrnici tečny ke křivce v počátečním bodě. Další uzly byly vytvořeny cyklem. Vskutku, inicialisace proměnné p vlastně končí až klausulí endfor.

Na dalším řádku je graf vykreslen. Cesta byla transformována pomocí příkazu yscaled tak, aby její velikost padla do připravených os. Změny pera bylo dosaženo příkazem withpen. Ten ovlivňuje pouze tvar pera aktuální kresby, V našem případě grafu funkce. Za příkaz withpen lze obecně dosadit proměnnou typu obrázek. Předdefinované kulaté pero má název pencircle. Jeho zvětšení na .5mm zaručuje přijatelné a dobře čitelné zvýraznění.

Nyní zbývá pouze vytvořit popisek. A ukončit obrázek.

   % popis graf
   label.lrt (btex $y=\sqrt x$ etex,
              point (0.5 * length (p)) of p yscaled .1uy);
 endfig;

Popisek je umístěn od poloviny grafu funkce. Makro length vrací délku cesty. Pomocí makra point of lze zjistit střed grafu funkce. Ten musí být ale opět transformován na patřičnou polohu. Text je umístěn vpravo dole od středu grafu. To je zajištěno příponou lrt.

Zdrojový soubor s obrázky je nutné ukončit příkazem bye. Zdrojový kód obrázku je k disposici v souboru sqrt.mp. Po vytvoření zdrojového kódu lze přistoupit k jeho překladu. Překlad je proveden programem mpost. Viz příklad.

 $ mpost sqrt.mp
 This is MetaPost, Version 0.641 (Web2C 7.3.1)
 (sqrt.mp [1] )
 1 output file written: sqrt.1
 Transcript written on sqrt.log.

Po přeložení vznikne soubor sqrt.1 obsahující velmi jednoduchý PostScriptový obrázek odpovídající vstupnímu programu. Jelikož byl v obrázku použit TeXovský vstup, nelze sqrt.1 přímo prohlížet nebo tisknout. Lze jej ale dále zpracovat TeXem a spojit tak nakreslený obrázek s dokumentem vysázeným systémem TeX. To byl původní záměr. Pro vložení obrázku lze použít například makra z balíku epsf. Ty existují jak pro LaTeX, tak pro plainTeX. Ukázkový dokument ve formátu LaTeX je k disposici v souboru sqrt.tex.

Překlad dokumentu a vytvoření výsledného PostScriptu lze provést například těmito příkazy.

 $ cslatex sqrt.tex
 $ dvips -t a4 -o sqrt.ps sqrt.dvi

Po úspěšném překladu bude vytvořen soubor sqrt.ps.

Úkol 1. Vyzkoušejte ukázkový příklad.

2.  Trojúhelník

Úkolem je vytvořit trojúhelník zadaný dvěma stranami a svíraným úhlem. Konstrukce je velmi jednoduchá. Pro zjednodušení navíc uvažujme, že obě strany mají stejnou velikost. Obrázek vytvořte tak, aby mohly být velikosti stran a úhlů pružně měněny. Nejjednodušší je nadefinovat pro tyto hodnoty samostatné proměnné. U obrázku vytvořte i popisky vrcholů a stran trojúhelníka. Rovněž znázorněte úhel a vytvořte jeho popisek. Viz obrázek.

Obrázek 2. Trojúhelník.

Při vytváření obrázku nejprve nakreslete samotný trojúhelník definovaný uzavřenou cestou. Pro konstrukci požadovaného úhlu použijte transformaci rotace. Dál sestrojte popisky ke stranám a vrcholům. Při použití příkazu label používejte vhodně prefixy, aby bylo umístění popisků dobře čitelné a přehledné.

Oblouček úhlu lze vytvořit několika způsoby. Buďto jako ořezaná kružnice, jako část kružnice vymezená dvěma průsečíky, nebo jako „dostatečně prohnutý“ oblouk. V tomto konkrétním případě je asi nejjednodušší poslední řešení. V podstatě stačí z výchozího bodu na straně c vést oblouk do bodu na straně b. Vyhnutí oblouku lze provést například dodatečným nastavením směrnice tečny v počátečním bodě. Na předchozím obrázku byla směrnice nastavena na 90 stupňů.

Úkol 2. Vytvořte trojúhelník zadaný dvěma stranami a svíraným úhlem.

3.  Hasseův diagram svazu

Dalším jednoduchým příkladem je vytvoření Hasseova diagramu uspořádané množiny. Na následujícím obrázku je znázorněn šestiprvkový svaz. Úkolem je vytvořit tento obrázek spolu s popisy prvků 0, 1, a a jeho komplementu.

Obrázek 3. Hasseův diagram.

Při vytváření obrázku je dobré nejprve vytvořit rámec a zakreslit uzly. Uzly je dobré vytvářet pomocí příkazu fill. Cestu ve tvaru kružnice vytvořte makrem fullcircle. Kružnici je potřeba zvětšit na požadovanou velikost. Po nakreslení mřížky a uzlů proveďte rotaci celého obrázku. Na aktuální obrázek se lze odkazovat proměnnou currentpicture. V transformovaném obrázku vytvořte popisky. Čáru nad symbolem a lze vytvořit například pomocí TeXovského makra \overline.

Úkol 3. Vytvořte zobrazený Hasseův diagram svazu.

Problém na zamyšlení: „Proč musejí být popisky vytvářeny až po transformaci mřížky?“.

4.  Dopočtená transformace

Tento příklad slouží k procvičení dopočtených transformací. Úkolem je nejprve nakreslit libovolnou elipsu. Pro jednoduchost předpokládejme, že její střed je ve středu souřadného systému. Na následujícím obrázku je tato elipsa zakreslena tučně. Dalším úkolem je zkonstruovat transformaci převádějící právě zakreslenou elipsu do tvaru, který je na obrázku vyznačen přerušovanou čarou.

Obrázek 4. Ukázka dopočtené transformace.

V podstatě jde o vhodnou rotaci kombinovanou se zmenšením. Při transformaci by ale měly být zachovány vzájemné poměry velikostí obou elips. Asi nejlepším způsobem transformace je vytvoření proměnné typu transform. Proměnnou lze inicialisovat deklarativně. Když si uvědomíme, že střed zůstane na stejném místě a bod A se přesune do bodu A', stačí již jen deklarovat hodnoty dvou transformačních parametrů, ty lze vhodně nastavit pomocí maker xypartyypart.

Úkol 4. Nakreslete elipsu a vytvořte transformaci podle předchozích pokynů. Nově vzniklou elipsu nakreslete přerušovanou čarou. K tomu lze využít například příkazů dasheddashedpattern. Vyzkoušejte různé způsoby přerušování čáry, tečkování, čárkování a čerchování.

5.  Šrafování oblastí

Jazyk MetaPost umožňuje vyplňovat oblasti jednou barvou. Pokud chce uživatel oblasti vyplňovat vzorem nebo šrafovat, musí si vypomoct ořezáváním oblastí. Základní myšlenkou šrafování je nakreslit šrafovaní „přes šrafovaný objekt“ a podle jeho kontury šrafování oříznout. K ořezávání oblastí slouží příkaz clip.

Úkol 5. Úkolem je vyšrafovat zvolenou oblast ohraničenou uzavřenou cestou. Nejprve vytvořte proměnnou typu path a definujte uzavřenou cestu. Vytvořte šrafování jako na obrázku úplně vpravo.

Obrázek 5. Tři fáze šrafování.

Tři obrázky postupně zachycují šrafovací algoritmus. Nejprve je pomocí cyklu vytvořeno svislé šrafování. To je v druhé fázi rotováno. V další fázi je ke stávajícímu obrázku přidáno šrafování s opačnou rotací. Výsledek je ořezán podle zvolené uzavřené cesty. Předchozí šrafování vzniklo de facto komposicí dvou obrázků. K tomu slouží příkaz addto s klausulí also.

Úkol 6. Problém na zamyšlení: Implementujte makro, které provádí šrafování obecné plochy. Jako argument bude makru předána uzavřená cesta, vzdálenost čar a úhel sklonu šrafování. Při implementaci budete potřebovat makra llcorner, lrcorner, urcornerulcorner vracející hranice obdélníkové oblasti v níž je daný argument uzavřen.

6.  Grafický význam Lagrangeovy věty

Z diferenciálního počtu je dobře známá Lagrangeova věta o střední hodnotě. Její grafický význam je také pozoruhodný. Pokud je funkce na uzavřeném intervalu spojitá a na témže otevřeném intervalu diferencovatelná, pak v intervalu existuje bod, v němž má tečna k funkci stejnou směrnici jako přímka vedená hraničními body grafu funkce. Viz obrázek.

Obrázek 6. Grafický význam Lagrangeovy věty.

Úkol 7. Pokuste se nakreslit předchozí obrázek. Nejprve definujte hladkou cestu representující graf funkce. Potom je nutné vypočítat bod, v němž má tečna stejnou směrnici jako přímka vedoucí hraničními body. K tomu použijte makra direction ofdirectionpoint of. První makro vrací směrnici tečny k cestě v daném bodě, druhé makro vrací první bod na cestě se zadanou směrnicí.