Hlavní navigace

Patologické křivky a jiná matematická monstra

30. 9. 2021
Doba čtení: 49 minut

Sdílet

 Autor: Wikipedia, podle licence: CC-BY-SA
V deváté části seriálu o křivkách si popíšeme některé křivky, které byly po svém objevu nazývány „matematická monstra“, protože neodpovídaly tehdejším představám o chování „správných“ křivek.

Obsah

1. Patologické křivky a jiná matematická monstra

2. Průběh funkce y=sin 1/x

3. Weierstrassova funkce, Riemannova funkce atd.

4. Sněhová vločka Helge von Kocha

5. Dračí křivka

6. C-křivka

7. Gosperova křivka vyplňující plochu

8. Úvodní informace o L-systémech

9. Gramatiky a přepisovací pravidla

10. Úprava gramatik pro L-systémy

11. Želví grafika

12. Počítačová želva a programovací jazyk Python

13. Triviální L-systém: základ pro další demonstrační příklady

14. L-systém pro sněhovou vločku Helge von Kocha

15. L-systém pro C-křivku

16. L-systém pro dračí křivku

17. L-systém pro Gosperovu křivku

18. Malá odbočka – Cantorova množina

19. Repositář s demonstračními příklady

20. Odkazy na Internetu

1. Patologické křivky a jiná matematická monstra

Původní křivky byly, jak již víme, konstruovány čistě geometrickou cestou, s využitím kružítka a pravítka. Proto byly tyto křivky spojité a bylo je možné nakreslit jedním tahem tužky. Již Eukleidés, s nímž jsme se nepřímo setkali v předchozím textu, si ovšem uvědomoval, že geometrické konstrukce založené na použití pravítka a kružítka ve skutečnosti nedokážou popsat všechny tvary, s nimiž se lze setkat jak v přírodě (hod předmětu), tak i v architektuře. Proto se mj. začal věnovat studiu křivek, které dnes nazýváme kuželosečkami. Ovšem Eukleidés nebyl první, protože minimálně dvě z kuželoseček – konkrétně parabolu a hyperbolu – pro západní svět objevil Menaechmus (přítel Platóna) již okolo roku 350 př.n.l. Na Eukleida navázal jeho žák Apollónios z Pergy (cca 200 př.n.l.), který zavedl pojmenování „hyperbola“ a „parabola“, jenž jsme převzali a používáme dodnes. Ovšem i kuželosečky se chovaly „korektně“ – daly se nakreslit jedním tahem tužky.

Apollónios taktéž objevil, že hyperbola má dvě větve, zatímco Eukleidés pracoval pouze s větví v prvním kvadrantu. To byl první problém, protože obě větve hyperboly není pochopitelně možné nakreslit jedním tahem, takže se pojem křivky musel poněkud zobecnit. Později, vlastně už v novověku, kdy se začaly křivky popisovat analyticky, vznikly další problematické křivky, například křivky, které jsou spojité, ale v žádném bodě diferencovatelné, křivky s „dírami“ (příkladem je y=x/x), později taktéž fraktální křivky, dokonce křivky vyplňující celou plochu atd.

V době, kdy byly tyto tvary objeveny, je mnoho i velmi vzdělaných lidí považovalo za matematická monstra a odmítalo se jimi dále teoreticky i prakticky zabývat. Že se ze strany těchto lidí jednalo o velký omyl, se ukázalo až na začátku osmdesátých let minulého století s prudkým rozvojem fraktální geometrie – ony „monstrózní“ tvary totiž představovaly zjednodušené a minimalistické topologické podoby složitých přírodních útvarů a fyzikálních jevů. Opět se tedy musela přepsat definice toho, co je to křivka. Některé z těchto křivek si dnes ukážeme.

2. Průběh funkce y=sin 1/x

Jednou z křivek, která se chová „divně“, je křivka získaná vykreslením funkce y=sin 1/x v okolí nulové hodnoty x. Zde totiž křivka začíná stále rychleji oscilovat, což je ostatně (částečně) patrné i při pohledu na její průběh (ten je ovšem v okolí nuly jen odhadnut – přesně tuto křivku totiž nakreslit nelze!):

Obrázek 1: Průběh funkce y=sin 1/x.

Průběh této funkce lze získat tímto skriptem:

"""Průběh funkce y=sin 1/x."""
 
import numpy as np
import matplotlib.pyplot as plt
 
# hodnoty parametru x
x = np.linspace(0, 2, 500)
 
# výpočet bodů ležících na křivce vytvořené funkcí
y = np.sin(1/x)
 
# rozměry grafu při uložení: 640x480 pixelů
fig, ax = plt.subplots(1, figsize=(6.4, 4.8))
 
# titulek grafu
fig.suptitle('y=sin 1/x', fontsize=15)
 
# vrcholy na křivce pospojované úsečkami
ax.plot(x, y, 'g-')
 
# uložení grafu do rastrového obrázku
plt.savefig("sin_1_over_x.png")
 
# zobrazení grafu
plt.show()

3. Weierstrassova funkce, Riemannova funkce atd.

Mnohem slavnější je však Weierstrassova funkce, která je ve všech svých bodech spojitá, ale v žádném bodě nemá derivaci. Taktéž se jedná o soběpodobnou křivku, protože její zvětšené části se podobají tvaru celé křivky. Weierstrassova funkce je pro každou hodnotu x definována jako:

f(x) = ∑an cos(bnπx)

pro n od nuly do nekonečna a pro vhodně zvolené koeficienty a a b.

Poznámka: v praxi pochopitelně nepočítáme až do nekonečna, ale volí se vhodná nejvyšší hodnota n. Čím vyšší je tato hodnota, tím „méně hladký“ je její průběh.

Obrázek 2: Weirerstrassova funkce (resp. přesněji řečeno její hrubá aproximace).

Průběh Weierstrassovy funkce lze získat tímto skriptem:

"""Průběh Weierstrassovy funkce."""
 
import numpy as np
import matplotlib.pyplot as plt
 
# hodnoty parametru x
x = np.linspace(-2, 2, 500)
 
# úroveň detailů
details = 100
 
# koeficienty
a = 0.7
b = 7
 
def weierstrass(x, a, b, details):
    """Definice Weierstrassovy funkce."""
    w = 0
    for n in range(0, details):
        w += a**n*np.cos(b**n*np.pi*x)
    return w
 
# příprava na vlastní výpočet
y = np.vectorize(weierstrass)
 
# výpočet s převodem na typ numpy_array
approx = y(x, a, b, details)
 
# rozměry grafu při uložení: 640x480 pixelů
fig, ax = plt.subplots(1, figsize=(6.4, 4.8))
 
# titulek grafu
fig.suptitle('Wiererstrassova funkce', fontsize=15)
 
# vrcholy na křivce pospojované úsečkami
ax.plot(x, approx, 'g-')
 
# uložení grafu do rastrového obrázku
plt.savefig("weierstrass.png")
 
# zobrazení grafu
plt.show()

4. Sněhová vločka Helge von Kocha

Velmi známým fraktálem konstruovaným pomocí L-systémů, je křivka a sněhová vločka Helge von Kocha (jednalo se skutečně o muže). Popišme si nejdříve křivku Helge von Kocha, sněhová vločka vzniká pouhou (nepatrnou) změnou počátečních podmínek. Vytváření křivky Helge von Kocha spočívá v provedení následujících kroků:

  1. Nejprve se, podobně jako v případě Cantorovy množiny, vykreslí úsečka s jednotkovou délkou.
  2. Ve druhém kroku se tato úsečka rozdělí na třetiny, a to opět stejným způsobem, jako v případě Cantorovy množiny. Prostřední třetina se vyjme a na jejím místě se sestrojí dvě ramena rovnoramenného trojúhelníku. Vznikne tedy obrazec, který se skládá z lomené úsečky (polyčáry), jejíž délka je rovna 4/3 délky původní úsečky, tj. celková délka se o třetinu prodlouží.
  3. Na vzniklý obrazec se opakovaně aplikuje pravidlo uvedené v předchozím bodě, tj. každá úsečka je rozdělena na třetiny, prostřední třetina se vyjme a nahradí se dvojicí ramen rovnoramenného trojúhelníka.

Obrázek 3: První iterace křivky Helge von Kocha.

Obrázek 4: Druhá iterace křivky Helge von Kocha.

Obrázek 5: Třetí iterace křivky Helge von Kocha.

Obrázek 6: Čtvrtá iterace křivky Helge von Kocha.

Obrázek 7: Pátá iterace křivky Helge von Kocha.

Při trojnásobném zjemnění se délka křivky Helge von Kocha zvětší čtyřikrát, proto Hausdorffova (fraktální) dimenze není celočíselná. Pro N=4 se tedy měřítko musí zmenšit na třetinu:

s=1/3
N=4

Hausdorffova dimenze křivky Helge von Kocha se vypočítá jako:

D=log N/log (1/s)=log 4/log 3=1,2618595

Křivka Helge von Kocha má i další zajímavé matematické a geometrické vlastnosti. Mezi ně patří to, že sice je v celém svém rozsahu spojitá, ale v žádném bodě nemá derivaci. Každý bod na křivce je totiž po nekonečně mnoha transformacích průnikem dvou nekonečně malých úseček, které tvoří strany trojúhelníka, který je taktéž nekonečně malý. Tato křivka je také nekonečně dlouhá, i když zabírá konečný (z obou stran omezený) prostor, jak je ostatně patrné z obrázků.

Křivku Helge von Kocha je možné popsat pomocí následující gramatiky GKochCurve:

GKochCurve=[V,P,S]
V={F,+,–}
P={F→F=F+F–F+F}
 S=F

