Obsah
1. Logo a matematika
2. Dostupné matematické a logické funkce
3. Kreslení grafů funkcí
4. Graf funkce zadané formou parametru
5. Složitější příklad: princip harmonické analýzy
6. Generátor náhodných čísel
7. Kreslíme „náhodné“ sněhové vločky
8. Odkazy na další informační zdroje
9. Obsah následující části tohoto seriálu
1. Logo a matematika
V úvodních částech Letní školy programovacího jazyka Logo bylo uvedeno, že Logo bylo vytvořeno s ohledem na to, aby tento programovací jazyk bylo možné používat i pro výuku, zejména na základních školách. Pro mladší „adepty na programátory“ je určena především želví grafika a s ní související základní příkazy pro ovládání želvy. Ovšem i na základních školách se v hodinách matematiky vysvětlují některé poznatky z algebry, geometrie atd. Z tohoto důvodu Logo obsahuje ucelenou řadu matematických a logických funkcí, které lze ve vytvářených programech použít. Samozřejmě se nejedná o specializovaný nástroj typu Octave, Matlab či Mathematica, ovšem běžné potřeby výuky i praxe Logo pokrývá. Navíc však existují i rozsáhlé balíky knihoven, určených zejména pro NetLogo (viz druhá část tohoto seriálu), kterými se tento programovací jazyk může rozšiřovat i o prostředky určené pro numerické a symbolické výpočty atd.
Ze syntaktického hlediska je zápis funkcí možný dvěma způsoby. Buď se v programu nejprve uvede jméno funkce, za nímž následují parametry oddělené bílými znaky (mezerami, tabulátorem). Parametry se nezapisují do závorek ani se neoddělují čárkou, jak je to obvyklé u jazyků, jejichž pradědečkem je Fortran. Druhý způsob, který některá Loga pro složitější funkce, tj. pro funkce s proměnným počtem parametrů zavádí, je založený na LISPovské syntaxi: funkce je i se svými parametry zapsána mezi kulaté závorky a parametry se opět od sebe oddělují pouze bílým znakem, nikoli čárkou. Tento druhý způsob je nutné použít u funkcí, které akceptují předem neznámý počet parametrů. Typickým příkladem je funkce sum (součet řady čísel), kterou je možné volat oběma způsoby. Při použití prvního způsobu lze sečíst pouze dva argumenty (má tedy stejný význam jako operátor +), druhý způsob zápisu funkce nám dovolí použít libovolné množství argumentů, což je patrné z následujícího příkladu (kurzívou je označen výpis interpreteru Loga):
show sum 10 20
30
show sum 10 20 100
30
You don't say what to do with 100 - chybný počet argumentů
show (sum 10 20)
30
show (sum 10 20 100)
130
2. Dostupné matematické a logické funkce
Matematické a logické funkce můžeme rozdělit do několika kategorií. V následujících tabulkách jsou vypsány aritmetické funkce, logické funkce, goniometrické funkce atd.
Základní aritmetické funkce
Jméno funkce | Význam |
---|---|
sum | součet dvou čísel nebo (pro LISPovskou syntaxi) libovolně dlouhé řady čísel |
difference | rozdíl dvou čísel |
minus | obrací znaménko argumentu |
product | vynásobení dvou čísel nebo (pro LISPovskou syntaxi) libovolně dlouhé řady čísel |
quotient | dělení celočíselných či reálných čísel (podle typu dat) |
remainder | zbytek po dělení |
int | převod reálného čísla na nejbližší celočíselnou hodnotu |
round | zaokrouhlení reálného čísla na celočíselnou hodnotu |
Pokročilejší funkce
Jméno funkce | Význam |
---|---|
sqrt | druhá odmocnina zadané číselné hodnoty (platí pouze pro nezáporné parametry) |
power | výpočet xy, kde x a y jsou hodnoty argumentů |
exp | výpočet ex, kde e je Eulerova konstanta |
log10 | výpočet desítkového logaritmu |
ln | výpočet přirozeného logaritmu (o základu e) |
Goniometrické funkce
Jméno funkce | Význam |
---|---|
sin | výpočet funkce sinus pro úhel zadaný ve stupních |
cos | výpočet funkce kosinus pro úhel zadaný ve stupních |
arctan | výpočet funkce arkustangent, výsledek je vrácený ve stupních |
(arctan x y) | výpočet funkce arkustangent pro hodnotu y/x – obdoba céčkovské funkce atan2() |
radsin | výpočet funkce sinus pro úhel zadaný v radiánech |
radcos | výpočet funkce kosinus pro úhel zadaný v radiánech |
radarctan | výpočet funkce arkustangent, výsledek je vrácený v radiánech |
Bitové funkce
Jméno funkce | Význam |
---|---|
bitand | operace logického součinu prováděná bit po bitu |
bitor | operace logického součtu prováděná bit po bitu |
bitxor | operace logické non-ekvivalence prováděná bit po bitu |
bitnot | negace prováděná bit po bitu |
ashift | aritmetický posun hodnoty doleva či doprava (podle znaménka druhého parametru) |
lshift | logický posun hodnoty doleva či doprava (podle znaménka druhého parametru) |
Logické funkce
Jméno funkce | Význam |
---|---|
and | operace logického součinu |
or | operace logického součtu |
not | operace logické negace |
3. Kreslení grafů funkcí
Předchozí kapitola byla pro většinu čtenářů zcela jistě nudná (ostatně jako většina textů, které se podobají referenční příručce), takže si pojďme na praktických příkladech ukázat, jakým způsobem lze některé výše uvedené funkce vykreslit. Samotný graf funkce je z mnoha ohledů vhodný i pro výuku – lze na něm prakticky ukázat mnohé vlastnosti funkcí, jako je jejich monotónnost, periodicita, lokální minima a maxima, inflexní body atd. Tyto pojmy sice patří až do „vyšší“ matematiky, je však možné je pochopit i intuitivně. V následujícím příkladu je ukázáno, jakým způsobem lze vytvořit program pro vykreslení průběhu jedné periody funkce sinus. Nejprve jsou pomocí procedury osy nakresleny souřadné osy a posléze se v proceduře graf pomocí programové smyčky vykreslí graf zadané funkce (barva vykreslení grafu funkce je odlišná od implicitní barvy použité pro kreslení os).
Pro vlastní vykreslení grafu funkce je použita absolutní grafika, tj. nejsou používány tradiční příkazy pro relativní natočení a posun želvy, ale procedura setpos sloužící pro její absolutní pozicování v rámci globálního souřadného systému. Vzhledem k tomu, že procedura setpos vyžaduje jako svůj argument souřadnice zadané v seznamu, je nutné použít proceduru list pro vytvoření nového seznamu obsahujícího požadovanou dvojici souřadnic:
; vykreslení souřadných os
to osy
setpencolor 7
penup
setpos [-150 0]
pendown
right 90
forward 360
penup
setpos [-150 70]
pendown
setpos [-150 -70]
end
; vykreslení grafu funkce
to graf
setpencolor 2
penup
setpos [-150 0]
pendown
make "x 0
repeat 360 [
make "x :x + 1
make "y 70.0*sin :x
setpos list (:x - 150 ):y
]
end
; samotné vytvoření grafu i se souřadnými osami
to kresli
clearscreen
osy
graf
end
(draw 300 300)
kresli

