MFF UK / Ústav teoretické fyziky / Tomáš Ledvinka
Přednášky
. . . . . . . . . . . . . . . . . . . . . . . . . .
Programování pro fyziky (1.r)
  Úvod
  Programy a algoritmy
  Píšeme program
  Píšeme program II
  Procedury a funkce
  Malujeme funkce
  Chyby. Typy I.
  Typy II. Pole a Záznamy
  Pole II.Řetězce.Soubory.
  Gnuplot.Interpolace...
  Matice. Velké O...
  Fronta,Zásobník. Postscript
    Fronta
    Zásobník
    Postscript I
    Postscript II
    Postscript - cvičení
  Bin. soubory, ...
  Ukazatele,Objekty, ...
Počítačová algebra
Klasická elektrodynamika (2.r)
Vybrané partie OTR

Cvičení
. . . . . . . . . . . . . . . . . . . . . . . . . .
Programování pro fyziky (1.r)
Teoretická mechanika (2.r)
Klasická elektrodynamika (2.r)


Věda
. . . . . . . . . . . . . . . . . . . . . . . . . .
Diskové zdroje v OTR
Hyperbolické systémy v OTR


Kontakt
. . . . . . . . . . . . . . . . . . . . . . . . . .
Email
Konzultační hodiny


Ostatní
. . . . . . . . . . . . . . . . . . . . . . . . .
Mallorca
Ze společnosti

Malujeme obrázek (v Postscriptu)

Pro malování grafů funkcí používáme již několik týdnů program gnuplot. Vstupem pro tento program jsou tabulky čísel a výstupem hotový obrázek s osami, stupnicemi, barevnými křivkami atd.. Co když budeme chtít namalovat něco jiného než graf funkce, třeba následující obrázek:

Tušíme, že bychom mohli zkusit najít vhodnou knihovnu (modul) a pak psát program který nám na obrazovku kreslí pomocí volání vhodných procedur, třeba

program Malovaci;
uses KnihovnaProMalovani;
begin
  NamalujCaru(...);
  NamalujTrojuhelnik(...);
  ...
end.

Opět bychom ale museli řešit otázku, jak schovat jednou namalovaný graf, jak jej začelnit do publikace či jen tak vytisknout na papír.

Nejjednodušší by mohlo být poznamenat si, jaké procedury, s jakými parametry a v jakém pořadí, voláme, a v případě potřeby, pak tato volání zopakovat. Nemůžeme se ale spolehnout, že příště bude naše výstupní medium mít stejné rozlišení. To pro obrazovku činí zhruba jeden megapixel, zatímco při tisku na papír A4 jde o desítky megapixelů. Náš záznam o malování by měl být vůči takovým změnám imunní. Právě proto místo povelů "obarvi puntík [241,1104] na modro" si musíme poznamenat něco jako na souřadnice 241,1104 namaluj kolečko o průměru 1. Takový příkaz lze splnit na obrazovce i na papíře, v jendom případě vystačíme s jedním pixlíkem, v druhém půje o stovky kapiček inkoustu. Terminologie: mluvíme v tomoto případě o vektorové grafice. Její základní vlastností je, že na kvalitnějším zařízení obdržíme lepší výsledky, jemnější čáry, kulatější křivky. Oproti tomu grafika založená na matici bodů nám na lepším zařízení dá jen lépe propracované čtverečky, pokud nezvětšíme rozměry matice, ale pak půjde již o jiná data. U vektorové grafiky půje dpokaždé o tentýž příkaz NamalujKřivku.

