Číselné hodnoty v Metapostu

5. 3. 2007
Doba čtení: 6 minut

Sdílet

V dalším článku ze série o systému Metapost probereme typ numeric, do něhož je prostě uloženo číslo. Poté se také seznámíme s vestavěnými aritmetickými funkcemi a všemi podporovanými délkovými jednotkami. Na závěr nás čeká alespoň malá ukázka práce s grafikou.

Základní vlastnosti typu numeric

Čísla jsou interně uložena jako celočíselné násobky zlomku 1/65536, z čehož mohou plynout zaokrouhlovací nepřesnosti. S těmi musíme počítat např. v logických hodnoceních, kdy výsledkem složitějšího výpočtu nemusí být očekávané celé číslo, ale číslo s platnými číslicemi za desetinnou čárkou. K témuž může dojít i při použití proměnné typu numeric jako řídící proměnné cyklů (viz další díly). Na tuto skutečnost je nutno dávat pozor, zejména v případech, kdy se do hodnoty logické proměnné promítá porovnání testované proměnné s nějakou konkrétní hodnotou. Numeric je jediný typ proměnné, kterou nemusíme nijak deklarovat. Všechny dosud nedeklarované proměnné metapost automaticky považuje za proměnné tohoto typu. Z toho mohou plynout různá zdánlivě nesmyslná chybová hlášení, pokud se překlepneme při deklaraci (nebo použití) v názvu proměnné.

Přidělenou hodnotou může být konkrétní číslo, matematický vztah mezi konkrétními čísly, jiná proměnná typu numeric či matematický vztah mezi proměnnými a čísly v libovolné kombinaci. V některých případech po nás metapost vyžaduje umístění složitějších vztahů do závorek, jinak dává na jevo svou nelibost dosti málo srozumitelnými chybovými hlášeními.

Ukázka programu a výpisu z jeho chodu. Ve výpisu jsou opět (jako v minulém díle) pro lepší srozumitelnost vloženy v hranatých závorkách názvy vypisovaných proměnných.

a=5; b=10; c=b/a; d=c*b; e=a-d; f=2b;           % definujeme proměnné
g=infinity;
show a; show b; show c; show d; show e; show f; % vypisujeme jejich hodnoty
show g;
h=1/infinity;
show h;
end;

This is MetaPost, Version 0.641 (Web2C 7.4.5)

>> 5    [a]
>> 10   [b]
>> 2    [c]
>> 20   [d]
>> -15  [e]
>> 20   [f]
>> 4095.99998  [g]
>> 0.00024 [h]

Vidíme, že proměnné typu numeric můžeme definovat přímo hodnotami nebo matematickými vztahy (+ – * /), případně lze použít - jako unární operátor (a zadat hodotu jako d=-a;). Povšiměte si také definice proměnné f ve výše uvedeném příkladě, kdy je zadána jako f=2b;, není tedy nutno uvádět znaménko násobení *, protože jména proměnných v metapostu nemohou obsahovat číslice, je tento zápis jednoznačný. Příkaz f=ab; by už jednoznačný nebyl, protože proměnná ab by mohla existovat a systém se ji bude snažit najít. V lepším případě program skončí chybovým hlášením, v horším takovou proměnnou najde a výsledkem bude „záhadné“ chování programu.

Konstanty, operátory a funkce

Konstanta infinity

Datový typ numeric má vestavěno pojmenování nejvyšší přípustné hodnoty jako infinity. Jejím převrácením zase získáme nejnižší možné číslo. Při překročení těchto hodnot dojde k přetečení/pod­tečení proměnné a chybovému hlášení (a to i při mezivýpočtech).

Operátory

Výše byly uvedeny operátory triviálních matematických výpočtů. K nim lze dodat, že operátor – užíváme nejen pro odečítání, ale i pro negaci. (Platí, že -a=-1*a.) Operátor ** užíváme pro umocňování (jako v perlu nebo pythonu). Pro nematematiky: Umocňujeme-li na (1/n)-tou, je výsledek totožný s n-tou odmocninou.

Další operátory jsou pro pythagorejský součet a rozdíl:A++B je zkratka pro druhou odmocninu součtu druhých mocnin A a B, A+-+B pro druhou odmocninu jejich rozdílu.

Funkce

  • abs absolutní hodnota
  • round zaokrouhlení (jak známe z matematiky)
  • ceiling zaokrouhlení nahoru (nejbližší vyšší celé číslo)
  • floor zaokrouhlení dolů (nejbližší nižší celé číslo)
  • div výsledek celočíselného dělení čísla před operátorem číslem za operátorem
  • mod zbytek po celočíselném dělení A mod B
  • cosd kosinus úhlu zadaného ve stupních
  • sind sinus úhlu zadaného ve stupních
  • mlog a mexp logaritmická a exponenciální funkce; nikoli standardní, ale je použito násobení / dělení 256, nicméně mexp(mlog(n)); vrací jako výsledek n
  • sqrt druhá odmocnina
  • normaldeviate náhodné číslo, čísla jsou rozložena podle Gaussovy křivky, jejich průměr je 0 a směrodatná odchylka 1, zadává se bez argumentu a=normaldeviate;
  • uniformdeviate náhodné číslo z intervalu 0 – argument syntaxe: a=uniformdeviate (argument); přičemž argument je číslo nebo proměnná typu numeric