4. Graf funkce zadané formou parametru
Předchozí příklad má několik nectností. Jednou z nich je, že funkce, jejíž průběh se má vykreslit, je pevně „zadrátovaná“ přímo v programovém kódu procedury graf. To není z mnoha ohledů ideální řešení, zejména v případě, že program má sloužit pro výuku a testování vlastností dalších matematických funkcí. Pokusme se tuto nectnost programu odstranit. Můžeme přitom využít faktu, že se v Logu dá pomocí parametrů předávat i programový kód. Pokud je tento kód zapsán formou řetězce, není proveden (spuštěn) ve chvíli volání nějaké procedury, ale až ve chvíli, kdy tento kód předáme například proceduře invoke (nebo apply popř. map, ale o těchto funkcích si povíme někdy příště). Jedno z možných řešení je tedy předávat funkci graf jméno funkce, jejíž průběh se má vykreslit, a ve chvíli, kdy se počítá hodnota proměnné y pak zavolat proceduru invoke s parametrem :funkce. Vše je ukázáno v následujícím programovém kódu:
; vykreslení lokálních souřadných os pro vytvoření průběhu funkce
to osy
setpencolor 7
penup
setpos [-150 0]
pendown
right 90
forward 360
penup
setpos [-150 70]
pendown
setpos [-150 -70]
end
; vykreslení grafu funkce
to graf2 :funkce :barva
setpencolor :barva
penup
setpos [-150 0]
pendown
make "x 0
repeat 360 [
make "x :x + 1
make "y 70.0*invoke :funkce :x
setpos list (:x - 150 ):y
]
end
; samotné vytvoření grafu i se souřadnými osami
to kresli
clearscreen
osy
graf2 "sin 5
graf2 "cos 6
end
kresli