přičemž úhel otáčení želvy je nastaven na 60°

Sněhová vločka Helge von Kocha je vytvořena pomocí gramatiky GKochFlake, ve které je změněna pouze počáteční podmínka, tj. v první iteraci se nevykreslí pouhá úsečka, ale trojúhelník:

GKochFlake=[V,P,S]
V={F,+,–}
P={F→F=F+F–F+F}
S=F–F–F

5. Dračí křivka

Dračí křivka je dalším známým typem fraktálního objektu vytvářeného s využitím L-systémů. Její význam tkví především v tom, že její první iterace je možné vytvořit pouze pomocí ohýbání proužku papíru; žádné další složitější pomůcky nejsou zapotřebí. Postup tvorby dračí křivky je ukázán na následujícím animovaném obrázku. Začíná se s jednou úsečkou. Tato úsečka je ve své polovině ohnuta o pravý úhel doleva, takže vzniknou dvě úsečky navzájem svírající pravý úhel. Výsledkem je tvar zobrazený na zmíněné animaci:

Obrázek 8: Animace postupného vzniku dračí křivky.

Poté se již postupuje podobně jako u předchozích typů fraktálů, tj. iterativním způsobem. Obě úsečky jsou opět ohnuty, první o pravý úhel doleva, druhá o pravý úhel doprava. Výsledkem je čtveřice úseček tvořících lomenou čáru. Ohyb úseček probíhá podle popsaného principu dále a po několika iteracích se již začíná rýsovat tvar dračího těla i s ocasem a hlavou. Mimochodem, tento fraktál je velmi oblíbený například i mezi uživateli AutoCADu, kteří ho tvoří pomocí skriptů napsaných v LISPu.

Gramatika pro dračí křivku GDragon má tvar:

GDragon=[V,P,S]
V={X,Y,F,+,–}
P={Y→+FX–FY+, X→-FX++FY-}
S=FX
Poznámka: povšimněte si, že nyní jsou použita dvě přepisovací pravidla, nikoli pouze jedno.

6. C-křivka

Další „divnou“ křivkou, kterou lze vytvořit s využitím L-systémů je křivka připomínající písmeno C (C-curve). Jedná se o fraktální objekt vykreslený jednou lomenou čarou (polyčarou). Úhel „zalomení“ této polyčáry je vždy roven devadesáti stupňům a všechny úsečkové segmenty, ze kterých je polyčára složena, mají stejnou délku. Při bližším pohledu na celou konstrukci (viz první tři obrázky) zjistíme, že jde o rekurzivní křivku, tj. při každé iteraci se původní úsečkové segmenty rozdělí na dvě C-křivky, přičemž na poslední úrovni se pouze vykreslí horizontální či vertikální čára (podle aktuální orientace želvy). Při nastavení maximální úrovně iterace na nulu se vykreslí pouze vertikální úsečka (provede se kód za příkazem if), nastavení úrovně na jedničku má za následek vykreslení dvou na sebe kolmých úseček, při úrovni nastavené na dvojku se již vykreslí základ písmena „C“ atd.

Obrázek 9: C-křivka, malý počet přepisů L-systému (viz další text).

Obrázek 10: C-křivka.

Obrázek 11: C-křivka, velký počet přepisů L-systému.

7. Gosperova křivka vyplňující plochu

Některé křivky nebyly považovány za matematická „monstra“ pouze z toho důvodu, že neměly v žádném bodě derivaci. Existují totiž křivky, které dokážou vyplnit celou plochu nebo část plochy, což byla pro jednorozměrné útvary dosti neobvyklá vlastnost (se znalostí fraktální dimenze však dnes již víme, že nikoli neobvyklá). Mezi takové křivky patří například známá Hilbertova křivka. My si ovšem dnes pro zajímavost uvedeme jinou křivku, a to křivku Gosperovu, v níž se úsečky lomí v úhlu 60°. Způsob konstrukce této křivky je zřejmý z pohledu na další obrázky:

Obrázek 12: Gosperova křivka postupně vyplňující omezenou část plochy.

8. Úvodní informace o L-systémech

L-systémy, v minulosti též známé pod názvem Lindenmayerovy systémy, jsou skupinou fraktálů definovaných ve své nejjednodušší podobě pomocí regulárních nebo bezkontextových přepisovacích gramatik. Název této skupiny fraktálů, na jejichž výzkumu má největší podíl Aristid Lindenmayer a Przemyslaw Prusinkiewicz, pochází ze zkráceniny anglického sousloví Lindenmayer system nebo též LOGO-like turtle. LOGO je velmi zajímavý programovací jazyk vycházející z funkcionálního programovacího jazyka LISP (syntaxe je však „přezávorkovanému“ LISPu vzdálená), ve kterém se, kromě snadného zpracování datových struktur, dají s využitím jednoduchých příkazů pomocí takzvané želvy kreslit různé obrazce složené z úseček. S tímto zajímavým a ve světě oblíbeným programovacím jazykem jsme se ostatně na Rootu podrobněji seznámili v samostatném výukovém seriálu.

Podstatou tvorby těch nejjednodušších a nejpoužívanějších L-systémů je přepisování řetězců podle určitých pravidel, která jsou buď předem zadaná množinou přepisovacích pravidel (gramatiky), nebo se mění v průběhu generování fraktálního obrazce, například na základě zpětné vazby či na podněty okolního prostředí (gravitace, dopadající světlo apod.). Přepisování některých symbolů řetězce je většinou pevně dané, ale může být také určeno na základě generátoru náhodných čísel (stochastické L-systémy). Každý symbol v řetězci má přiřazen jistý geometrický význam, například transformaci či generování/nakreslení objektu. V případě použití želví grafiky se jedná o příkazy pro posun a natočení želvy (ale lze přidat i příkazy pro změnu typu či šířky kreslených úseček, pro změnu barvy, vyplnění obrazce atd.).

Zajímavé obrazce se začnou tvořit, jestliže v programu určeném pro LOGO použijeme iteraci resp. rekurzi, což odpovídá iteraci v gramatice, tj. stavu, kdy na pravé straně přepisovacího pravidla je nonterminální symbol shodný se symbolem na levé straně téhož pravidla (o terminálních a nonterminálních symbolech bude řeč v deváté kapitole). S pomocí L-systémů lze generovat fraktální objekty, které se podobají rostlinám, stromům a dalším přírodním útvarům. Poslední aplikace také směřují k využití těchto fraktálů při generování 3D modelů technologických artefaktů a dokonce i textur.

Z toho, jak se fraktál pomocí L-systémů generuje, je zřejmé, že se jedná o deterministický postup (pokud se při aplikaci přepisovacích pravidel nepoužije generátor náhodných čísel) a výsledný fraktál je tedy též deterministický. Těmto velmi pravidelným a mnohdy i symetrickým fraktálům se také někdy říká graftály. V dalších kapitolách se budeme zabývat právě deterministickými L-systémy, stochastickým systémům se budeme věnovat v některém z dalších částí tohoto seriálu.

Obrázek 13: Trojrozměrný L-systém.

9. Gramatiky a přepisovací pravidla

Naše povídání o L-systémech by nebylo úplné, pokud bychom si alespoň stručně nepopsali význam gramatik, přepisovacích pravidel a terminálních i nonterminálních symbolů. Gramatiky mají v teoretické informatice velký význam, zejména při studiu umělých jazyků (například programovacích). Gramatiku je možné popsat uspořádanou čtveřicí:

G=[N,Σ,P,S]

kde:

  • N je konečná abeceda nonterminálních symbolů
  • Σ je konečná abeceda terminálních symbolů
  • P je konečná množina přepisovacích pravidel tvaru A → B
  • S je axiom: neprázdná posloupnost symbolů Є (N u Σ)+

Přepisovací pravidla jsou tvaru S→aBC, B→XY, C→a, C→D (dokonce i XYZ=DB), kde velkými písmeny jsou označeny nonterminální symboly a písmeny malými symboly terminální (ty se již dále nerozepisují). Podle tvaru přepisovacích pravidel rozlišujeme gramatiky regulární, bezkontextové, kontextové a obecné (Chomského hierarchie). Regulární gramatiky jsou z této skupiny nejjednodušší (popisují množinu nejméně „složitých“ jazyků), avšak velmi často používané, protože jazyky z této množiny lze snadno popsat i rozpoznat, například velmi oblíbeným regulárním výrazem. L-systémy jsou většinou popsány právě regulárními gramatikami, i když poněkud upravenými, což si blíže popíšeme v následující kapitole.

10. Úprava gramatik pro L-systémy

V L-systémech je použita zjednodušená forma gramatik, ve kterých splývají terminální a nonterminální symboly. Deterministický bezkontextový L-systém je tvořen uspořádanou trojicí:

G=[V,P,S]

kde:

  • V je konečná abeceda symbolů (zde nerozlišujeme symboly terminální a nonterminální)
  • P je konečná množina pravidel tvaru A → B; AЄV; BЄV*
  • S je axiom: neprázdná posloupnost symbolů Є V+

Jak již bylo řečeno v předchozích odstavcích, u L-systémů se dělení na terminální a nonterminální symboly většinou formálně nezavádí, zejména proto, že počet derivací (přepisů) je libovolný a po proběhnutí zadaného počtu derivací se původně nonterminální symboly změní na symboly terminální, tj. symboly interpretovatelné želvou (viz další odstavce zabývající se želví grafikou). Determinismus tohoto L-systému pramení z podmínky, že v množině P nesmějí existovat dvě pravidla se stejnou levou stranou. Při přepisování tedy vždy přesně víme, které pravidlo pro přepis vybrat. Existují i další třídy gramatik, jejichž zpracování je však složitější, proto se při práci s L-systémy tyto gramatiky nepoužívají a místo nich se aplikují jiné (méně „vědecké“ resp. formalizované) metody; například se jedná o parametrizovatelné L-systémy, jejichž přepis do gramatik (přepisovacích pravidel) je sice teoreticky možný, ale v praxi těžko realizovatelný (byly by použity kontextové gramatiky).