Dále jsou v systému zabudována dvě funkcím podobná makra decr aincr. Snižují, resp. zvyšují hodnotu proměnné o 1, ale musejí být uplatněny v syntaxi c:=incr©;, takže se nedají použít ve stylu céčkového nebo perlového příkazu c++;

Grafické jednotky

Při grafické presentaci čísel metapost potřebuje číslo doplnit délkovou jednotkou. Není-li zadána, tedy pokoušíme-li se graficky prezentovat „holé“ číslo numeric, je implicitně doplněn jako grafická jednotka tiskový bod.

Přehled metapostem akceptovaných délkových jednotek uvádí následující tabulka:

Jednotka Délka v mm Další vztahy
bp 0.35278 1/72 palce
dd 0.37607 Didôtův bod, tradiční kontinentální typografie
mm 1 milimetr
pc 4.21753 pica = 12 pt
cc 4.15279 cicero = 12 dd
cm 10 centimetr
in 25.40004 palec

Názvy zde uvedených jednotek by neměly být používány jako názvy proměnných.

Nejmenší vnitřně reprezentovanou jednotkou je 1/65536 pt (scaled point, sp), ta však není uživatelsky dostupná. Pokud ovšem uživatel zadá jednotku (1/infinity)*pt, pak ji má o délce cca 84.4 nm, což je za hranicí zobrazitelnosti ve viditelném světle (vzhledem k jeho vlnové délce). Nic tedy nebrání tomu použít metapost (a, pochopitelně, celý TeX) k vytváření obrázků a nápisů pozorovatelných pouze pod největším technicky možným zvětšením ve světelné mikroskopii. Pouze zařízení musí být schopné takovéto předlohy realizovat v praxi.

Nejčastěji bývá zadána na počátku obrázku (nebo celého metapostového programu) jednotka tradičně označovaná jako u, tedy něco jako:

u:=5mm;

Všechny délkové míry na obrázku se poté vyjadřují jako násobky nebo zlomky této základní jednotky. Nic nám pochopitelně nebrání definovat kdekoli v programu bod nebo jiný objekt o souřadnicích jako x=35mm; y=4.7cm;. Nicméně centrální definice délkové jednotky má tu výhodu, že zásahem do jediného místa v programu můžeme upravit měřítko obrázku.

Vztah k u zadáváme jen jednou (a je třeba to ohlídat).

a=25u; b=.7a;

U proměnné b už vztah k u zadávat nemusíme, protože ten byl zadán u definice proměnné a. Metapost by v takovém případě neohlásil žádnou chybu, ale proměnná b by byla škálována v u2.

Demonstrace funkcí pro náhodná čísla

Na závěr alespoň jeden kreslící kód a k němu příslušné obrázky:

Deviate

Kód produkuje dva obrázky. Příkazy draw kreslí osy, mezi for a endfor jsou cykly. Draw bude důkladně probrán v příštím díle, na podmínky, cykly a další prvky řízení chodu programů se dostane po probrání všech datových typů. Kód v příkladu vyprodukuje dva obrázky, z nichž jeden obsahuje kolečky zobrazené náhodné body vypočtené z funkce normaldeviate,

Normaldeviate

druhý obsahuje body vykreslené jako čtverečky, jejichž souřadnice byly vypočteny funkcí uniformdeviate.

Uniformdeviate

Povšiměte si, že tato funkce daleko pravidelněji pokrývá prostor vymezený pro body.

Třetí obrázek je vlastně první z ukázkového kódu, jenom těch cyklů nebylo sto, ale tisíc. Ukazuje lépe než ten první, že funkce normaldeviate má tendenci vytvářet vyšší hustotu bodů kolem středu souřadnic (0,0) a že s vyšším počtem opakování můžeme s vyšší pravděpodobností narazit i na body vzdálenější od tohoto středu.

ict ve školství 24

NormaldeviateB

Pokud si program opíšete a spustíte, povšimněte si (třeba přejmenováním již vygenerovaných obrázků), že náhodná čísla vycházející z těchto funkcí jsou pokaždé jiná. To mj. znesnadňuje až znemožňuje použití těchto funkcí u obrázků určených ke tvorbě animací.

Příště

V příštím díle se konečně dostaneme k datovým typům, které odpovídají reálně zobrazitelným grafickým prvkům. Probereme datový typ pair a začneme velice náročný a rozsáhlý datový typ path.

Autor článku