Může se stát, že budeme potřebovat vykreslit nějakou složitější funkci, například sin 2× × cos x. Řešení je jednoduché: Logo nerozlišuje mezi interními a uživatelskými procedurami. To znamená, že postačuje vytvořit novou proceduru, která bude akceptovat jeden číselný parametr a bude pomocí procedury output vracet číselnou hodnotu. Jméno této funkce (chování má stejné, jako matematicky chápaná funkce) je možné předat proceduře graf2, což je patrné z následujícího demonstračního příkladu, ve kterém je vytvořena nová uživatelská matematická funkce nazvaná sin2cos, jejíž průběh je vykreslen spolu s průběhem goniometrických funkcí sinus a kosinus:
; vykreslení lokálních souřadných os pro vytvoření průběhu funkce
to osy
setpencolor 7
penup
setpos [-150 0]
pendown
right 90
forward 360
penup
setpos [-150 70]
pendown
setpos [-150 -70]
end
; vykreslení grafu funkce
to graf2 :funkce :barva
setpencolor :barva
penup
setpos [-150 0]
pendown
make "x 0
repeat 360 [
make "x :x + 1
make "y 70.0*invoke :funkce :x
setpos list (:x - 150 ):y
]
end
; nová funkce, jejíž průběh se má vykreslit
to sin2cos :x
output sin :x*2 * cos :x
end
; samotné vytvoření grafu i se souřadnými osami
to kresli
clearscreen
osy
graf2 "sin 5
graf2 "cos 6
graf2 "sin2cos 4
end
kresli