Derivace (označovaná také matematickým symbolem →) řetězce AЄV* znamená paralelní přepsání všech symbolů XЄA řetězce V z pravé strany pravidel z množiny P.

Například první dvě derivace L-systému G:

G=[{A,F,–,+}, {A → F – – F – – F,F → F + F – – F + F,+ → +,– → -},A]

se startovním symbolem A mají podobu:

A → F – – F – – F → F + F – – F + F – – F + F – – F + F – – F + F – – F + F

(mezery mezi symboly jsou uvedeny pouze pro přehlednost, ve skutečnosti se ve výsledném řetězci nevyskytují). Poslední uvedená posloupnost symbolů získaná v poslední derivaci se ve druhém kroku geometricky interpretuje. K tomu se používá takzvaná želví grafika (turtle graphics), ve které želva reprezentuje pomyslné kreslící zařízení, pomocí kterého se vytváří obrazce složené z úseček.

11. Želví grafika

Takzvaná želví grafika (turtle graphics) tvoří základní nástroj použitý při vytváření deterministických L-systémů, jedná se i o nedílnou součást programovacího jazyka LOGO. Nyní si řekneme základní informace o želví grafice. Základem je takzvaná želva, která je definována svým stavem a tabulkou akcí, které může provádět – z hlediska OOP se tedy jedná o klasicky pojatý objekt, kde stavu želvy odpovídá obsah datových složek objektu a tabulka akcí odpovídá metodám, kterými se mění datové složky a provádí další činnosti.

Stav želvy se skládá ze dvou prvků: z polohy želvy a z její orientace. Želva čte sekvenčně zadaný řetězec (získaný v případě L-systémů několikerým přepsáním startovacího symbolu S) a pomocí tabulky akcí interpretuje jednotlivé symboly jako příkazy. Pro úplné zadání tedy musíme přiřadit každému symbolu jeho význam. Nejjednodušší forma L-systému interpretovaného želvou v ploše může používat následující symboly:

Symbol Příkaz pro želvu Význam symbolu
F draw forward posun želvy dopředu s kreslením úsečky
G move forward posun želvy dopředu bez kreslení úsečky
B draw backward posun želvy dozadu s kreslením úsečky
+ turn left natočení želvy doleva o předem známý počet stupňů
turn right natočení želvy doprava o předem známý počet stupňů

Želva se nachází na kreslicí ploše a pomocí výše uvedených symbolů (příkazů) se může otáček okolo své osy doprava a doleva, přesouvat se dopředu bez kreslení nebo se přesouvat dopředu i dozadu spolu s kreslením, tj. mezi počáteční a koncovou pozicí želvy je nakreslena úsečka (želva se vždy pohybuje ve směru či proti směru své orientace). Vhodnou kombinací všech příkazů je možné vykreslovat i zdánlivě kulaté tvary (posun o malý krok spolu s nepatrným natočením), což je ukázáno na dalším obrázku. Za povšimnutí stojí, že želva pro svůj posun nepotřebuje znát svoji absolutní polohu, je tedy nezávislá na souřadném systému.

Obrázek 14: Screenshot grafického okna interpreteru LOGA – UCB Logo (želva je po vytvoření screenshotu zvýrazněna červenou barvou)

12. Počítačová želva a programovací jazyk Python

Želví grafika byla tak úspěšná a přitom implementačně jednoduchá, že se začala používat i mimo samotný jazyk Logo. To je mj. případ programovacího jazyka Python, který uživatelům nabízí standardní modul nazvaný turtle, jenž nabízí příkazy shodné s původním Logem. Modul turtle pro vykreslování používá Tkinter. Postup si ukážeme v dalších příkladech, v nichž vyřešíme i problematiku pomalého vykreslování celé scény, které sice nevadí při interaktivním ladění (tam naopak pomáhá), ale při kresbě složitějších obrazců již může být zpomalení neúnosné.

Obrázek 15: Želví grafika vykreslená v aplikaci, jejíž GUI bylo vytvořeno přes knihovnu appJar.

V prvním kroku musíme ve skriptu získat „želvu“, a to typicky zavoláním konstruktoru turtle.Turtle() (ten současně vytvoří i nové okno s kreslicí plochou). Dále je již možné s „želvou“ manipulovat běžným způsobem, tj. skrýt její sprite (obrázek), nastavit rychlost kreslení (0=nejvyšší rychlost :-) či barvu vykreslované křivky:

t = turtle.Turtle()
 
t.hideturtle()
t.speed(0)
t.pencolor("green")

Nakreslíme nějaký jednodušší obrazec, přitom nám postačí příkazy forward a right:

side = 0
angle = 117
 
for _ in range(160):
    t.forward(side)
    t.right(angle)
    side += 1

Příkazem forward posuneme želvou o zadaný počet jednotek dopředu, tedy ve směru její hlavičky. V implicitním nastavení má území, na kterém se želva pohybuje, rozměry 200×200 jednotek s počátkem souřadnic uprostřed plátna. Příkazem right se želva otočí doprava o zadaný počet stupňů (nikoli radiánů).

Obrázek 16: Obrazec vykreslený přes modul turtle.

13. Triviální L-systém: základ pro další demonstrační příklady

Nyní již máme k dispozici jak znalosti o L-systémech, tak i o želví grafice. Tyto znalosti nyní můžeme spojit dohromady. Vytvoříme si jednoduchý příklad (nerekurzivního!) obrazce, jímž je čtverec. Ten vykreslíme želví grafikou na základě řetězce s příkazy pro želvu, který byl vygenerován L-systémem.

Samotná část s implementací přepisu řetězce vypadá jednoduše:

def produce_control_string(axiom, rewrite_rules, n):
    """Výpočet řídicího řetězce."""
    s = axiom
    for i in range(n):
        tmp = ""
        for c in s:
            tmp += apply_rule(rewrite_rules, c)
        s = tmp
    return s

Aplikace zvoleného pravidla (přečteného z řetězce):

def apply_rule(rules, c):
    """Aplikace přepisovacího pravidla."""
    output = ""
    for rule, result in rules.items():
        if c == rule:
            return result
        else:
            output = c
    return output
Poznámka: pravidla jsou uložena v mapě, čímž se nám celý postup značně zjednodušil.

A konečně funkce, která na základě obsahu řetězce (například „F+FF-B+“) provede vykreslení s využitím želví grafiky:

def draw_l_system(control_string, step, angle, start_x, start_y):
    """Vykreslení L-systému na obrazovku s využitím želví grafiky."""
    # styl vykreslování
    color("red")
    pensize(2)
    penup()
    setpos(start_x, start_y)
    pendown()
 
    # projít všemi příkazy z řídicího řetězce
    for command in control_string:
        if command == "F":
            forward(step)
        elif command == "B":
            backward(step)
        elif command == "+":
            left(angle)
        elif command == "-":
            right(angle)
 
    # dokončení vykreslení a čekání na zavření okna
    done()

Celý skript bude vypadat následovně. Povšimněte si způsobu nastavení vlastností L-systému (úhel natočení želvy, krok, axiom):

"""Jednoduchý L-systém: vykreslení čtverce."""
 
from turtle import *
 
# krok želvy pro příkazy "F" a "B"
step = 300
 
# úhel otočení želvy pro příkazy "+" a "-"
angle = 90
 
# startovní symbol
axiom = "F"
 
# přepisovací pravidla
rewrite_rules = {}
rewrite_rules["F"] = "F+F+F+F"
 
# počet aplikací přepisovacích pravidel
iterations = 1
 
# počáteční pozice želvy
start_x = -150
start_y = -150
 
 
def apply_rule(rules, c):
    """Aplikace přepisovacího pravidla."""
    output = ""
    for rule, result in rules.items():
        if c == rule:
            return result
        else:
            output = c
    return output
 
 
def produce_control_string(axiom, rewrite_rules, n):
    """Výpočet řídicího řetězce."""
    s = axiom
    for i in range(n):
        tmp = ""
        for c in s:
            tmp += apply_rule(rewrite_rules, c)
        s = tmp
    return s
 
 
def draw_l_system(control_string, step, angle, start_x, start_y):
    """Vykreslení L-systému na obrazovku s využitím želví grafiky."""
    # styl vykreslování
    color("red")
    pensize(2)
    penup()
    setpos(start_x, start_y)
    pendown()
 
    # projít všemi příkazy z řídicího řetězce
    for command in control_string:
        if command == "F":
            forward(step)
        elif command == "B":
            backward(step)
        elif command == "+":
            left(angle)
        elif command == "-":
            right(angle)
 
    # dokončení vykreslení a čekání na zavření okna
    done()
 
 
# výpočet řídicího řetězce
control_string = produce_control_string(axiom, rewrite_rules, iterations)
print(control_string)
 
# vykreslení L-systému
draw_l_system(control_string, step, angle, start_x, start_y)

Obrázek 17: Výsledek běhu předchozího demonstračního příkladu.

14. L-systém pro sněhovou vločku Helge von Kocha

V dalším demonstračním příkladu je ukázáno využití L-systému pro vykreslení křivky Helge von Kocha, kterou jsme si popsali ve čtvrté kapitole. Zdrojový kód tohoto příkladu vypadá následovně:

