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
Cvičení z postscriptu

Cvičení z postscriptu

Pro zájemce jsou zde příklady, jak v postscriptu namalovat v různých měřítcích se opakující vzory.

Detaily jazyka nad rámec tohoto příkladu je možno nastudovat z manuálu [adobe.com] .


Obycejna cervena synteticka kytka

Výše uvedený obrázek se skládá z 300 lístků geometricky podobných tomuto:

Pocet listku se meni zmenou parametru N, ten urcuje pocet opakovani cyklu (zde N=1)

Jeden lístek nakreslíme pomocí Bezierova splinu takto:

  newpath                             %  nova cesta
  0 0 moveto % pocatek
300 40 300 -40 0 0 curveto  %  bezieruv listek (konci opet v pocatku)
  closepath

Abychom ale mohli snadno měnit velikost a tvar lístků

definueme si symboly w a D pomocí příkazu def. Lomítko před symbolem v postscriptu říká, že symbol se má chápat jménem a ne hodnotou.


/D 350 def % prumer kyticky
/w 40 def % sirka listku
newpath           %  nova cesta
     0 0 moveto                       %  pocatek
D w D w neg 0 0 curveto   %  bezieruv listek (konci opet v pocatku)
  closepath

Číslo -w jsme z w vyrobili zavoláním funkce pro otočení znaménka, tedy w neg.
Poté je třeba cestu obtáhnout a tutéž cestu znova vybarvit, proto
použijeme gsave/grestore.


  gsave                               %  schovej cestu a barvu
    0 0 0.8 setcolor                  %  modre
    stroke            %  obtahni
  grestore 
fill % a vypln

Číslo w můžeme změnit a nakreslit širší lístek.

Sirka listku se meni zmenou parametru w

Vykreslení lístku zapíšeme jako proceduru folia:

/folia {                              % procedure folia
newpath % nova cesta
0 0 moveto D w D w neg 0 0 curveto % bezieruv listek
closepath
gsave % schovej stav
0 0 0.8 setcolor % modre
stroke % obtahni
grestore % vrat stav, tj. priprav cestu
fill % vypln aktualni barvou
} def

Nyní je potřeba lístky vhodně otáčet a škálovat. Jak a proč se dočtete třeba zde [mcs.surrey.ac.uk] .
Nám stačí vědět, že úhel mezi lístky má být o delta = (sqrt(5)+1) *180 stupnu a plocha lístku má růst lineárně s úhlem, jeho velikost tedy roste jako odmocnina. Lístků budeme kreslit N.

/D 350 def                            % prumer kyticky
/w 40 def % sirka listku kyticky
/N 300 def % pocet listku v kvetu
/delta 5 sqrt 1 add 180 mul def % zlaty rez je nejiraciolanejsi cislo

Pro snadné zapsání budeme potřebovat provádět cyklus a to od větších lístků k menším.  Cyklus for se zapíše jako
spodnimez krok hornimez {prikazy tela cyklu} for.
Hodnota řídící proměnné cyklu je dostupná příkazům těla cyklu na vrchu zásobníku.

0 1 N 1 sub {                         % for i := 0 to N-1 do  (step 1)
1 0 0 setcolor
N sub neg N div % t := (N-i)/N
gsave
sqrt dup scale % Scale(sqrt(t),sqrt(t))
folia % zavolej proceduru folia
grestore % navrat k puvodnimu meritku
delta rotate % otoc o uhel delta
} for

Výsledný kód nemusíte slepovat z výše uvedených kousků, u každého obrázku je uveden v odkazu pod ním.

Malo listku (N=6). Je dobre videt poradi


Hodne uzkych listku (N=2000).

Chceme-li měnit barvu použijeme řídící proměnnou k výpočtu barvy, nejdříve jako obvykle spočteme hodnotu (N-i)/N, tu si pak na zásobníku zduplikujeme příkazem dup a použijeme ji jako zelenou komponentu pro poceduru setcolor. Protože ale ta očekává pořadí R G B setcolor, musíme k výchozímu  G přidat R a pak jejich pořadí G R prohodit příkazem exch, čímž získáme R G. Stačí přidat B=0 a můžeme zavolat setcolor.

  N sub neg N div                     %  t := (N-i)/N
dup 1 sub neg 1 exch 0 setcolor % SetRGBColor(1,1-t,0) ... prechod z cervene do zlute

Barvit listky lze treba takto: SetRGBColor(1,1-t,0)

V manuálu si můžeme přečíst jak funguje fukce rand pro náhodná celá čísla a použít ji.

Nahodna barva

Barvu také můžeme vytvořit podle vztahu SetColor(1, (i mod K)/K,0 ) a pro vhodně zvolené K nám vyjde:

Modulární barvení: SetColor(1,i mod 55,0)

Modulární barvení: SetColor(1,i mod 34,0)

nebo třeba

Barvení SetColor(1,i mod 71,0)

Taktéž můžeme měnit hodnotu úhlu poootočení, třeba na delta = (sqrt(3)+1) *180 :

delta = (1+sqrt(3))*180 & Barva modulo 71

nebo delta = (sqrt(7)+1) *180 :

delta = (1+sqrt(7))*180 & Barva modulo 71

Příjemnou zábavu.

.