5. Složitější příklad: princip harmonické analýzy
Goniometrické funkce se samozřejmě dají použít i ve složitějších aplikacích. Ukažme si program pro vykreslení průběhu periodického signálu složeného z několika sinusových signálů. Poměry kmitočtů sousedních sinusových signálů jsou 1:2. Na tomto příkladu lze vysvětlit například princip harmonické analýzy či syntézy audio signálů. Harmonická analýza je, velmi zjednodušeně řečeno, založena na rozkladu libovolného periodického signálu na sinusové a kosinusové průběhy s poměrem kmitočtů 1:2n; jediné, co se mění, jsou amplitudy těchto průběhů (http://tlapicka.net/pokusy_analyza.php). V aplikaci, jejíž zdrojový kód je vypsán níže, je možné samostatně vykreslit jak průběhy tří bázových sinusových funkcí, tak i součet těchto funkcí. Amplitudy jsou předávány jako parametry procedury synteza, povoleny jsou i záporné amplitudy. Aplikaci by šlo rozšířit tak, aby procedura synteza mohla vykreslit signál složený z libovolného počtu sinusových funkcí. K tomu slouží takzvané nepovinné parametry, jejichž princip však bude vysvětlen až v navazujících částech tohoto seriálu.
; vykreslení lokálních souřadných os pro vytvoření průběhu funkce
to osy :posun
setpencolor 7
penup
setpos list -150 (0 + :posun)
pendown
setheading 90
forward 360
penup
setpos list -150 (80 + :posun)
pendown
setpos list -150 (-80 + :posun)
end
; vykreslení průběhu jednoho signálu specifikovaného barvou a trojicí amplitud
to graf_syntezy :posun :color :a1 :a2 :a3
setpencolor :color
penup
setpos list -150 :posun
pendown
make "x 0
repeat 360 [
make "x :x + 1
; součet všech tří signálů o specifikovaných amplitudách
make "y :a1*sin :x
make "y :y+:a2*sin (:x*2)
make "y :y+:a3*sin (:x*4)
setpos list :x-150 :y+:posun
]
end
; vykreslení průběhů bázových funkcí i výsledného signálu
to synteza :a1 :a2 :a3
clearscreen
ht
osy 280
osy 100
osy -80
osy -260
graf_syntezy 280 3 :a1 0 0
graf_syntezy 100 2 0 :a2 0
graf_syntezy -80 4 0 0 :a3
graf_syntezy -260 6 :a1 :a2 :a3
end
(draw 400 400)
synteza 80 40 20
; existuje i možnost zápisu záporné amplitudy
; synteza 60 -40 30

6. Generátor náhodných čísel
Při psaní některých typů aplikací, například simulací či počítačových her, se neobejdeme bez takzvaných generátorů náhodných čísel (RNG – Random Number Generators). Ve skutečnosti se jedná o pseudonáhodné generátory (skutečně náhodná čísla vyžadují specializovaný hardware), ale například Berkeley Logo (dostupné i v Linuxu) používá generátor založený na céčkovské knihovně GNU, který i přes svoji pseudonáhodnost vykazuje dobré statistické vlastnosti.
Logo, podobně jako i další programovací jazyky, obsahuje funkci random, která vrací celočíselnou náhodnou hodnotu v rozsahu 0..(x-1), kde x je celočíselný parametr předávaný této funkci. Existuje i druhá možnost zápisu (random min max), při kterém je pomocí parametrů min a max zadán rozsah, ve kterém musí vygenerovaná náhodná hodnota ležet. Vzhledem k tomu, že je (například při ladění programů) vhodné, aby se generovaly stejné sekvence náhodných čísel, je možné pomocí zápisu (rerandom seed) nastavit tzv. semínko generátoru náhodných čísel na zadanou hodnotu seed. Pokud se naopak pouze zavolá procedura rerandom bez parametrů, je generátor náhodných čísel inicializován na hodnotu získanou z časovače a tedy obecně nereprodukovatelnou.

7. Kreslíme „náhodné“ sněhové vločky
V dnešním posledním demonstračním příkladu bude ukázáno, jakým způsobem lze využít generátor (pseudo)náhodných čísel pro vykreslení scény složené z několika sněhových vloček Helge von Kocha generovaných předminule popsaným rekurzivním algoritmem. Každá vykreslená vločka má nastavenou náhodnou velikost v rozmezí 10..110. Také umístění vločky v ploše je náhodné, protože před vykreslením každé vločky je nejprve želva natočena do libovolné pozice (left random 360) a posléze je posunuta o náhodnou hodnotu v rozmezí 20..220 kroků (forward 20+random 200). Aby té náhodnosti nebylo málo, je i barva každé vločky vybrána náhodně z intervalu 0..7 (jedná se o rozsah barev, který je podporovaný v použitém interpreteru Loga Turtle Tracks). Při spuštění programu se zadává celkový počet vloček, které se mají v počítané smyčce vygenerovat:
; vykreslení jedné strany vločky Helge von Kocha
to koch1 :a
ifelse :a>5 [
koch1 :a/3
right 60
koch1 :a/3
left 120
koch1 :a/3
right 60
koch1 :a/3
] [
forward :a
]
end
; vykreslení sněhové vločky Helge von Kocha
to kochova :a
repeat 3 [
koch1 :a
left 120
]
end
; náhodný posun želvy před vykreslením vločky
to nahodny_posun
penup
; alternativní možnost zápisu změny polohy želvy (jiný význam!)
; setpos list (-150 + random 300) (-150 + random 300)
home
left random 360
forward 20+random 200
pendown
end
; vykreslení celé scény s vločkami Helge von Kocha
to scena :opak
clearscreen
hideturtle
repeat :opak [
; nastavení barvy pro další kreslení
setpencolor random 8
nahodny_posun
kochova (10+random 100)
nahodny_posun
]
end
(draw 300 300)
scena 30

8. Odkazy na další informační zdroje
- Abelson H.:
Turtle geometry. The Computer as a Medium for Exploring Mathematics,
The MIT Press, Cambridge Massachusetts, 1981 - Clayson James:
Visual Modeling with Logo
MIT Press - Muller Jim:
The Great Logo Adventure
Young People's Logo Association: - Prusinkiewicz, Przemyslaw a Aristid Lindenmayer:
The Algorithmic Beauty of Plants
Springer-Verlag, 1990 - Tržilová Dana:
LOGO a matematika
JIHOČESKÁ UNIVERZITA V ČESKÝCH BUDĚJOVICÍCH, PEDAGOGICKÁ FAKULTA, 1993
učební text pro studenty výběrového semináře
9. Obsah následující části tohoto seriálu
V další části seriálu o programovacím jazyce Logo si vysvětlíme pokročilejší operace želví grafiky, pomocí kterých je možné vykreslovat vícebarevné obrazce, použít několik želv současně atd.