"""Jednoduchý L-systém: sněhová vločka Helge von Kocha."""
 
from turtle import *
 
# krok želvy pro příkazy "F" a "B"
step = 300
 
# úhel otočení želvy pro příkazy "+" a "-"
angle = 60
 
# startovní symbol
axiom = "F"
 
# přepisovací pravidla
rewrite_rules = {}
rewrite_rules["F"] = "F+F--F+F"
 
# počet aplikací přepisovacích pravidel
iterations = 1
 
# počáteční pozice želvy
start_x = -440
start_y = 0
 
 
def apply_rule(rules, c):
    """Aplikace přepisovacího pravidla."""
    output = ""
    for rule, result in rules.items():
        if c == rule:
            return result
        else:
            output = c
    return output
 
 
def produce_control_string(axiom, rewrite_rules, n):
    """Výpočet řídicího řetězce."""
    s = axiom
    for i in range(n):
        tmp = ""
        for c in s:
            tmp += apply_rule(rewrite_rules, c)
        s = tmp
    return s
 
 
def draw_l_system(control_string, step, angle, start_x, start_y):
    """Vykreslení L-systému na obrazovku s využitím želví grafiky."""
    # styl vykreslování
    color("red")
    pensize(2)
    penup()
    setpos(start_x, start_y)
    pendown()
 
    # projít všemi příkazy z řídicího řetězce
    for command in control_string:
        if command == "F":
            forward(step)
        elif command == "B":
            backward(step)
        elif command == "+":
            left(angle)
        elif command == "-":
            right(angle)
 
    # dokončení vykreslení a čekání na zavření okna
    done()
 
 
# výpočet řídicího řetězce
control_string = produce_control_string(axiom, rewrite_rules, iterations)
print(control_string)
 
# vykreslení L-systému
draw_l_system(control_string, step, angle, start_x, start_y)

S výsledkem:

Obrázek 18: Výsledek běhu předchozího demonstračního příkladu.

Zvětšení počtu přepisů a zmenšení délky nakreslené úsečky:

"""Jednoduchý L-systém: sněhová vločka Helge von Kocha."""
 
from turtle import *
 
# krok želvy pro příkazy "F" a "B"
step = 33
 
# úhel otočení želvy pro příkazy "+" a "-"
angle = 60
 
# startovní symbol
axiom = "F"
 
# přepisovací pravidla
rewrite_rules = {}
rewrite_rules["F"] = "F+F--F+F"
 
# počet aplikací přepisovacích pravidel
iterations = 3
 
# počáteční pozice želvy
start_x = -440
start_y = 0
 
 
def apply_rule(rules, c):
    """Aplikace přepisovacího pravidla."""
    output = ""
    for rule, result in rules.items():
        if c == rule:
            return result
        else:
            output = c
    return output
 
 
def produce_control_string(axiom, rewrite_rules, n):
    """Výpočet řídicího řetězce."""
    s = axiom
    for i in range(n):
        tmp = ""
        for c in s:
            tmp += apply_rule(rewrite_rules, c)
        s = tmp
    return s
 
 
def draw_l_system(control_string, step, angle, start_x, start_y):
    """Vykreslení L-systému na obrazovku s využitím želví grafiky."""
    # styl vykreslování
    color("red")
    pensize(2)
    penup()
    setpos(start_x, start_y)
    pendown()
 
    # projít všemi příkazy z řídicího řetězce
    for command in control_string:
        if command == "F":
            forward(step)
        elif command == "B":
            backward(step)
        elif command == "+":
            left(angle)
        elif command == "-":
            right(angle)
 
    # dokončení vykreslení a čekání na zavření okna
    done()
 
 
# výpočet řídicího řetězce
control_string = produce_control_string(axiom, rewrite_rules, iterations)
print(control_string)
 
# vykreslení L-systému
draw_l_system(control_string, step, angle, start_x, start_y)

15. L-systém pro C-křivku

Prakticky stejným programem, pouze s využitím jiné sady přepisovacích pravidel a odlišného úhlu natočení želvy, získáme C-křivku, o níž jsme se taktéž zmínili v předchozím textu:

"""Jednoduchý L-systém: C-křivka."""
 
from turtle import *
 
# krok želvy pro příkazy "F" a "B"
step = 10
 
# úhel otočení želvy pro příkazy "+" a "-"
angle = 45
 
# startovní symbol
axiom = "F"
 
# přepisovací pravidla
rewrite_rules = {}
rewrite_rules["F"] = "+F--F+"
 
# počet aplikací přepisovacích pravidel
iterations = 8
 
# počáteční pozice želvy
start_x = -100
start_y = 0
 
 
def apply_rule(rules, c):
    """Aplikace přepisovacího pravidla."""
    output = ""
    for rule, result in rules.items():
        if c == rule:
            return result
        else:
            output = c
    return output
 
 
def produce_control_string(axiom, rewrite_rules, n):
    """Výpočet řídicího řetězce."""
    s = axiom
    for i in range(n):
        tmp = ""
        for c in s:
            tmp += apply_rule(rewrite_rules, c)
        s = tmp
    return s
 
 
def draw_l_system(control_string, step, angle, start_x, start_y):
    """Vykreslení L-systému na obrazovku s využitím želví grafiky."""
    # styl vykreslování
    color("red")
    pensize(2)
    penup()
    setpos(start_x, start_y)
    pendown()
 
    # projít všemi příkazy z řídicího řetězce
    for command in control_string:
        if command == "F":
            forward(step)
        elif command == "B":
            backward(step)
        elif command == "+":
            left(angle)
        elif command == "-":
            right(angle)
 
    # dokončení vykreslení a čekání na zavření okna
    done()
 
 
# výpočet řídicího řetězce
control_string = produce_control_string(axiom, rewrite_rules, iterations)
print(control_string)
 
# vykreslení L-systému
speed(0)
hideturtle()
draw_l_system(control_string, step, angle, start_x, start_y)

Obrázek 19: Výsledek běhu předchozího demonstračního příkladu.

Obrázek 20: Větší počet přepsání axiomu vede k detailnějšímu snímku.

16. L-systém pro dračí křivku

Vykreslení dračí křivky s využitím vhodně zvoleného L-systému je snadné, povšimněte si ovšem, že zde již máme dvě přepisovací pravidla (nikoli pouze jedno) a navíc se liší i axiom, tedy počáteční hodnota řetězce s příkazy pro želvu:

"""Jednoduchý L-systém: dračí křivka."""
 
from turtle import *
 
# krok želvy pro příkazy "F" a "B"
step = 20
 
# úhel otočení želvy pro příkazy "+" a "-"
angle = 90
 
# startovní symbol
axiom = "FX"
 
# přepisovací pravidla
rewrite_rules = {}
rewrite_rules["X"] = "X+YF+"
rewrite_rules["Y"] = "-FX-Y"
 
# počet aplikací přepisovacích pravidel
iterations = 9
 
# počáteční pozice želvy
start_x = -300
start_y = -150
 
 
def apply_rule(rules, c):
    """Aplikace přepisovacího pravidla."""
    output = ""
    for rule, result in rules.items():
        if c == rule:
            return result
        else:
            output = c
    return output
 
 
def produce_control_string(axiom, rewrite_rules, n):
    """Výpočet řídicího řetězce."""
    s = axiom
    for i in range(n):
        tmp = ""
        for c in s:
            tmp += apply_rule(rewrite_rules, c)
        s = tmp
    return s
 
 
def draw_l_system(control_string, step, angle, start_x, start_y):
    """Vykreslení L-systému na obrazovku s využitím želví grafiky."""
    # styl vykreslování
    color("red")
    pensize(2)
    penup()
    setpos(start_x, start_y)
    pendown()
 
    # projít všemi příkazy z řídicího řetězce
    for command in control_string:
        if command == "F":
            forward(step)
        elif command == "B":
            backward(step)
        elif command == "+":
            left(angle)
        elif command == "-":
            right(angle)
 
    # dokončení vykreslení a čekání na zavření okna
    done()
 
 
# výpočet řídicího řetězce
control_string = produce_control_string(axiom, rewrite_rules, iterations)
print(control_string)
 
# vykreslení L-systému
speed(0)
draw_l_system(control_string, step, angle, start_x, start_y)

Obrázek 21: Výsledek běhu předchozího demonstračního příkladu s dračí-křivkou.

Poznámka: pochopitelně i zde je možné modifikovat počet přepisů axiomu a tím pádem i úroveň detailů dračí křivky. Společně s touto změnou je nutné vhodným způsobem změnit i délku kroku želvy.

Obrázek 22: Detailnější dračí křivka.

17. L-systém pro Gosperovu křivku

V dnešním posledním demonstračním příkladu je realizována Gosperova křivka, opět s využitím knihovny turtle:

"""Jednoduchý L-systém: Gosperova-křivka."""
 
from turtle import *
 
# krok želvy pro příkazy "F" a "B"
step = 10
 
# úhel otočení želvy pro příkazy "+" a "-"
angle = 60
 
# startovní symbol
axiom = "F"
 
# přepisovací pravidla
rewrite_rules = {}
rewrite_rules["F"] = "F-G--G+F++FF+G-"
rewrite_rules["G"] = "+F-GG--G-F++F+G"
 
# počet aplikací přepisovacích pravidel
iterations = 4
 
# počáteční pozice želvy
start_x = 100
start_y = 250
 
 
def apply_rule(rules, c):
    """Aplikace přepisovacího pravidla."""
    output = ""
    for rule, result in rules.items():
        if c == rule:
            return result
        else:
            output = c
    return output
 
 