Jaký formát vektorové grafiky přesně zvolit za nás už vyřešili a to tentokrát v komerční sféře. A protože to udělali velmi dobře, vznikl standard grafického jazyka Postscript (R). Tak, jako jsme si zvykli, že program je nejlépe zapsat v textové podobě v nějakém jazyce a před jeho provedením na nějakém počítači si jej necháme přeložit, i u obrázku budeme mít jednu universální textovou podobu (postscriptový soubor). Pokud budeme chtít získat výsledek na papíře, můžeme se spolehnout, že každá lepší tiskárna soubor správně pochopí, pokud si jej budme chtít prohlédnout na obrazovce počítače, na každé myslitelné platformě (prozatím snad s výjimkou herních konzolí a mobilních telefonů) najdeme zdarma dostupný prohlížeč obvykle s názvem odvozemým ze slova GhostScript.

Čáry, plošky, barvy

Především, postscriptový obrázek je program. Na rozíl od Pascalu tento jazyk nerozlišuje deklarační výkonné části (protože, jak z časových důvodů neuvidíme, deklarace je v něm také příkazem), a tak ve své nejjednoušší podobě (jaká nám bude muset stačit) máme jen sérii volání procedur:

%priklad 1
newpath
 100 100 moveto
 500 800 lineto
 450 800 lineto
stroke
showpage

Zde vidíme základní principy. Především identifikátor procedury nepředchází parametry, jak je tomu v Pascalu. Naopak, všechna čísla, která napíšeme, uloží vykladač jazyka Poscscript na zásobník a odtud si je procedura (řekněmě lineto) vyzvedne.

Vzhledem ke způsobu předávání parametrů na zásobníku jsou totožné následující kusy kódu:
A: "100 100 moveto 500 800 lineto"

B: "500 800 100 100 moveto lineto"

Z hlediska grafických operací vidíme, že za účelem co největší universálnosti je proces malování trochu neobvyklý. Zkonstruujeme cestu (path) a to tak, že někde začne (moveto) pak pokračuje čarami (lineto) a, když jsme s cestou hotovi, cestu obtáhneme (stroke) nebo

%priklad 2
newpath
 100 100 moveto
 500 800 lineto
 450 800 lineto
fill
showpage

vybarvíme (fill). Cesta je před obtažením nebo vybarvením neviditlený objekt.

Zde vidíme, že z nějakých důvodů zvolili autoři jednotky tak, že na palec máme 72 bodů (formát A4 na výšku tak poskytuje k malování plochu [0-595]x[0-842] "bodů"). Slovo bod je zde názvem jednotky, dvaasedmdesátiny palce, nikoli jednotkou rozlišení. U běžných tiskových zařízení se totiž fyzické rozlišení pohybuje v desítkách pixelů na bod a proto samozřejmě můžeme používat přesnější polohu zadáním desetinných míst u čísel.

100.001 200.002 moveto

Druhou možností bude (viz dále) změnit měřítko a vystačit si s celočíselnými souřadnicemi, řekněme, v mikrometrech.

Barvy

Na počátku se předpokládá, že budeme malovat ve stupních šedi. To znamená, že u každého malovaného objektu můžeme nastavovat jeho jas a to voláním procedury setcolor s jedním reálným parametrem (0 = černá, 1 = bílá).

0.45 setcolor

Pokud chceme vytvářet barevný obrázek, musíme to oznámit zavoláním procedury setcolorspace se speciálním parametrem

/DeviceRGB setcolorspace 

a od té chvíle nastavujeme barvu zavoláním procedury setcolor se třemi parametry

%priklad 3
/DeviceRGB setcolorspace

40 setlinewidth 
1 0.5 0 setcolor
newpath 
400 100 moveto
100 400 lineto 
100 100 lineto 
400 100 lineto
stroke

0 0.5 0 setcolor
newpath 
500 100 moveto
100 500 lineto 
500 500 lineto 
500 100 lineto
closepath
stroke

showpage

Všiměte si na obrázku, že uzavření cesty procedurou closepath změní způsob, jímž jsou úsečky pospojovány. Proto je rozdíl, jestli namalujeme tři úsečky nebo lomenou cestu za tří úseček. Kromě toho, pokud jsou různé, closepath spojí konec a počátek aktuální cesty úsečkou.

 

.