def produce_control_string(axiom, rewrite_rules, n):
    """Výpočet řídicího řetězce."""
    s = axiom
    for i in range(n):
        tmp = ""
        for c in s:
            tmp += apply_rule(rewrite_rules, c)
        s = tmp
    return s
 
 
def draw_l_system(control_string, step, angle, start_x, start_y):
    """Vykreslení L-systému na obrazovku s využitím želví grafiky."""
    # styl vykreslování
    color("red")
    pensize(2)
    penup()
    setpos(start_x, start_y)
    pendown()
 
    # projít všemi příkazy z řídicího řetězce
    for command in control_string:
        if command == "F" or command=="G":
            forward(step)
        elif command == "B":
            backward(step)
        elif command == "+":
            left(angle)
        elif command == "-":
            right(angle)
 
    # dokončení vykreslení a čekání na zavření okna
    done()
 
 
# výpočet řídicího řetězce
control_string = produce_control_string(axiom, rewrite_rules, iterations)
print(control_string)
 
# vykreslení L-systému
speed(0)
hideturtle()
draw_l_system(control_string, step, angle, start_x, start_y)

Obrázek 23: Výsledek běhu předchozího demonstračního příkladu s Gosperovou křivkou.

18. Malá odbočka – Cantorova množina

Článek, v němž se zmiňujeme o matematických „monstrozitách“ i o L-systémech by nebyl úplný, kdybychom se v něm nezmínili o Cantorově množině, která do určité míry změnila pohled na matematiku. Nejedná se o křivku v pravém slova smyslu, takže se skutečně jedná o malou odbočku.

Cantorova množina je pojmenována po matematikovi ruského původu, jehož celé jméno zní Georg Ferdinand Ludwig Philipp Cantor. Tento pravděpodobně nejjednodušší fraktál může být iterativně zkonstruován následujícím způsobem:

  1. Konstrukce začíná s úsečkou, která má jednotkovou délku. Tato úsečka se většinou kreslí ve vodorovné poloze, na konstrukci fraktálu však nemá orientace úsečky žádný vliv.
  2. Úsečka se rozdělí na tři stejně dlouhé části. Prostřední část (třetina) se vyjme, takže nám ve druhé iteraci vzniknou dvě úsečky, z nichž každá má třetinovou délku oproti úsečce původní.
  3. Rozdělování úseček a odstraňování jejich prostředních částí pokračuje iterativně dále a v limitě, tj. po provedení nekonečně mnoha iterací, získáme množinu bodů (úseček s nulovou délkou), které nejsou navzájem propojeny, protože mezi každou dvojicí sousedních bodů se nachází „díra“ (také s nulovou délkou) vzniklá postupným vyjímáním prostřední třetiny úseček.
  4. Po provedení předchozích třech bodů dostaneme fraktální obrazec, který však tvoří pouze část celé Cantorovy množiny. Aby vznikl skutečný fraktál, musíme vytvořený obrazec vzít a nekonečněkrát ho zkopírovat na přímce odpovídající orientaci původní úsečky. Vzdálenost mezi sousedními kopiemi obrazce je rovna dvěma, přičemž původní úsečka je jednotková. Tento krok je pro zachování symetrie měřítka nutný (jak na to upozornil již před cca 25 lety B. Mandelbrot), i když na něj v některé literatuře není myšleno.

Cantorovu množinu je možné popsat pomocí následující gramatiky GCantor:

GCantor=[V,P,S]
V={F,G}
P={F→FGF, G→GGG}
 S=F

Význam Cantorovy množiny

Cantorova množina je významná hned ze tří hledisek:

SW Radsomware2

  1. Z historického hlediska je důležité, že Cantor s pomocí své množiny (a také Cantorovy funkce) upozornil na některé do té doby ignorované aspekty algebry a geometrie. Přibližně ve stejné době prezentoval Weierstrass svoji slavnou funkci, která je sice spojitá, ale nediferencovatelná. Obě práce měly významný vliv na další vývoj matematiky a fyziky, která se v období kolem roku 1870 nacházela v krizi, která vyústila v celkovou změnu myšlení.
  2. Současně se jedná o nejjednodušší fraktální objekt, na kterém se snadno vysvětlují základní pojmy fraktální geometrie, zejména význam soběpodobnosti a nezávislosti na změně měřítka (prakticky nic jednoduššího, než množinu bodů ležících na úsečce není možné vymyslet). I výpočet fraktální dimenze Cantorovy množiny je poměrně jednoduchý. Také konstrukce Cantorovy množiny – alespoň pro prvních několik iterací – nevyžaduje prakticky žádné složité pomůcky, pouze pravítko a tužku. To neplatí například u Mandelbrotovy množiny, na jejíž výpočet je počítač nutností.
  3. Cantorovu množinu můžeme nalézt v mnoha složitějších dynamických systémech s fraktální charakteristikou. Například při vertikálním řezu bifurkačního diagramu získáme Cantorovu množinu. Totéž platí pro řez nespojitou Juliovou množinou atd. V některých případech se místo s termínem Cantorova množina setkáme s Cantorovým prachem (Cantor dust).

Obrázek 24: Způsob vzniku Cantorovy množiny.

19. Repositář s demonstračními příklady

Všechny dříve i dnes popisované demonstrační příklady určené pro Python 3 a knihovnu Matplotlib byly uloženy do Git repositáře, který je dostupný na adrese https://github.com/tisnik/pre­sentations. Příklady si můžete v případě potřeby stáhnout i jednotlivě bez nutnosti klonovat celý (dnes již poměrně rozsáhlý) repositář:

# Příklad Popis Adresa
1 line.py úsečka https://github.com/tisnik/pre­sentations/blob/master/cur­ves/line.py
2 parabola.py parabola https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parabola.py
3 hyperbola.py hyperbola https://github.com/tisnik/pre­sentations/blob/master/cur­ves/hyperbola.py
4 ellipse_parametric.py parametricky zadaná elipsa https://github.com/tisnik/pre­sentations/blob/master/cur­ves/ellipse_parametric.py
5 ellipse_general.py obecná elipsa https://github.com/tisnik/pre­sentations/blob/master/cur­ves/ellipse_general.py
6 circle_parametric.py parametricky zadaná kružnice https://github.com/tisnik/pre­sentations/blob/master/cur­ves/circle_parametric.py
7 circle_polar.py polární souřadnice při kreslení kružnice https://github.com/tisnik/pre­sentations/blob/master/cur­ves/circle_polar.py
8 archimedes_spiral.py Archimédova spirála https://github.com/tisnik/pre­sentations/blob/master/cur­ves/archimedes_spiral.py
9 fermats_spiral.py Fermatova spirála https://github.com/tisnik/pre­sentations/blob/master/cur­ves/fermats_spiral.py
10 hyperbolic_spiral.py Hyperbolická spirála https://github.com/tisnik/pre­sentations/blob/master/cur­ves/hyperbolic_spiral.py
11 logarithmic_spiral.py Logaritmická spirála https://github.com/tisnik/pre­sentations/blob/master/cur­ves/logarithmic_spiral.py
12 parabola_catenary1.py parabola vs. řetězovka https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parabola_catenary1.py
13 parabola_catenary2.py parabola vs. řetězovka https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parabola_catenary2.py
14 cardioid.py srdcovka https://github.com/tisnik/pre­sentations/blob/master/cur­ves/cardioid.py
15 catenary.py řetězovka https://github.com/tisnik/pre­sentations/blob/master/cur­ves/catenary.py
17 fresnel.py Fresnelův integrál https://github.com/tisnik/pre­sentations/blob/master/cur­ves/fresnel.py
19 lissajous.py Lissajousův obrazec https://github.com/tisnik/pre­sentations/blob/master/cur­ves/lissajous.py
       
20 superellipse1.py superelipsa https://github.com/tisnik/pre­sentations/blob/master/cur­ves/superellipse1.py
21 superellipse2.py superelipsa, ovšem s odlišnými parametry https://github.com/tisnik/pre­sentations/blob/master/cur­ves/superellipse2.py
22 cycloid.py cykloida https://github.com/tisnik/pre­sentations/blob/master/cur­ves/cycloid.py
23 epicycloid1.py epicykloida https://github.com/tisnik/pre­sentations/blob/master/cur­ves/epicycloid1.py
24 epicycloid2.py epicykloida, ovšem s odlišnými parametry https://github.com/tisnik/pre­sentations/blob/master/cur­ves/epicycloid2.py
25 hypocycloid1.py hypocykloida https://github.com/tisnik/pre­sentations/blob/master/cur­ves/hypocycloid1.py
26 hypocycloid2.py hypocykloida, ovšem s odlišnými parametry https://github.com/tisnik/pre­sentations/blob/master/cur­ves/hypocycloid2.py
27 hypotrochoid1.py hypotrochoida https://github.com/tisnik/pre­sentations/blob/master/cur­ves/hypotrochoid1.py
28 hypotrochoid2.py hypotrochoida, ovšem s odlišnými parametry https://github.com/tisnik/pre­sentations/blob/master/cur­ves/hypotrochoid2.py
29 hypotrochoid3.py hypotrochoida, ovšem s odlišnými parametry https://github.com/tisnik/pre­sentations/blob/master/cur­ves/hypotrochoid3.py
30 implicit/implicit.py křivka zadaná implicitní funkcí https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/implicit.py
       
31 3d_plot/parabola1A.py funkce pro parabolu ve 3D https://github.com/tisnik/pre­sentations/blob/master/cur­ves/3d_plot/parabola1A.py
32 3d_plot/parabola1B.py funkce pro parabolu ve 3D + kontury https://github.com/tisnik/pre­sentations/blob/master/cur­ves/3d_plot/parabola1B.py
33 3d_plot/parabola2A.py funkce pro parabolu ve 3D https://github.com/tisnik/pre­sentations/blob/master/cur­ves/3d_plot/parabola2A.py
34 3d_plot/parabola2B.py funkce pro parabolu ve 3D + kontury https://github.com/tisnik/pre­sentations/blob/master/cur­ves/3d_plot/parabola2B.py
35 3d_plot/hyperbolaA.py funkce pro hyperbolu ve 3D https://github.com/tisnik/pre­sentations/blob/master/cur­ves/3d_plot/hyperbolaA.py
36 3d_plot/hyperbolaB.py funkce pro hyperbolu ve 3D + kontury https://github.com/tisnik/pre­sentations/blob/master/cur­ves/3d_plot/hyperbolaB.py
37 3d_plot/sin_cos1.py goniometrická funkce ve 3D https://github.com/tisnik/pre­sentations/blob/master/cur­ves/3d_plot/sin_cos1.py
38 3d_plot/sin_cos2.py goniometrická funkce ve 3D https://github.com/tisnik/pre­sentations/blob/master/cur­ves/3d_plot/sin_cos2.py
39 anim/cassini_anim.py animace změny koeficientů Cassiniho oválu https://github.com/tisnik/pre­sentations/blob/master/cur­ves/anim/cassini_anim.py
40 anim/spiric_anim.py animace změny koeficientů průsečíku roviny s toroidem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/anim/spiric_anim.py
41 implicit/cassini1.py Cassiniho ovál https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/cassini1.py
42 implicit/cassini2.py Cassiniho ovál https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/cassini2.py
43 implicit/cassini3.py Cassiniho ovál https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/cassini3.py
44 implicit/cassini4.py Cassiniho ovál https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/cassini4.py
45 implicit/circle1.py kružnice specifikovaná implicitní funkcí https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/circle1.py
46 implicit/circle2.py kružnice specifikovaná implicitní funkcí https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/circle2.py
47 implicit/ellipse1.py elipsa specifikovaná implicitní funkcí https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/ellipse1.py
48 implicit/ellipse2.py elipsa specifikovaná implicitní funkcí https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/ellipse2.py
49 implicit/ellipse3.py elipsa specifikovaná implicitní funkcí https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/ellipse3.py
50 implicit/elliptic1.py eliptická křivka https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/elliptic1.py
51 implicit/elliptic2.py mřížka několika eliptických křivek https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/elliptic2.py
52 implicit/flower.py křivka připomínající květ https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/flower.py
53 implicit/hyperbola1.py hyperbola specifikovaná implicitní funkcí https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/hyperbola1.py
54 implicit/hyperbola2.py hyperbola specifikovaná implicitní funkcí https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/hyperbola2.py
55 implicit/line1.py přímka specifikovaná implicitní funkcí https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/line1.py
56 implicit/line2.py přímka specifikovaná implicitní funkcí https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/line2.py
57 implicit/parabola1.py parabola specifikovaná implicitní funkcí https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/parabola1.py
58 implicit/parabola2.py parabola specifikovaná implicitní funkcí https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/parabola2.py
59 implicit/sin_cos1.py implicitní funkce obsahující goniometrické funkce https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/sin_cos1.py
60 implicit/sin_cos2.py implicitní funkce obsahující goniometrické funkce https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/sin_cos2.py
61 implicit/spiric1.py řez toroidu plochou https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/spiric1.py
62 implicit/spiric2.py řez toroidu plochou https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/spiric2.py
63 implicit/spiric3.py řez toroidu plochou https://github.com/tisnik/pre­sentations/blob/master/cur­ves/implicit/spiric3.py
       
64 interpolation/lagrange_in­terpolation1.py interpolace Lagrangeovým polynomem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/interpolation/lagrange_in­terpolation1.py
65 interpolation/lagrange_in­terpolation2.py interpolace Lagrangeovým polynomem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/interpolation/lagrange_in­terpolation2.py
66 interpolation/lagrange_poly1.py konstrukce Lagrangeova polynomu https://github.com/tisnik/pre­sentations/blob/master/cur­ves/interpolation/lagrange_po­ly1.py
67 interpolation/lagrange_poly2.py konstrukce Lagrangeova polynomu https://github.com/tisnik/pre­sentations/blob/master/cur­ves/interpolation/lagrange_po­ly2.py
68 approximation/linear_regression1.py lineární regrese https://github.com/tisnik/pre­sentations/blob/master/cur­ves/approximation/linear_re­gression1.py
68 approximation/linear_regression2.py lineární regrese https://github.com/tisnik/pre­sentations/blob/master/cur­ves/approximation/linear_re­gression2.py
69 approximation/linear_regression3.py lineární regrese https://github.com/tisnik/pre­sentations/blob/master/cur­ves/approximation/linear_re­gression3.py
70 approximation/poly_regression1.py aproximace polynomem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/approximation/poly_re­gression1.py
71 approximation/poly_regression2.py aproximace polynomem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/approximation/poly_re­gression2.py
72 approximation/random_data_linear.py náhodná data pro lineární regresi https://github.com/tisnik/pre­sentations/blob/master/cur­ves/approximation/random_da­ta_linear.py
73 approximation/random_data_poly.py náhodná data pro aproximaci polynomem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/approximation/random_da­ta_poly.py
74 approximation/taylor_sin1.py aproximace funkce sin Taylorovým rozvojem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/approximation/taylor_sin.py
75 approximation/taylor_sin2.py aproximace funkce sin Taylorovým rozvojem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/approximation/taylor_sin.py
76 approximation/taylor_sin5.py aproximace funkce sin Taylorovým rozvojem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/approximation/taylor_sin.py
77 approximation/taylor_sin9.py aproximace funkce sin Taylorovým rozvojem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/approximation/taylor_sin.py
78 approximation/taylor_sin_x.py aproximace funkce sin Taylorovým rozvojem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/approximation/taylor_sin_x­.py
79 parametric/circle.py parametricky zadaná kružnice https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/circle.py
80 parametric/Bezier_basis.py Bernsteinovy polynomy https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Bezier_basis­.py
81 parametric/Bezier_cubic.py Bézierova kubika https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Bezier_cubic­.py
82 parametric/Bezier_kvadric.py Bézierova kvadrika https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Bezier_kva­dric.py
83 parametric/B-spline-1.py B-spline křivka https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/B-spline-1.py
84 parametric/B-spline-2.py B-spline křivka s násobnými body https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/B-spline-2.py
85 parametric/Coons_basis.py Coonsovy bázové polynomy https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Coons_basis­.py
86 parametric/Coons.py Coonsova křivka https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Coons.py
       
87 parametric/Bezier_cubic_basis.py bázové vektory Bézierovy kubiky https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Bezier_cubic_ba­sis.py
88 parametric/Bezier_cubic_basis_sum.py součet bázových vektorů Bézierovy kubiky https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Bezier_cubic_ba­sis_sum.py
89 parametric/Bezier_quadric_basis.py bázové vektory Bézierovy kvadriky https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Bezier_qua­dric_basis.py
90 parametric/Bezier_quadric_basis_sum.py součet bázových vektorů Bézierovy kvadriky https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Bezier_qua­dric_basis_sum.py
91 parametric/Bezier_quartic_basis.py bázové vektory Bézierovy quartiky https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Bezier_quar­tic_basis.py
92 parametric/Bezier_quartic_basis_sum.py součet bázových vektorů Bézierovy kvartiky https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Bezier_quar­tic_basis_sum.py
93 parametric/Bezier_quintic_basis.py bázové vektory Bézierovy quintiky https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Bezier_quin­tic_basis.py
94 parametric/Bezier_quintic_basis_sum.py součet bázových vektorů Bézierovy quintiky https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Bezier_quin­tic_basis_sum.py
95 parametric/Catmul-Rom_basis.py bázové vektory Catmul-Romovy spline https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Catmul-Rom_basis.py
96 parametric/Catmul-Rom_basis_sum.py součet bázových vektorů Catmul-Romovy spline https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Catmul-Rom_basis_sum.py
97 parametric/Catmul-Rom_cubic.py Catmul-Romova kubika https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Catmul-Rom_cubic.py
98 parametric/Catmul-Rom_spline_A.py Catmul-Romova spline https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Catmul-Rom_spline_A.py
99 parametric/Catmul-Rom_spline_B.py Catmul-Romova spline procházející koncovými body https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Catmul-Rom_spline_B.py
100 parametric/Coons_basis2.py bázové vektory Coonsovy kubiky https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Coons_basis.py
101 parametric/Coons_basis_sum.py součet bázových vektorů Coonsovy kubiky https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Coons_basis_sum­.py
102 parametric/linear_basis.py bázové vektory lineární interpolace https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/linear_basis­.py
103 parametric/linear_basis_sum.py součet bázových vektorů lineární interpolace https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/linear_basis_sum­.py
104 parametric/linear_interpolation.py zobrazení lineární interpolace https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/linear_inter­polation.py
       
105 parametric/B-spline-3.py B-spline křivka se čtyřmi segmenty, u níž se mění pozice prostředního řídicího bodu https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/B-spline-3.py
106 parametric/Catmul-Rom_spline_C.py Catmul-Romova spline, u níž se mění pozice prostředního řídicího bodu https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Catmul-Rom_spline_C.py
107 anim/B-spline-anim.py B-spline křivka se čtyřmi segmenty, u níž se postupně mění pozice prostředního řídicího bodu https://github.com/tisnik/pre­sentations/blob/master/cur­ves/anim/B-spline-anim.py
108 anim/Catmul-Rom_spline-anim.py Catmul-Romova spline křivka se čtyřmi segmenty, u níž se postupně mění pozice prostředního řídicího bodu https://github.com/tisnik/pre­sentations/blob/master/cur­ves/anim/Catmul-Rom_spline-anim.py
109 parametric/B-spline-4.py Parametrická křivka: B-spline složená z Coonsových oblouků, násobné body na začátku a konci https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/B-spline-4.py
110 parametric/Catmul-Rom_spline_D.py Parametrická křivka: Catmul-Romova spline, násobné body na začátku a na konci https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Catmul-Rom_spline_D.py
111 parametric/B-spline-5.py Parametrická křivka: B-spline složená z Coonsových oblouků, násobné body uprostřed křivky https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/B-spline-5.py
112 parametric/Catmul-Rom_spline_E.py Parametrická křivka: Catmul-Romova spline, násobné body uprostřed křivky https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Catmul-Rom_spline_E.py
113 parametric/Hermite_basis.py bázové polynomy Hermitovy křivky https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Hermite_ba­sis.py
114 parametric/Hermite_spline.py Hermitova křivka https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Hermite_spli­ne.py
       
115 spirals/trivial_spiral.py triviální spirála – kružnice https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/trivial_spiral­.py
116 spirals/archimedean_spiral.py Archimédova spirála https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/archimedean_spi­ral.py
117 spirals/fermat_spiral.py Fermatova spirála https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/fermat_spiral­.py
118 spirals/hyperbolic_spiral.py Hyperbolická spirála https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/hyperbolic_spi­ral.py
119 spirals/hyperbolic_spiral2.py Hyperbolická spirála se dvěma rameny https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/hyperbolic_spi­ral2.py
120 spirals/logarithmic_spiral.py Logaritmická spirála https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/logarithmic_spi­ral.py
121 spirals/atomic_spiral1.py Atomická spirála, první verze https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/atomic_spiral.py
122 spirals/atomic_spiral2.py Atomická spirála, korektní verze verze https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/atomic_spiral.py
123 spirals/lituus.py Lituus https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/lituus.py
124 spirals/ifs.py Vykreslení různých systémů iterovaných funkcí https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/ifs.py
125 spirals/mandelbrot_matplotlib.py Vykreslení Mandelbrotovy množiny, postaveno na knihovně Matplotlib https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/mandelbrot_mat­plotlib.py
126 spirals/mandelbrot_pil.py Vykreslení Mandelbrotovy množiny, postaveno na knihovně PIL/Pillow https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/mandelbrot_pil­.py
127 spirals/mandelbrot_spirals.py Spirály nalezené v Mandelbrotově množině https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/mandelbrot_spi­rals.py
128 spirals/julia_spirals.py Spirály nalezené v Juliových množinách https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/julia_spirals­.py
129 spirals/palette_blues.py Barvová paleta, kterou je možné použít v předchozích třech příkladech https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/palette_blues­.py
130 spirals/palette_greens.py Barvová paleta, kterou je možné použít v předchozích třech příkladech https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/palette_green­s.py
131 spirals/palette_mandmap.py Barvová paleta, kterou je možné použít v předchozích třech příkladech https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/palette_mandmap­.py
       
132 spirals/fresnel_integral_s.py Fresnelův integrál S(x) https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/fresnel_integral_s­.py
133 spirals/fresnel_integral_c.py Fresnelův integrál C(x) https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/fresnel_integral_c­.py
134 spirals/fresnel_integral_c_s.py Průběhy Fresnelových integrálů S(x) i C(x) https://github.com/tisnik/pre­sentations/blob/master/cur­ves/spirals/fresnel_integral_c_s­.py
       
135 monsters/lsystem_c_curve1.py C-křivka vykreslená L-systémem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/monsters/lsystem_c_cur­ve1.py
136 monsters/lsystem_c_curve2.py C-křivka vykreslená L-systémem pro jiný počet přepisů https://github.com/tisnik/pre­sentations/blob/master/cur­ves/monsters/lsystem_c_cur­ve2.py
137 monsters/lsystem_dragon1.py Dračí křivka vykreslená L-systémem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/monsters/lsystem_dragon.py
138 monsters/lsystem_dragon2.py Dračí křivka vykreslená L-systémem pro jiný počet přepisů https://github.com/tisnik/pre­sentations/blob/master/cur­ves/monsters/lsystem_dragon.py
139 monsters/lsystem_gosper_curve.py Gosperova křivka vykreslená L-systémem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/monsters/lsystem_gosper_cur­ve.py
140 monsters/lsystem_snowflake1.py Sněhová vločka Helge von Kocha https://github.com/tisnik/pre­sentations/blob/master/cur­ves/monsters/lsystem_snow­flake1.py
141 monsters/lsystem_snowflake2.py Sněhová vločka Helge von Kocha, odlišný počet iterací https://github.com/tisnik/pre­sentations/blob/master/cur­ves/monsters/lsystem_snow­flake2.py
142 monsters/lsystem_snowflake3.py Sněhová vločka Helge von Kocha, odlišný počet iterací https://github.com/tisnik/pre­sentations/blob/master/cur­ves/monsters/lsystem_snow­flake3.py
143 monsters/lsystem_square.py Jednoduchý čtverec vykreslený L-systémem https://github.com/tisnik/pre­sentations/blob/master/cur­ves/monsters/lsystem_squa­re.py
144 monsters/sin1_over_x.py Průběh funkce y=sin 1/x https://github.com/tisnik/pre­sentations/blob/master/cur­ves/monsters/sin1_over_x.py
145 monsters/weierstrass.py Wiererstrassova funkce https://github.com/tisnik/pre­sentations/blob/master/cur­ves/monsters/weierstrass.py

20. Odkazy na Internetu

  1. The spiral: the eternal sign of the creative and organising principle at work in the universe
    https://geoffjward.medium.com/the-spiral-the-eternal-sign-of-the-creative-and-organising-principle-at-work-in-the-universe-8889ba092300
  2. Speira(Spiral): one of the oldest and most powerful symbols in the world
    https://www.greecehighdefi­nition.com/blog/speira-spiral-oldest-greek-symbols-in-the-world-ancient-greece
  3. Spirals
    https://web.stanford.edu/~si­egelr/photography/spirals­.html
  4. Why Do Spirals Exist Everywhere in Nature?
    https://www.samwoolfe.com/2014/05/spi­rals-everywhere.html
  5. Patterns In Nature: Where to Spot Spirals
    https://www.scienceworld.ca/sto­ries/patterns-nature-where-spot-spirals/
  6. Spirals in Nature
    https://extension.illinois­.edu/blogs/naturalist-news/2021–06–23-spirals-nature
  7. The Curves of Life (Dover Books Explaining Science)
    https://www.amazon.com/Curves-Dover-Books-Explaining-Science/dp/048623701X
  8. Famous Curves Index
    https://mathshistory.st-andrews.ac.uk/Curves/
  9. Curve (Wikipedia)
    https://en.wikipedia.org/wiki/Curve
  10. Mathematical curves
    https://www.2dcurves.com/index.html
  11. Curves (Wolfram MathWorld)
    https://mathworld.wolfram­.com/topics/Curves.html
  12. Smooth Curve (Wolfram MathWorld)
    https://mathworld.wolfram­.com/SmoothCurve.html
  13. Spirals (Wolfram MathWorld)
    https://mathworld.wolfram­.com/topics/Spirals.html
  14. An Interactive Introduction to Splines
    https://ibiblio.org/e-notes/Splines/Intro.htm
  15. Parabola
    https://www.2dcurves.com/co­nicsection/conicsectionp.html
  16. Hyperbola
    https://www.2dcurves.com/co­nicsection/conicsectionh.html
  17. Dioklova kisoida
    https://cs.wikipedia.org/wi­ki/Dioklova_kisoida
  18. Archimédova spirála
    https://cs.wikipedia.org/wi­ki/Archim%C3%A9dova_spir%C3%A1la
  19. Conchoid (mathematics)
    https://en.wikipedia.org/wi­ki/Conchoid_(mathematics)
  20. Algebraic curve
    https://en.wikipedia.org/wi­ki/Algebraic_curve
  21. Transcendental curve
    https://en.wikipedia.org/wi­ki/Transcendental_curve
  22. Spiral
    https://en.wikipedia.org/wiki/Spiral
  23. List of spirals
    https://en.wikipedia.org/wi­ki/List_of_spirals
  24. Hyperbolická spirála
    https://cs.wikipedia.org/wi­ki/Hyperbolick%C3%A1_spir%C3%A1la
  25. Hyperbolic Spiral
    https://mathworld.wolfram­.com/HyperbolicSpiral.html
  26. Lituus (mathematics)
    https://en.wikipedia.org/wi­ki/Lituus_(mathematics)
  27. Spiral of Spirals Fractals 2 with Python Turtle (Source Code)
    https://pythonturtle.academy/spiral-of-spirals-fractals-2-with-python-turtle-source-code/
  28. Cornu Spiral
    http://hyperphysics.gsu.e­du/hbase/phyopt/cornu.html
  29. Spiral
    https://www.2dcurves.com/spi­ral/spiral.html
  30. Cornu’s spiral
    https://www.johndcook.com/blog/2016/03/23/cor­nus-spiral/
  31. Cornu Spiral
    https://mathworld.wolfram­.com/CornuSpiral.html
  32. Fresnel Integrals
    https://mathworld.wolfram­.com/FresnelIntegrals.html
  33. Fresnel integral
    https://en.wikipedia.org/wi­ki/Fresnel_integral
  34. Algebraic Curves
    https://mathworld.wolfram­.com/topics/AlgebraicCurves­.html
  35. Elliptic Curves
    https://mathworld.wolfram­.com/topics/EllipticCurves­.html
  36. Eukleidovská konstrukce
    https://cs.wikipedia.org/wi­ki/Eukleidovsk%C3%A1_konstruk­ce
  37. Euclidean Constructions
    http://www.cs.cas.cz/portal/Al­goMath/Geometry/PlaneGeome­try/GeometricConstruction­s/EuclideanConstructions.htm
  38. Kvadratura kruhu
    https://cs.wikipedia.org/wi­ki/Kvadratura_kruhu
  39. Trisekce úhlu
    https://cs.wikipedia.org/wi­ki/Trisekce_%C3%BAhlu
  40. Straightedge and compass construction
    https://en.wikipedia.org/wi­ki/Straightedge_and_compas­s_construction
  41. C.a.R.
    http://car.rene-grothmann.de/doc_en/index.html
  42. CaRMetal (Wikipedia)
    https://en.wikipedia.org/wiki/C.a.R.
  43. CaRMetal (Španělsky a Francouzsky)
    http://carmetal.org/index.php/fr/
  44. CaRMetal (Wikipedia)
    https://en.wikipedia.org/wi­ki/CaRMetal
  45. Regular Polygon
    http://mathforum.org/dr.mat­h/faq/formulas/faq.regpoly­.html
  46. Geometric Construction with the Compass Alone
    http://www.cut-the-knot.org/do_you_know/compass.shtml
  47. Kvadratura kruhu (Wikipedie)
    https://cs.wikipedia.org/wi­ki/Kvadratura_kruhu
  48. Compass equivalence theorem
    https://en.wikipedia.org/wi­ki/Compass_equivalence_the­orem
  49. Curves we (mostly) don't learn in high school (and applications)
    https://www.youtube.com/wat­ch?v=3izFMB91K_Q
  50. Can You Really Derive Conic Formulae from a Cone? – Menaechmus' Constructions
    https://www.maa.org/press/pe­riodicals/convergence/can-you-really-derive-conic-formulae-from-a-cone-menaechmus-constructions
  51. Apollonius of Perga
    https://en.wikipedia.org/wi­ki/Apollonius_of_Perga
  52. Catenary arch
    https://en.wikipedia.org/wi­ki/Catenary_arch
  53. Parabolic arch
    https://en.wikipedia.org/wi­ki/Parabolic_arch
  54. Wattova křivka
    https://www.geogebra.org/m/gNh4bW9r
  55. Model stegosaura byl získán na stránce
    http://www.turbosquid.com/HTMLCli­ent/FullPreview/Index.cfm/ID/171071/Ac­tion/FullPreview
  56. Obrázek nohy dinosaura byl získán na adrese
    http://perso.wanadoo.fr/ri­masson/3d/leg.htm
  57. Spirograph
    https://en.wikipedia.org/wi­ki/Spirograph
  58. Epicykloida
    https://cs.wikipedia.org/wi­ki/Epicykloida
  59. Hypocykloida
    https://cs.wikipedia.org/wi­ki/Hypocykloida
  60. Hypotrochoida
    https://cs.wikipedia.org/wi­ki/Hypotrochoida
  61. Superelipsoidy a kvadriky v POV-Rayi
    https://www.root.cz/clanky/su­perelipsoidy-a-kvadriky-v-pov-rayi/
  62. Fifty Famous Curves, Lots of Calculus Questions, And a Few Answers
    https://elepa.files.wordpres­s.com/2013/11/fifty-famous-curves.pdf
  63. Barr, A.H.: Superquadrics and Angle Preserving Transformations,
    IEEE Computer Graphics and Applications, January 1981
  64. Bourke Paul: Quadrics,
    July 1996
  65. Bourke Paul: Superellipse and Superellipsoid,
    January 1990
  66. Faux, I.D. a Pratt, M.J.: Computational Geometry for Design and Manufacture,
    Ellis Horwood Ltd., Wiley & Sons, 1979
  67. Wallace A.: Differential Topology,
    Benjamin/Cummings Co., Reading, Massachussetts, USA, 1968
  68. Glossary of Bridge Terminology
    http://sdrc.lib.uiowa.edu/en­g/bridges/WaddellGlossary/Glos­sC.htm
  69. Brachistochrona
    https://cs.wikipedia.org/wi­ki/Brachistochrona
  70. Missions: Cassini
    https://solarsystem.nasa.gov/mis­sions/cassini/overview/
  71. Giovanni Domenico Cassini
    https://en.wikipedia.org/wi­ki/Giovanni_Domenico_Cassi­ni
  72. Cassini Ovals
    https://mathworld.wolfram­.com/CassiniOvals.html
  73. Geocentrismus
    https://cs.wikipedia.org/wi­ki/Geocentrismus
  74. Who was Giovanni Cassini?
    https://www.universetoday­.com/130823/who-was-giovanni-cassini/
  75. Special plane curves
    http://xahlee.info/Special­PlaneCurves_dir/ConicSecti­ons_dir/conicSections.html
  76. Why Does Slicing a Cone Give an Ellipse?
    https://infinityisreallybig­.com/2019/02/08/why-does-slicing-a-cone-give-an-ellipse/
  77. Interpolace
    https://mathonline.fme.vut­br.cz/pg/Algoritmy/05_APROX_KRIV­KY.htm
  78. Lagrange Polynomial Interpolation
    https://pythonnumericalmet­hods.berkeley.edu/notebook­s/chapter17.04-Lagrange-Polynomial-Interpolation.html
  79. Python Program for Lagrange Interpolation Method (with Output)
    https://www.codesansar.com/numerical-methods/python-program-lagrange-interpolation-method.htm
  80. Smooth Paths Using Catmull-Rom Splines
    https://qroph.github.io/2018/07/30/smo­oth-paths-using-catmull-rom-splines.html
  81. Lecture 11: Linear Interpolation Again – Bézier Curves
    http://www.math.kent.edu/~re­ichel/courses/intr.num.com­p.1/fall09/lecture12/bez.pdf
  82. Geometrie/Úvod do křivek
    https://cs.wikibooks.org/wi­ki/Geometrie/%C3%9Avod_do_k%C5%99i­vek
  83. B-Spline Curves and Surfaces (1)
    http://www.cad.zju.edu.cn/ho­me/zhx/GM/006/00-bscs1.pdf
  84. Praktické ukázky možností aplikace Mandelbulber při tvorbě animací
    https://www.root.cz/clanky/prakticke-ukazky-moznosti-aplikace-mandelbulber-pri-tvorbe-animaci/
  85. Kochanek–Bartels spline
    https://en.wikipedia.org/wi­ki/Kochanek%E2%80%93Bartel­s_spline
  86. class KochanekBartels
    https://splines.readthedoc­s.io/en/latest/_modules/spli­nes.html#KochanekBartels
  87. Fraktály v počítačové grafice XVIII
    https://www.root.cz/clanky/fraktaly-v-pocitacove-grafice-xviii/
  88. Fraktály v počítačové grafice XVI
    https://www.root.cz/clanky/fraktaly-v-pocitacove-grafice-xvi/
  89. Fraktály v počítačové grafice IV
    https://www.root.cz/clanky/fraktaly-v-pocitacove-grafice-iv/
  90. Systémy iterovaných funkcí a algoritmus náhodné procházky
    https://www.root.cz/clanky/systemy-iterovanych-funkci-a-algoritmus-nahodne-prochazky/
  91. Pravděpodobnosti transformací v systémech iterovaných funkcí
    https://www.root.cz/clanky/prav­depodobnosti-transformaci-v-systemech-iterovanych-funkci/
  92. Marie Alfred Cornu
    https://en.wikipedia.org/wi­ki/Marie_Alfred_Cornu
  93. Přechodnice
    https://cs.wikipedia.org/wi­ki/P%C5%99echodnice
  94. Evolventa
    https://cs.wikipedia.org/wi­ki/Evolventa
  95. Polopřímka
    https://cs.wikipedia.org/wi­ki/Polop%C5%99%C3%ADmka
  96. Involute (anglické označení pro evolventu)
    https://en.wikipedia.org/wi­ki/Involute
  97. Evolventní ozubení
    https://cs.wikipedia.org/wi­ki/Evolventn%C3%AD_ozuben%C3%AD
  98. Pathological (mathematics)
    https://en.wikipedia.org/wi­ki/Pathological_(mathematic­s)
  99. Dirichletova funkce
    https://cs.wikipedia.org/wi­ki/Dirichletova_funkce
  100. Weierstrassova funkce
    https://cs.wikipedia.org/wi­ki/Weierstrassova_funkce
  101. Riemannova funkce
    https://cs.wikipedia.org/wi­ki/Riemannova_funkce
  102. Křivka vyplňující prostor
    https://cs.wikipedia.org/wi­ki/K%C5%99ivka_vypl%C5%88uj%C3%AD­c%C3%AD_prostor
  103. Peanova křivka
    https://cs.wikipedia.org/wi­ki/Peanova_k%C5%99ivka
  104. Dračí křivka
    https://cs.wikipedia.org/wi­ki/Dra%C4%8D%C3%AD_k%C5%99iv­ka
  105. Sierpińského křivka
    https://cs.wikipedia.org/wi­ki/Sierpi%C5%84sk%C3%A9ho_k%C5%­99ivka
  106. Rozumná funkce
    https://cs.wikipedia.org/wi­ki/Rozumn%C3%A1_funkce