Hlavní navigace

Parametrické křivky používané v designu i při tvorbě animací (dokončení)

2. 9. 2021
Doba čtení: 44 minut

Sdílet

 Autor: Wikipedia, podle licence: CC-BY-SA
Dnes se již naposledy budeme věnovat parametrickým křivkám používaným v počítačové grafice, například při návrhu fontů, v nástrojích pro kreslení, v CAD systémech, ale i při tvorbě animací.

Obsah

1. Parametrické křivky používané v designu i při tvorbě animací (dokončení)

2. Lokalita změn tvaru spline křivek při posunu jednoho řídicího bodu

3. Ukázka lokality změn B-spline

4. Animovaný příklad

5. Ukázka lokality změn Catmul-Romovy spline

6. Animovaný příklad

7. Násobné řídicí body na začátku a konci spline křivek

8. Ukázka násobných bodů na začátku/konci B-spline

9. Ukázka násobných bodů na začátku/konci Catmul-Romovy spline

10. Násobné řídicí body uprostřed spline křivek

11. Ukázka násobných bodů v B-spline

12. Ukázka násobných bodů v Catmul-Romově spline

13. Fergusonovy kubiky

14. Hermitovské bázové polynomy Fergusonovy kubiky

15. Vykreslení Fergusonovy kubiky

16. Od klasických B-spline k NURBS

17. Racionální B-spline

18. NURBS

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

20. Odkazy na Internetu

1. Parametrické křivky používané v designu i při tvorbě animací

Dnes se již naposledy budeme věnovat parametrickým křivkám používaným v počítačové grafice, a to například při návrhu fontů, v nástrojích pro kreslení, v CAD systémech, ale i při tvorbě animací na základě takzvaných klíčových snímků (keyframes). V předchozích dvou částech tohoto seriálu [1, 2] jsme si popsali parametrické křivky, které jsou po částech reprezentovány polynomem nízkého řádu, typicky polynomem třetího či čtvrtého stupně. Mezi tyto křivky patří jak křivky ryze aproximační (typickým příkladem jsou B-spline), tak i křivky interpolační (zástupcem tohoto typu křivek jsou Catmul-Romovy spline), popř. se jedná o křivky, které prochází jen některými svými řídicími body (sem spadají Bézierovy křivky, tedy většinou Bézierovy kvadriky a Bézierovy kubiky).

Obrázek 1: Bézierova kvadrika – nejpoužívanější parametrická křivka vůbec (použita je například v TrueType fontech apod.).

Tento článek je rozdělen do tří částí. V části první si ukážeme některé vlastnosti B-spline a Catmul-Romovy spline, zejména lokalitu změn a vliv násobných řídicích bodů na výsledný tvar křivky. Následně se (z pohledu historie) vrátíme na samotný začátek výzkumu polynomiálních křivek, protože se seznámíme s Fergusonovou kubikou. Ta je velmi důležitá pro konstrukci dalších typů spline křivek, ovšem se samotnou Fergusonovou kubikou se v interaktivních programech (grafických editorech atd.) prakticky nikdy nesetkáme (důvody budou uvedeny v dalším textu). Na základě Fergusonovy kubiky byly navrženy spline křivky, které známe pod jmény jejích tvůrců – Kochanek-Bartels. A pochopitelně není možné zapomenout na NURBS neboli Neuniformní racionální B-spline křivky (plochy). Tyto spline vznikly dvojím zobecněním B-spline křivek, s jejichž základními vlastnostmi i způsobem konstrukce jsme se již v tomto seriálu seznámili.

Obrázek 2: Bézierova kubika.

2. Lokalita změn tvaru spline křivek při posunu jednoho řídicího bodu

Důležitou vlastností všech spline křivek používaných v počítačové grafice a současně i jedním z důvodů, proč se v této oblasti nepoužívají klasické Lagrangeovy polynomy, je fakt, že u spline křivek má změna polohy jednoho řídicího bodu jen lokální vliv na segment (či segmenty) křivky, které jsou tímto bodem určeny – všechny ostatní segmenty zůstanou nezměněny. To má pochopitelně velký praktický význam, protože jiné chování, tedy změna tvaru celé křivky, by například neumožňovalo smysluplné editace tvaru znaků apod.

Obrázek 3: Interpolační křivka získaná Lagrangeovou metodou.

Prozatím jsme si popsali dva typy spline křivek, konkrétně B-spline a Catmul-Romovy spline. V navazujících kapitolách si na praktických příkladech ukážeme, jak se projeví změna polohy jediného řídicího bodu na výsledném tvaru těchto spline křivek, popř. na tvaru jednotlivých segmentů (které od sebe budou barevně odlišeny).

Obrázek 4: Zákmity na obou koncích křivky získané Lagrangeovou metodou.

3. Ukázka lokality změn B-spline

Nejprve se podívejme na to, jakým způsobem se změní tvar B-spline při posunu řídicího bodu umístěného uprostřed celé spline. Následující demonstrační příklad je nepatrně složitější, než prozatím ukázané příklady, ale princip zůstává stále jednoduchý – do funkce draw_b_spline se mj. předává i y-ová pozice čtvrtého řídicího bodu, který tak může měnit svoji horizontální polohu. Navíc je zajištěno, že sousední segmenty křivky jsou zobrazeny odlišnou barvou:

"""Parametrická křivka: B-spline složená z Coonsových oblouků, posun vybraného řídicího bodu."""
 
import numpy as np
import matplotlib.pyplot as plt
 
# hodnoty parametru t
t = np.linspace(0, 1, 20)
 
# řídicí body B-spline
xc = [1, 2, 3, 4, 5, 6, 7]
yc = [1, 2, 1, 2, 1, 2, 1]
 
# Coonsovy polynomy
C = [(1-t)**3,
     3*t**3 - 6*t**2 + 4,
     -3*t**3 + 3*t**2 + 3*t + 1,
     t**3]
 
 
def draw_coons_arc(xc, yc, ax, style):
    # výpočet bodů ležících na Coonsově kubice
    x = 0
    y = 0
    for i in range(0, 4):
        x += xc[i]*C[i]
        y += yc[i]*C[i]
 
    # konečná úprava sumy
    x /= 6
    y /= 6
 
    # vrcholy na křivce pospojované úsečkami
    ax.plot(x, y, style)
 
 
def draw_b_spline(filename, xc, yc, y):
    # změnit polohu prostředního řídicího bodu
    yc[3] = y
 
    # rozměry grafu při uložení: 640x480 pixelů
    fig, ax = plt.subplots(1, figsize=(6.4, 4.8))
 
    # titulek grafu
    fig.suptitle('B-spline', fontsize=15)
 
    # určení rozsahů na obou souřadných osách
    ax.set_xlim(0.5, 7.5)
    ax.set_ylim(0.5, 2.5)
 
    # řídicí body B-spline
    ax.plot(xc, yc, 'k--', alpha=0.5)
    ax.plot(xc, yc, 'ro')
 
    last = len(xc)
 
    # další oblouky
    for start in range(0, last-3):
        style = "r-" if start % 2 == 0 else "b-"
        draw_coons_arc(xc[start:start+4], yc[start:start+4], ax, style)
 
    # uložení grafu do rastrového obrázku
    plt.savefig(filename)
 
 
draw_b_spline("B-spline_3A.png", xc, yc, 0.5)
draw_b_spline("B-spline_3B.png", xc, yc, 1.5)
draw_b_spline("B-spline_3C.png", xc, yc, 2.5)

Podívejme se nyní na výsledky získané pro tři různé polohy prostředního řídicího bodu:

Obrázek 5: B-spline; prostřední řídicí bod má souřadnice [4, 0.5].

Obrázek 6: B-spline; prostřední řídicí bod má souřadnice [4, 1.5].

Obrázek 7: B-spline; prostřední řídicí bod má souřadnice [4, 2.5].

Lokalita změn je v tomto konkrétním případě zřejmá – mění se prostřední dva segmenty přímo ovlivněné řídicím bodem. U obou dalších (vnějších) segmentů dojde pouze k menší změně, která se ale netýká jejich vnějších okrajů. Případné další segmenty by se nezměnily vůbec.

Poznámka: u B-spline je tedy lokálnost změn omezena na čtyři segmenty.

4. Animovaný příklad

Z předchozího demonstračního příkladu můžeme pro větší názornost odvodit jeho upravenou verzi, která vytvoří podklad pro animaci. Postup pro vytvoření animace vhodné pro vložení do HTML stránky jsme si již popsali ve třetím článku, takže nyní jen v krátkosti:

  1. Necháme skriptem (Python+Matplotlib+Numpy) vygenerovat několik PNG obrázků křivky, pokaždé pro odlišný koeficient.
  2. Vytvoříme z těchto obrázků animovaný GIF.
  3. Tento GIF zoptimalizujeme na velikost.

Druhý příkaz, tedy vytvoření animovaného GIFu, vypadá takto:

$ convert -delay 10 -loop 0 *.png animated.gif

Třetí příkaz, tj. optimalizace souboru na velikost, je založen na použití užitečného nástroje gifsicle:

$ gifsicle -O animated.gif > animated2.gif

Výsledná animace s postupnou změnou polohy jednoho řídicího bodu B-spline křivky vypadá takto:

Podklady pro tuto animaci byly získány následujícím skriptem:

"""Parametrická křivka: B-spline složená z Coonsových oblouků, násobné body."""
 
import numpy as np
import matplotlib.pyplot as plt
 
# hodnoty parametru t
t = np.linspace(0, 1, 20)
 
# řídicí body B-spline
xc = [1, 2, 3, 4, 5, 6, 7]
yc = [1, 2, 1, 2, 1, 2, 1]
 
# Coonsovy polynomy
C = [(1-t)**3,
     3*t**3 - 6*t**2 + 4,
     -3*t**3 + 3*t**2 + 3*t + 1,
     t**3]
 
 
def draw_coons_arc(xc, yc, ax, style):
    # výpočet bodů ležících na Coonsově kubice
    x = 0
    y = 0
    for i in range(0, 4):
        x += xc[i]*C[i]
        y += yc[i]*C[i]
 
    # konečná úprava sumy
    x /= 6
    y /= 6
 
    # vrcholy na křivce pospojované úsečkami
    ax.plot(x, y, style)
 
 
def draw_b_spline(filename, xc, yc, draw_first_arcs, draw_second_arcs, y):
    # změnit polohu prostředního řídicího bodu
    yc[3] = y
 
    # rozměry grafu při uložení: 640x480 pixelů
    fig, ax = plt.subplots(1, figsize=(6.4, 4.8))
 
    # titulek grafu
    fig.suptitle('B-spline', fontsize=15)
 
    # určení rozsahů na obou souřadných osách
    ax.set_xlim(0.5, 7.5)
    ax.set_ylim(0.5, 2.5)
 
    # řídicí body B-spline
    ax.plot(xc, yc, 'k--', alpha=0.5)
    ax.plot(xc, yc, 'ro')
 
    # první dva oblouky s násobnými body
    if draw_first_arcs:
        draw_coons_arc((xc[0], xc[0], xc[0], xc[1]),
                       (yc[0], yc[0], yc[0], yc[1]), ax, "g-")
 
    if draw_second_arcs:
        draw_coons_arc((xc[0], xc[0], xc[1], xc[2]),
                       (yc[0], yc[0], yc[1], yc[2]), ax, "y-")
 
    last = len(xc)
 
    # další oblouky
    for start in range(0, last-3):
        style = "r-" if start % 2 == 0 else "b-"
        draw_coons_arc(xc[start:start+4], yc[start:start+4], ax, style)
 
    # poslední dva oblouky s násobnými body
    if draw_second_arcs:
        draw_coons_arc((xc[last-3], xc[last-2], xc[last-1], xc[last-1]),
                       (yc[last-3], yc[last-2], yc[last-1], yc[last-1]), ax, "y-")
 
    if draw_first_arcs:
        draw_coons_arc((xc[last-2], xc[last-1], xc[last-1], xc[last-1]),
                       (yc[last-2], yc[last-1], yc[last-1], yc[last-1]), ax, "g-")
 
    # uložení grafu do rastrového obrázku
    plt.savefig(filename)
 
 
frame = 0
for y in np.linspace(0.5, 2.5, 20):
    draw_b_spline("b-spline_anim_{:02}.png".format(frame), xc, yc, True, True, y)
 
    # další snímek
    frame += 1

5. Ukázka lokality změn Catmul-Romovy spline

Nyní se podívejme, jakým způsobem se projeví změna jediného řídicího bodu v případě, že vykreslujeme Catmul-Romovu spline. Následující demonstrační příklad je do značné míry podobný příkladu ze třetí kapitoly (liší se prakticky jen výpočtem bázových polynomů), takže si ukažme jeho zdrojový kód bez dalších komentářů:

"""Parametrická křivka: Catmul-Romova spline složená z oblouků, posun vybraného řídicího bodu."""
 
import numpy as np
import matplotlib.pyplot as plt
 
# hodnoty parametru t
t = np.linspace(0, 1, 20)
 
# řídicí body Catmul-Romovy spline
xc = [1, 2, 3, 4, 5, 6, 7]
yc = [1, 2, 1, 2, 1, 2, 1]
 
# koeficient Catmul-Romovy spline
tau = 0.5
 
# bázové polynomy
Q = [-tau*t + 2*tau*t**2 - tau*t**3,
     1+(tau-3)*t**2+(2-tau)*t**3,
     tau*t + (3-2*tau)*t**2 + (tau-2)*t**3,
     -tau*t**2+tau*t**3]
 
 
def draw_catmul_rom_arc(xc, yc, ax, style):
    x = 0
    y = 0
    for i in range(0, 4):
        x += xc[i]*Q[i]
        y += yc[i]*Q[i]
 
    # vrcholy na křivce pospojované úsečkami
    ax.plot(x, y, style)
 
 
def draw_catmul_rom_spline(filename, xc, yc, y):
    # změnit polohu prostředního řídicího bodu
    yc[3] = y
 
    # rozměry grafu při uložení: 640x480 pixelů
    fig, ax = plt.subplots(1, figsize=(6.4, 4.8))
 
    # titulek grafu
    fig.suptitle('Catmul-Rom spline', fontsize=15)
 
    # určení rozsahů na obou souřadných osách
    ax.set_xlim(0.5, 7.5)
    ax.set_ylim(0.5, 2.5)
 
    # řídicí body B-spline
    ax.plot(xc, yc, 'k--', alpha=0.5)
    ax.plot(xc, yc, 'ro')
 
    last = len(xc)
 
    # další oblouky
    for start in range(0, last-3):
        style = "r-" if start % 2 == 0 else "b-"
        draw_catmul_rom_arc(xc[start:start+4], yc[start:start+4], ax, style)
 
    # uložení grafu do rastrového obrázku
    plt.savefig(filename)
 
 
draw_catmul_rom_spline("Catmul-Rom-spline_3A.png", xc, yc, 0.5)
draw_catmul_rom_spline("Catmul-Rom-spline_3B.png", xc, yc, 1.5)
draw_catmul_rom_spline("Catmul-Rom-spline_3C.png", xc, yc, 2.5)

Podívejme se nyní na výsledky získané pro tři různé polohy prostředního řídicího bodu:

Obrázek 8: Catmul-Romova spline; prostřední řídicí bod má souřadnice [4, 0.5].

Obrázek 9: Catmul-Romova spline; prostřední řídicí bod má souřadnice [4, 1.5].

Obrázek 10: Catmul-Romova spline; prostřední řídicí bod má souřadnice [4, 2.5].

Poznámka: opět je patrné, že se změní tvary vnějších segmentů, ovšem pouze na té straně, kde jsou propojeny se segmenty vnitřními (ty jsou pochopitelně změnou polohy řídicího bodu ovlivněny).

6. Animovaný příklad

Předchozí skript je možné poměrně triviálním způsobem přepsat do stavu, kdy vytváří animaci postupné změny tvaru křivky změnou pozice jednoho řídicího bodu. Na animaci je ještě lépe patrné, jak se mění vnější segmenty křivky (spline):

Podklady pro tuto animaci byly získány následujícím skriptem:

"""Parametrická křivka: Catmul-Romova spline, násobné body."""
 
import numpy as np
import matplotlib.pyplot as plt
 
# hodnoty parametru t
t = np.linspace(0, 1, 20)
 
# řídicí body Catmul-Romovy spline
xc = [1, 2, 3, 4, 5, 6, 7]
yc = [1, 2, 1, 2, 1, 2, 1]
 
# koeficient Catmul-Romovy spline
tau = 0.5
 
# bázové polynomy
Q = [-tau*t + 2*tau*t**2 - tau*t**3,
     1+(tau-3)*t**2+(2-tau)*t**3,
     tau*t + (3-2*tau)*t**2 + (tau-2)*t**3,
     -tau*t**2+tau*t**3]
 
 
def draw_catmul_rom_arc(xc, yc, ax, style):
    x = 0
    y = 0
    for i in range(0, 4):
        x += xc[i]*Q[i]
        y += yc[i]*Q[i]
 
    # vrcholy na křivce pospojované úsečkami
    ax.plot(x, y, style)
 
 
def draw_catmul_rom_spline(filename, xc, yc, draw_first_arcs, draw_second_arcs, y):
    # změnit polohu prostředního řídicího bodu
    yc[3] = y
 
    # rozměry grafu při uložení: 640x480 pixelů
    fig, ax = plt.subplots(1, figsize=(6.4, 4.8))
 
    # titulek grafu
    fig.suptitle('Catmul-Rom spline', fontsize=15)
 
    # určení rozsahů na obou souřadných osách
    ax.set_xlim(0.5, 7.5)
    ax.set_ylim(0.5, 2.5)
 
    # řídicí body Catmul-Romovy spline
    ax.plot(xc, yc, 'k--', alpha=0.5)
    ax.plot(xc, yc, 'ro')
 
    # první dva oblouky s násobnými body
    if draw_first_arcs:
        draw_catmul_rom_arc((xc[0], xc[0], xc[0], xc[1]),
                            (yc[0], yc[0], yc[0], yc[1]), ax, "g-")
 
    if draw_second_arcs:
        draw_catmul_rom_arc((xc[0], xc[0], xc[1], xc[2]),
                            (yc[0], yc[0], yc[1], yc[2]), ax, "y-")
 
    last = len(xc)
 
    # další oblouky
    for start in range(0, last-3):
        style = "r-" if start % 2 == 0 else "b-"
        draw_catmul_rom_arc(xc[start:start+4], yc[start:start+4], ax, style)
 
    # poslední dva oblouky s násobnými body
    if draw_second_arcs:
        draw_catmul_rom_arc((xc[last-3], xc[last-2], xc[last-1], xc[last-1]),
                            (yc[last-3], yc[last-2], yc[last-1], yc[last-1]), ax, "y-")
 
    if draw_first_arcs:
        draw_catmul_rom_arc((xc[last-2], xc[last-1], xc[last-1], xc[last-1]),
                            (yc[last-2], yc[last-1], yc[last-1], yc[last-1]), ax, "g-")
 
    # uložení grafu do rastrového obrázku
    plt.savefig(filename)
 
 
frame = 0
for y in np.linspace(0.5, 2.5, 20):
    draw_catmul_rom_spline("catmul-rom-spline_anim_{:02}.png".format(frame), xc, yc, False, True, y)
 
    # další snímek
    frame += 1

7. Násobné řídicí body na začátku a konci spline křivek

Spline křivky, v kontextu tohoto článku tedy B-spline i Catmul-Romovy spline, obecně nepochází svými koncovými body. V případě, že je nutné, aby spline začínaly a/nebo končily v koncových bodech (a to je mnohdy požadovaná vlastnost), je nutné použít triku – na začátku a konci křivek přidat násobné řídicí body, což je dvojice či trojice řídicích bodů s naprosto stejnými souřadnicemi. Chování B-spline a Catmul-Rom spline je v těchto případech nepatrně odlišné, takže si ho pro úplnost ukážeme na dvojici demonstračních příkladů uvedených v navazující dvojici kapitol.

Poznámka: ve skutečnosti ovšem tímto trikem ztratíme možnost ovlivnit směr křivky na začátku a na konci, tedy první derivaci.

8. Ukázka násobných bodů na začátku/konci B-spline

Příklad uvedený v této kapitole dokáže zobrazit B-spline křivku specifikovanou sedmi řídicími body. Přitom je možné při volání funkce draw_b_spline specifikovat, zda se má první a poslední řídicí bod použít dvakrát nebo dokonce třikrát a tím ke křivce přidat další dva resp. čtyři segmenty:

"""Parametrická křivka: B-spline složená z Coonsových oblouků, násobné body na začátku a na konci."""
 
import numpy as np
import matplotlib.pyplot as plt
 
# hodnoty parametru t
t = np.linspace(0, 1, 20)
 
# řídicí body B-spline
xc = (1, 2, 3, 4, 5, 6, 7)
yc = (1, 2, 1, 2, 1, 2, 1)
 
# Coonsovy polynomy
C = [(1-t)**3,
     3*t**3 - 6*t**2 + 4,
     -3*t**3 + 3*t**2 + 3*t + 1,
     t**3]
 
 
def draw_coons_arc(xc, yc, ax, style):
    # výpočet bodů ležících na Coonsově kubice
    x = 0
    y = 0
    for i in range(0, 4):
        x += xc[i]*C[i]
        y += yc[i]*C[i]
 
    # konečná úprava sumy
    x /= 6
    y /= 6
 
    # vrcholy na křivce pospojované úsečkami
    ax.plot(x, y, style)
 
 
def draw_b_spline(filename, xc, yc, draw_first_arcs, draw_second_arcs):
    # rozměry grafu při uložení: 640x480 pixelů
    fig, ax = plt.subplots(1, figsize=(6.4, 4.8))
 
    # titulek grafu
    fig.suptitle('B-spline', fontsize=15)
 
    # určení rozsahů na obou souřadných osách
    ax.set_xlim(0.5, 7.5)
    ax.set_ylim(0.5, 2.5)
 
    # řídicí body B-spline
    ax.plot(xc, yc, 'k--', alpha=0.5)
    ax.plot(xc, yc, 'ro')
 
    # první dva oblouky s násobnými body
    if draw_first_arcs:
        draw_coons_arc((xc[0], xc[0], xc[0], xc[1]),
                       (yc[0], yc[0], yc[0], yc[1]), ax, "g-")
 
    if draw_second_arcs:
        draw_coons_arc((xc[0], xc[0], xc[1], xc[2]),
                       (yc[0], yc[0], yc[1], yc[2]), ax, "y-")
 
    last = len(xc)
 
    # další oblouky
    for start in range(0, last-3):
        style = "r-" if start % 2 == 0 else "b-"
        draw_coons_arc(xc[start:start+4], yc[start:start+4], ax, style)
 
    # poslední dva oblouky s násobnými body
    if draw_second_arcs:
        draw_coons_arc((xc[last-3], xc[last-2], xc[last-1], xc[last-1]),
                       (yc[last-3], yc[last-2], yc[last-1], yc[last-1]), ax, "y-")
 
    if draw_first_arcs:
        draw_coons_arc((xc[last-2], xc[last-1], xc[last-1], xc[last-1]),
                       (yc[last-2], yc[last-1], yc[last-1], yc[last-1]), ax, "g-")
 
    # uložení grafu do rastrového obrázku
    plt.savefig(filename)
 
    # zobrazení grafu
    plt.show()
 
 
# čtyři varianty B-spline křivky
draw_b_spline("B-spline_4A.png", xc, yc, False, False)
draw_b_spline("B-spline_4B.png", xc, yc, False, True)
draw_b_spline("B-spline_4C.png", xc, yc, True, False)
draw_b_spline("B-spline_4D.png", xc, yc, True, True)

Příklad po svém spuštění vygeneruje čtyři varianty téže křivky:

Obrázek 11: B-spline křivka bez násobných řídicích bodů.

Obrázek 12: B-spline křivka s dvojicí přidaných segmentů (dva násobné body).

Obrázek 13: B-spline křivka s dvojicí přidaných segmentů (dva násobné body).

Obrázek 14: B-spline křivka se čtveřicí přidaných segmentů (dva dvakrát násobné body).

Poznámka: vidíme, že u B-spline křivek je nutné použít další dva segmenty, aby křivka procházela počátečním a koncovým bodem.

9. Ukázka násobných bodů na začátku/konci Catmul-Romovy spline

Prakticky stejným způsobem se můžeme pokusit o vykreslení čtyř variant Catmul-Romovy spline křivky:

"""Parametrická křivka: Catmul-Romova spline, násobné body."""
 
import numpy as np
import matplotlib.pyplot as plt
 
# hodnoty parametru t
t = np.linspace(0, 1, 20)
 
# řídicí body Catmul-Romovy spline
xc = [1, 2, 3, 4, 5, 6, 7]
yc = [1, 2, 1, 2, 1, 2, 1]
 
# koeficient Catmul-Romovy spline
tau = 0.5
 
# bázové polynomy
Q = [-tau*t + 2*tau*t**2 - tau*t**3,
     1+(tau-3)*t**2+(2-tau)*t**3,
     tau*t + (3-2*tau)*t**2 + (tau-2)*t**3,
     -tau*t**2+tau*t**3]
 
 
def draw_catmul_rom_arc(xc, yc, ax, style):
    x = 0
    y = 0
    for i in range(0, 4):
        x += xc[i]*Q[i]
        y += yc[i]*Q[i]
 
    # vrcholy na křivce pospojované úsečkami
    ax.plot(x, y, style)
 
 
def draw_catmul_rom_spline(filename, xc, yc, draw_first_arcs, draw_second_arcs):
    # rozměry grafu při uložení: 640x480 pixelů
    fig, ax = plt.subplots(1, figsize=(6.4, 4.8))
 
    # titulek grafu
    fig.suptitle('Catmul-Rom spline', fontsize=15)
 
    # určení rozsahů na obou souřadných osách
    ax.set_xlim(0.5, 7.5)
    ax.set_ylim(0.5, 2.5)
 
    # řídicí body Catmul-Romovy spline
    ax.plot(xc, yc, 'k--', alpha=0.5)
    ax.plot(xc, yc, 'ro')
 
    # první dva oblouky s násobnými body
    if draw_first_arcs:
        draw_catmul_rom_arc((xc[0], xc[0], xc[0], xc[1]),
                            (yc[0], yc[0], yc[0], yc[1]), ax, "g-")
 
    if draw_second_arcs:
        draw_catmul_rom_arc((xc[0], xc[0], xc[1], xc[2]),
                            (yc[0], yc[0], yc[1], yc[2]), ax, "y-")
 
    last = len(xc)
 
    # další oblouky
    for start in range(0, last-3):
        style = "r-" if start % 2 == 0 else "b-"
        draw_catmul_rom_arc(xc[start:start+4], yc[start:start+4], ax, style)
 
    # poslední dva oblouky s násobnými body
    if draw_second_arcs:
        draw_catmul_rom_arc((xc[last-3], xc[last-2], xc[last-1], xc[last-1]),
                            (yc[last-3], yc[last-2], yc[last-1], yc[last-1]), ax, "y-")
 
    if draw_first_arcs:
        draw_catmul_rom_arc((xc[last-2], xc[last-1], xc[last-1], xc[last-1]),
                            (yc[last-2], yc[last-1], yc[last-1], yc[last-1]), ax, "g-")
 
    # uložení grafu do rastrového obrázku
    plt.savefig(filename)
 
    # zobrazení grafu
    plt.show()
 
 
# čtyři varianty B-spline křivky
draw_catmul_rom_spline("Catmul-Rom-spline_4A.png", xc, yc, False, False)
draw_catmul_rom_spline("Catmul-Rom-spline_4B.png", xc, yc, False, True)
draw_catmul_rom_spline("Catmul-Rom-spline_4C.png", xc, yc, True, False)
draw_catmul_rom_spline("Catmul-Rom-spline_4D.png", xc, yc, True, True)

I tento příklad po svém spuštění vygeneruje čtyři varianty téže křivky:

Obrázek 15: Catmul-Romova spline křivka bez násobných řídicích bodů.

Obrázek 16: Catmul-Romova spline křivka s dvojicí přidaných segmentů (dva násobné body).

Obrázek 17: Catmul-Romova spline křivka s dvojicí přidaných segmentů (dva násobné body).

Obrázek 18: Catmul-Romova spline křivka se čtveřicí přidaných segmentů (dva dvakrát násobné body).

Poznámka: zde naopak vidíme, že aby křivka procházela svým počátečním a koncovým bodem, musíme přidat jediný segment. Přidání dalšího segmentu vede naopak k chybnému zobrazení (de facto tečny k začátku a konci křivky).

10. Násobné řídicí body uprostřed spline křivek

Násobné řídicí body se pochopitelně mohou použít i uprostřed spline křivek. V tomto případě dojde k tomu, že namísto C1 či C2 spojitosti získáme křivku pouze se spojitostí C0, což ovšem může být cílem některých operací – například budeme chtít vytvořit ostrý roh apod. Vliv násobných řídicích bodů uprostřed spline křivek si (opět) ukážeme na příkladu B-spline a posléze i na Catmul-Romově spline.

11. Ukázka násobných bodů v B-spline

Tento demonstrační příklad vykreslí B-spline bez násobných bodů, s jedním násobným bodem a taktéž s jedním „dvojitě“ násobným bodem – viz též zvýrazněná část kódu:

"""Parametrická křivka: B-spline složená z Coonsových oblouků, násobné body uprostřed křivky."""
 
import numpy as np
import matplotlib.pyplot as plt
 
# hodnoty parametru t
t = np.linspace(0, 1, 20)
 
# řídicí body B-spline
xc1 = (1, 2, 3, 4, 5, 6, 7)
yc1 = (1, 2, 1, 2, 1, 2, 1)
 
# násobné řídicí body B-spline
xc2 = (1, 2, 3, 4, 4, 5, 6, 7)
yc2 = (1, 2, 1, 2, 2, 1, 2, 1)
 
# řídicí body B-spline
xc3 = (1, 2, 3, 4, 4, 4, 5, 6, 7)
yc3 = (1, 2, 1, 2, 2, 2, 1, 2, 1)
 
# Coonsovy polynomy
C = [(1-t)**3,
     3*t**3 - 6*t**2 + 4,
     -3*t**3 + 3*t**2 + 3*t + 1,
     t**3]
 
 
def draw_coons_arc(xc, yc, ax, style):
    # výpočet bodů ležících na Coonsově kubice
    x = 0
    y = 0
    for i in range(0, 4):
        x += xc[i]*C[i]
        y += yc[i]*C[i]
 
    # konečná úprava sumy
    x /= 6
    y /= 6
 
    # vrcholy na křivce pospojované úsečkami
    ax.plot(x, y, style)
 
 
def draw_b_spline(filename, xc, yc, draw_first_arcs, draw_second_arcs):
    # rozměry grafu při uložení: 640x480 pixelů
    fig, ax = plt.subplots(1, figsize=(6.4, 4.8))
 
    # titulek grafu
    fig.suptitle('B-spline', fontsize=15)
 
    # určení rozsahů na obou souřadných osách
    ax.set_xlim(0.5, 7.5)
    ax.set_ylim(0.5, 2.5)
 
    # řídicí body B-spline
    ax.plot(xc, yc, 'k--', alpha=0.5)
    ax.plot(xc, yc, 'ro')
 
    # první dva oblouky s násobnými body
    if draw_first_arcs:
        draw_coons_arc((xc[0], xc[0], xc[0], xc[1]),
                       (yc[0], yc[0], yc[0], yc[1]), ax, "g-")
 
    if draw_second_arcs:
        draw_coons_arc((xc[0], xc[0], xc[1], xc[2]),
                       (yc[0], yc[0], yc[1], yc[2]), ax, "y-")
 
    last = len(xc)
 
    # další oblouky
    for start in range(0, last-3):
        style = "r-" if start % 2 == 0 else "b-"
        draw_coons_arc(xc[start:start+4], yc[start:start+4], ax, style)
 
    # poslední dva oblouky s násobnými body
    if draw_second_arcs:
        draw_coons_arc((xc[last-3], xc[last-2], xc[last-1], xc[last-1]),
                       (yc[last-3], yc[last-2], yc[last-1], yc[last-1]), ax, "y-")
 
    if draw_first_arcs:
        draw_coons_arc((xc[last-2], xc[last-1], xc[last-1], xc[last-1]),
                       (yc[last-2], yc[last-1], yc[last-1], yc[last-1]), ax, "g-")
 
    # uložení grafu do rastrového obrázku
    plt.savefig(filename)
 
    # zobrazení grafu
    plt.show()
 
 
# vykreslení B-spline křivky
draw_b_spline("B-spline_5A.png", xc1, yc1, False, False)
draw_b_spline("B-spline_5B.png", xc2, yc2, False, False)
draw_b_spline("B-spline_5C.png", xc3, yc3, False, False)

Ze zobrazených výsledků je patrné, že skutečného ostrého bodu dosáhneme až při použití dvojitě-násobného řídicího bodu:

Obrázek 19: B-spline křivka bez násobných řídicích bodů.

Obrázek 20: B-spline křivka s jedním násobným bodem uprostřed křivky.

Obrázek 21: B-spline křivka s jedním „dvojitě“ násobným bodem uprostřed křivky.

12. Ukázka násobných bodů v Catmul-Romově spline

Podobným způsobem můžeme vykreslit Catmul-Romovu spline křivku s násobnými body uprostřed:

"""Parametrická křivka: Catmul-Romova spline, násobné body uprostřed křivky."""
 
import numpy as np
import matplotlib.pyplot as plt
 
# hodnoty parametru t
t = np.linspace(0, 1, 20)
 
# řídicí body Catmul-Romovy spline
xc1 = [1, 2, 3, 4, 5, 6, 7]
yc1 = [1, 2, 1, 2, 1, 2, 1]
 
# násobné řídicí body Catmul-Romovy spline
xc2 = [1, 2, 3, 4, 4, 5, 6, 7]
yc2 = [1, 2, 1, 2, 2, 1, 2, 1]
 
# násobné řídicí body Catmul-Romovy spline
xc3 = [1, 2, 3, 4, 4, 4, 5, 6, 7]
yc3 = [1, 2, 1, 2, 2, 2, 1, 2, 1]
 
# koeficient Catmul-Romovy spline
tau = 0.5
 
# bázové polynomy
Q = [-tau*t + 2*tau*t**2 - tau*t**3,
     1+(tau-3)*t**2+(2-tau)*t**3,
     tau*t + (3-2*tau)*t**2 + (tau-2)*t**3,
     -tau*t**2+tau*t**3]
 
 
def draw_catmul_rom_arc(xc, yc, ax, style):
    x = 0
    y = 0
    for i in range(0, 4):
        x += xc[i]*Q[i]
        y += yc[i]*Q[i]
 
    # vrcholy na křivce pospojované úsečkami
    ax.plot(x, y, style)
 
 
def draw_catmul_rom_spline(filename, xc, yc, draw_first_arcs, draw_second_arcs):
    # rozměry grafu při uložení: 640x480 pixelů
    fig, ax = plt.subplots(1, figsize=(6.4, 4.8))
 
    # titulek grafu
    fig.suptitle('Catmul-Rom spline', fontsize=15)
 
    # určení rozsahů na obou souřadných osách
    ax.set_xlim(0.5, 7.5)
    ax.set_ylim(0.5, 2.5)
 
    # řídicí body Catmul-Romovy spline
    ax.plot(xc, yc, 'k--', alpha=0.5)
    ax.plot(xc, yc, 'ro')
 
    # první dva oblouky s násobnými body
    if draw_first_arcs:
        draw_catmul_rom_arc((xc[0], xc[0], xc[0], xc[1]),
                            (yc[0], yc[0], yc[0], yc[1]), ax, "g-")
 
    if draw_second_arcs:
        draw_catmul_rom_arc((xc[0], xc[0], xc[1], xc[2]),
                            (yc[0], yc[0], yc[1], yc[2]), ax, "y-")
 
    last = len(xc)
 
    # další oblouky
    for start in range(0, last-3):
        style = "r-" if start % 2 == 0 else "b-"
        draw_catmul_rom_arc(xc[start:start+4], yc[start:start+4], ax, style)
 
    # poslední dva oblouky s násobnými body
    if draw_second_arcs:
        draw_catmul_rom_arc((xc[last-3], xc[last-2], xc[last-1], xc[last-1]),
                            (yc[last-3], yc[last-2], yc[last-1], yc[last-1]), ax, "y-")
 
    if draw_first_arcs:
        draw_catmul_rom_arc((xc[last-2], xc[last-1], xc[last-1], xc[last-1]),
                            (yc[last-2], yc[last-1], yc[last-1], yc[last-1]), ax, "g-")
 
    # uložení grafu do rastrového obrázku
    plt.savefig(filename)
 
    # zobrazení grafu
    plt.show()
 
 
# čtyři varianty B-spline křivky
draw_catmul_rom_spline("Catmul-Rom-spline_4A.png", xc1, yc1, False, False)
draw_catmul_rom_spline("Catmul-Rom-spline_4B.png", xc2, yc2, False, False)
draw_catmul_rom_spline("Catmul-Rom-spline_4C.png", xc3, yc3, False, False)

I zde můžeme vidět podstatný rozdíl oproti B-spline křivkám – k vytvoření skutečného „rohu“ nedojde, ale naproti tomu se vytvoří smyčka. To je dáno mj. tím, jak se Catmul-Romova křivka snaží interpolovat řídicí body (a to i ty nenásobné):

Obrázek 22: Catmul-Romova spline křivka bez násobných řídicích bodů.

Obrázek 23: Catmul-Romova spline křivka s jedním násobným bodem uprostřed křivky.

Obrázek 24: Catmul-Romova spline křivka s jedním „dvojitě“ násobným bodem uprostřed křivky.

13. Fergusonovy kubiky

Článek o parametrických křivkách založených na vyhodnocování polynomů nízkých stupňů by nebyl úplný, pokud bychom se nezmínili o Fergusonových kubikách. Jedná se o křivky zadané dvojicí koncových bodů, kterými křivka prochází. To však není vše, protože je ještě nutné zadat tečné vektory v těchto bodech, které pochopitelně mění tvar křivky. V případě „konkurenčních“ Bézierových kubik je situace nepatrně odlišná, protože tečné vektory (resp. směr křivky u koncových bodů) je ovlivněn ostatními dvěma řídicími body. U obou kubik je však celá křivka popsána čtveřicí parametrů – buď dvěma body a dvěma vektory nebo čtyřmi body (takže ve výsledku nemáme žádný stupeň volnosti při výpočtech, protože čtveřice parametrů odpovídá čtveřici koeficientů polynomu stupně tři).

Nevýhodou Fergusonových kubik je fakt, že práce s tečnými vektory je obtížnější a pro uživatele ne tak intuitivní (zejména u druhého koncového bodu). Nicméně v některých aplikacích to nevadí, protože Fergusojovy kubiky tvoří základ křivek Kochanek-Bartels.

14. Hermitovské bázové polynomy Fergusonovy kubiky

Fergusonovy se počítají a vykreslují naprosto stejným způsobem, jako je tomu u všech dalších parametrických křivek – máme tedy k dispozici bázové polynomy (zde konkrétně Hermitovské polynomy) a sadu 2D vektorů tvořících vstup do výpočtů. Tyto vektory představují dvojici koncových bodů a dvojici tečných vektorů v koncových bodech – což je ona změna oproti dalším dříve popsaným křivkám (u těch jsme měli jen sadu řídicích bodů). Podívejme se ovšem nejdříve na to, jak vypadají bázové polynomy těchto křivek:

"""Hermitovské bázové polynomy."""
 
import numpy as np
import matplotlib.pyplot as plt
 
# hodnoty parametru t
t = np.linspace(0, 1, 50)
 
# bázové polynomy
H = [2*t**3 - 3*t**2+1,
     t**3 - 2*t**2 + t,
     -2*t**3 + 3*t**2,
     t**3 - t**2]
 
# rozměry grafu při uložení: 640x480 pixelů
fig, ax = plt.subplots(1, figsize=(6.4, 4.8))
 
# titulek grafu
fig.suptitle('Bázové polynomy', fontsize=15)
 
# určení rozsahů na obou souřadných osách
ax.set_xlim(0, 1)
ax.set_ylim(-0.25, 1)
 
# bázové polynomy
ax.plot(t, H[0], 'r-')
ax.plot(t, H[1], 'g-')
ax.plot(t, H[2], 'b-')
ax.plot(t, H[3], 'k-')
 
# uložení grafu do rastrového obrázku
plt.savefig("hermite_basis.png")
 
# zobrazení grafu
plt.show()

Z výsledků je patrné, že bázové polynomu mají v některých místech i zápornou hodnotu, což je pro nás novinka (ovšem zde nevadí, protože výpočet probíhá i nad tečnými vektory):

Obrázek 25: Hermitovské bázové polynomy.

15. Vykreslení Fergusonovy kubiky

Již v předchozí kapitole jsem se zmínil o tom, že Fergusonovy kubiky se počítají a vykreslují prakticky stejným způsobem, jako ostatní polynomiální parametrické křivky (s tím rozdílem, že vstupy jsou odlišné). O tom, že postup výpočtu a vykreslení není žádným podstatným způsobem změněn, se můžeme přesvědčit v následujícím demonstračním příkladu, který Fergusonovu kubiku vykreslí a vykreslí i její koncové body a tečné vektory:

"""Fergusonova kubika."""
 
import numpy as np
import matplotlib.pyplot as plt
 
# hodnoty parametru t
t = np.linspace(0, 1, 50)
 
# řídicí body spline
xc = (1, 3)
yc = (1, 1)
 
# tangenty
mx = (0, 0)
my = (1, -1)
 
# bázové polynomy
H = [2*t**3 - 3*t**2+1,
     t**3 - 2*t**2 + t,
     -2*t**3 + 3*t**2,
     t**3 - t**2]
 
# výpočet bodů ležících na spline
x = xc[0]*H[0] + mx[0]*H[1] + xc[1]*H[2] + mx[1]*H[3]
y = yc[0]*H[0] + my[0]*H[1] + yc[1]*H[2] + my[1]*H[3]
 
# rozměry grafu při uložení: 640x480 pixelů
fig, ax = plt.subplots(1, figsize=(6.4, 4.8))
 
# titulek grafu
fig.suptitle('Hermitova spline', fontsize=15)
 
# určení rozsahů na obou souřadných osách
ax.set_xlim(0, 4)
ax.set_ylim(-0.5, 2.5)
 
# vrcholy na křivce pospojované úsečkami
ax.plot(x, y, 'g-')
 
# řídicí body
ax.plot(xc, yc, 'ro')
 
# tangenty
ax.plot([xc[0]+mx[0], xc[0]], [yc[0]+my[0], yc[0]], 'b-')
ax.plot([xc[1]+mx[1], xc[1]], [yc[1]+my[1], yc[1]], 'y-')
 
# uložení grafu do rastrového obrázku
plt.savefig("hermite_spline.png")
 
# zobrazení grafu
plt.show()

Výsledná Fergusonova kubika (spline) bude vypadat následovně:

Obrázek 26: Fergusonova kubika.

16. Od klasických B-spline k NURBS

V oblasti CAD a CAM se poměrně často setkáme s NURBS křivkami a plochami. Jedná se o dvojí zobecnění klasických B-spline křivek. Jedno zobecnění spočívá v zavedení „vah“ jednotlivých řídicích bodů (racionální B-spline křivky), druhé pak v zavedení takzvaného knot vectoru (uzlového vektoru), kterým se nahradí původní sekvence segmentů, z nichž každý začíná v t=0 a končí v t=1.

Poznámka: v dalším textu budu často uvádět informace a vzorce, které se vztahují nikoli k parametrickým křivkám, ale k parametrickým plochám, protože se s B-spline plochami lze v praxi (3D grafika) setkat poměrně často. Plocha vznikne generalizací vztahů pro parametrické křivky – namísto jednoho parametru t se používají dva parametru u a v. Navíc se namísto vektoru řídicích bodů používají matice (takže namísto indexu i se ve výpočtech setkáme s dvojicí indexů i a j). A konečně – ve všech výpočtech narazíme na dvojici sum (přes všechny kombinace i/j) namísto sumy jediné. Kupodivu žádné další změny nejsou zapotřebí, a to ani při (teoretickém) přechodu k parametrickým tělesům vykreslovaným v 4D.

NURB křivky a plochy se v počítačové grafice, resp. nani navazujících oborech, staly velmi populární zejména díky některým svým výhodným vlastnostem, které krátce zmíníme v následujících odstavcích:

  1. Pomocí NURB křivek lze jednoduše a přesně vytvářet kuželosečky, tj. kružnici, elipsu, parabolu nebo jejich části (oblouky). Zejména možnost přesného vytváření kružnic a elips (a samozřejmě i jejich částí – oblouků) je v CAD/CAM aplikacích velmi důležitá a právě z tohoto důvodu se v CAD/CAM nepoužívají jinak oblíbené Bézierovy křivky.
  2. NURB plochy mohou přesně vytvářet povrch (nebo část povrchu) kvadrik, jež jsou obdobou kuželoseček v prostoru. Je tedy možné naprosto přesně vymodelovat kouli, válec, kužel apod.
  3. Vhodnou volbou uzlového vektoru a vah řídicích bodů je možné vytvářet povrchy se zlomy a hranami, například kvádry. Tato vlastnost se opět použije při práci v CAD/CAM systémech, ve kterých se běžně vytváří tělesa, jež mají střídavě spojité a nespojité povrchy. Lehce se tak může stát, že celá scéna je tvořena pouze NURB plochami, i když se v ní budou vyskytovat kvadriky, kostky atd.
  4. NURB křivky a plochy si přitom zachovávají veškeré vlastnosti parametrických křivek a ploch, například invarianci k transformacím, existenci komplexní obálky (pro nezáporné váhy řídicích bodů) atd. To je důležité zejména pro rychlé vykreslování – transformace je možné aplikovat pouze na řídicí body a ne na výsledné trojúhelníky. Existence konvexní obálky zajišťuje zrychlený výpočet kolizí a také – což je mnohdy důležitější – viditelnosti.
  5. Editace NURB je z uživatelského hlediska poměrně jednoduchá – mění se polohy řídicích bodů, jejich váhy a případně i uzlový vektor. Při interaktivním modelování se však téměř vždy mění pouze polohy řídicích bodů, jejichž cílenou změnou lze dosáhnout téměř jakéhokoli tvaru. Změna vah řídicích bodů a uzlového vektoru je aplikována automaticky při vytváření kvadrik a offsetových ploch – viz předchozí odstavce.

17. Racionální B-spline

Zvýšení modelovacích schopností klasických B-spline je možné dosáhnout použitím takzvaných racionálních B-spline, v nichž je každému řídicímu bodu navíc přiřazena jeho váha, což je reálné číslo určující „přitažlivost“ daného řídicího bodu ke křivce. Čím vyšší je váha řídicího bodu, tím více se křivka či plocha k tomuto bodu přimyká. Jestliže je naopak váha záporná, křivka je od bodu odpuzována. Uživatel má tedy k dispozici další nástroj, kterým může poměrně jednoduchou cestou ovlivnit tvar výsledné křivky. Další výhodou těchto typů spline je to, že díky racionalitě jsou tyto typy křivek invariantní kromě lineárních transformací i k perspektivní projekci (což nás však začne zajímat až v 3D grafice). Pokud označíme váhu řídicího bodu Pij symbolem Wij, můžeme racionální B-spline plochu vyjádřit vztahem:

Poznámka: racionální B-spline křivka se od plochy liší tím, že sumy přes bázové polynomy počítáme pouze ve směru parametrické souřadnice u, která tak odpovídá nám známé parametrické souřadnici t.

Z vlastností bázových funkcí je možné relativně snadno zjistit, že pokud W{i,j}=1 pro všechny i, j (popř. jen i pro křivku), potom je jmenovatel zlomku vždy roven jedné a racionální B-spline křivka/plocha je rovnocenná neracionální B-spline, s nimiž jsme se již dobře seznámili v rámci předchozího textu.

18. NURBS

Dalším zobecněním racionálních B-spline je zavedení takzvaných normalizovaných B-spline bázových funkcí, které jsou na rozdíl od předchozích bázových funkcí (popsaných polynomem) určeny rekurentním vztahem ve kterém se vyskytuje interval hodnot, pro které je bázová funkce definována (naproti tomu u běžných B-spline i u racionálních B-spline byly bázové funkce definovány pro parametry t, resp. u a v, které vždy nabývaly hodnot z rozsahu <0, 1>:

Vznikají tak křivky popř. plochy NURBS neboli neuniformní racionální B-spline (Non-Uniform Rational B-spline nebo Non-Uniform Rational B-spline Surfaces). Ty v dnešní době představují průmyslový standard v geometrickém modelování ploch. NURBS plochy lze vyjádřit vztahem:

root_podpora

Tyto křivky resp. po zobecnění plochy mají mnoho výhodných vlastností, například umožňují přesně modelovat kvadriky nebo jejich části (povrch koule, elipsoidu, válce a kužele), které se používají například pro navrhování součástek v CAD systémech. Lze také jednoduše vytvářet rotační plochy (SOR – surfaces of revolution) a provádět volné modelování (free-form modelling). Především z těchto důvodů se dnes NURBS plochy stávají pro mnoho aplikací základním (elementárním) prvkem, ze kterého se vytváří složitější tělesa. Některé aplikace dokonce jiné reprezentace těles neumožňují, což mimo jiné značně zjednodušuje většinu algoritmů, které jsou nad modelem tělesa prováděny, protože tyto algoritmy jsou vždy prováděny pouze s NURBS plochami.

Poznámka: o NURBS vznikl na Rootu celý seriál s podrobnějším popisem jejich vlastností i způsobů jejich výpočtů.

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 Hermitovské bázové polynomy https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Hermite_ba­sis.py
114 parametric/Hermite_spline.py Fergusonova kubika https://github.com/tisnik/pre­sentations/blob/master/cur­ves/parametric/Hermite_spli­ne.py

20. Odkazy na Internetu

  1. Famous Curves Index
    https://mathshistory.st-andrews.ac.uk/Curves/
  2. Curve (Wikipedia)
    https://en.wikipedia.org/wiki/Curve
  3. Mathematical curves
    https://www.2dcurves.com/index.html
  4. Curves (Wolfram MathWorld)
    https://mathworld.wolfram­.com/topics/Curves.html
  5. Smooth Curve (Wolfram MathWorld)
    https://mathworld.wolfram­.com/SmoothCurve.html
  6. Spirals (Wolfram MathWorld)
    https://mathworld.wolfram­.com/topics/Spirals.html
  7. An Interactive Introduction to Splines
    https://ibiblio.org/e-notes/Splines/Intro.htm
  8. Parabola
    https://www.2dcurves.com/co­nicsection/conicsectionp.html
  9. Hyperbola
    https://www.2dcurves.com/co­nicsection/conicsectionh.html
  10. Dioklova kisoida
    https://cs.wikipedia.org/wi­ki/Dioklova_kisoida
  11. Archimédova spirála
    https://cs.wikipedia.org/wi­ki/Archim%C3%A9dova_spir%C3%A1la
  12. Conchoid (mathematics)
    https://en.wikipedia.org/wi­ki/Conchoid_(mathematics)
  13. Algebraic curve
    https://en.wikipedia.org/wi­ki/Algebraic_curve
  14. Transcendental curve
    https://en.wikipedia.org/wi­ki/Transcendental_curve
  15. Spiral
    https://en.wikipedia.org/wiki/Spiral
  16. List of spirals
    https://en.wikipedia.org/wi­ki/List_of_spirals
  17. Hyperbolická spirála
    https://cs.wikipedia.org/wi­ki/Hyperbolick%C3%A1_spir%C3%A1la
  18. Hyperbolic Spiral
    https://mathworld.wolfram­.com/HyperbolicSpiral.html
  19. Lituus (mathematics)
    https://en.wikipedia.org/wi­ki/Lituus_(mathematics)
  20. Spiral of Spirals Fractals 2 with Python Turtle (Source Code)
    https://pythonturtle.academy/spiral-of-spirals-fractals-2-with-python-turtle-source-code/
  21. Cornu Spiral
    http://hyperphysics.gsu.e­du/hbase/phyopt/cornu.html
  22. Spiral
    https://www.2dcurves.com/spi­ral/spiral.html
  23. Algebraic Curves
    https://mathworld.wolfram­.com/topics/AlgebraicCurves­.html
  24. Elliptic Curves
    https://mathworld.wolfram­.com/topics/EllipticCurves­.html
  25. Eukleidovská konstrukce
    https://cs.wikipedia.org/wi­ki/Eukleidovsk%C3%A1_konstruk­ce
  26. Euclidean Constructions
    http://www.cs.cas.cz/portal/Al­goMath/Geometry/PlaneGeome­try/GeometricConstruction­s/EuclideanConstructions.htm
  27. Kvadratura kruhu
    https://cs.wikipedia.org/wi­ki/Kvadratura_kruhu
  28. Trisekce úhlu
    https://cs.wikipedia.org/wi­ki/Trisekce_%C3%BAhlu
  29. Straightedge and compass construction
    https://en.wikipedia.org/wi­ki/Straightedge_and_compas­s_construction
  30. C.a.R.
    http://car.rene-grothmann.de/doc_en/index.html
  31. CaRMetal (Wikipedia)
    https://en.wikipedia.org/wiki/C.a.R.
  32. CaRMetal (Španělsky a Francouzsky)
    http://carmetal.org/index.php/fr/
  33. CaRMetal (Wikipedia)
    https://en.wikipedia.org/wi­ki/CaRMetal
  34. Regular Polygon
    http://mathforum.org/dr.mat­h/faq/formulas/faq.regpoly­.html
  35. Geometric Construction with the Compass Alone
    http://www.cut-the-knot.org/do_you_know/compass.shtml
  36. Kvadratura kruhu (Wikipedie)
    https://cs.wikipedia.org/wi­ki/Kvadratura_kruhu
  37. Compass equivalence theorem
    https://en.wikipedia.org/wi­ki/Compass_equivalence_the­orem
  38. Curves we (mostly) don't learn in high school (and applications)
    https://www.youtube.com/wat­ch?v=3izFMB91K_Q
  39. 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
  40. Apollonius of Perga
    https://en.wikipedia.org/wi­ki/Apollonius_of_Perga
  41. Catenary arch
    https://en.wikipedia.org/wi­ki/Catenary_arch
  42. Parabolic arch
    https://en.wikipedia.org/wi­ki/Parabolic_arch
  43. Wattova křivka
    https://www.geogebra.org/m/gNh4bW9r
  44. Model stegosaura byl získán na stránce
    http://www.turbosquid.com/HTMLCli­ent/FullPreview/Index.cfm/ID/171071/Ac­tion/FullPreview
  45. Obrázek nohy dinosaura byl získán na adrese
    http://perso.wanadoo.fr/ri­masson/3d/leg.htm
  46. Spirograph
    https://en.wikipedia.org/wi­ki/Spirograph
  47. Epicykloida
    https://cs.wikipedia.org/wi­ki/Epicykloida
  48. Hypocykloida
    https://cs.wikipedia.org/wi­ki/Hypocykloida
  49. Hypotrochoida
    https://cs.wikipedia.org/wi­ki/Hypotrochoida
  50. Superelipsoidy a kvadriky v POV-Rayi
    https://www.root.cz/clanky/su­perelipsoidy-a-kvadriky-v-pov-rayi/
  51. Fifty Famous Curves, Lots of Calculus Questions, And a Few Answers
    https://elepa.files.wordpres­s.com/2013/11/fifty-famous-curves.pdf
  52. Barr, A.H.: Superquadrics and Angle Preserving Transformations,
    IEEE Computer Graphics and Applications, January 1981
  53. Bourke Paul: Quadrics,
    July 1996
  54. Bourke Paul: Superellipse and Superellipsoid,
    January 1990
  55. Faux, I.D. a Pratt, M.J.: Computational Geometry for Design and Manufacture,
    Ellis Horwood Ltd., Wiley & Sons, 1979
  56. Wallace A.: Differential Topology,
    Benjamin/Cummings Co., Reading, Massachussetts, USA, 1968
  57. Glossary of Bridge Terminology
    http://sdrc.lib.uiowa.edu/en­g/bridges/WaddellGlossary/Glos­sC.htm
  58. Brachistochrona
    https://cs.wikipedia.org/wi­ki/Brachistochrona
  59. Missions: Cassini
    https://solarsystem.nasa.gov/mis­sions/cassini/overview/
  60. Giovanni Domenico Cassini
    https://en.wikipedia.org/wi­ki/Giovanni_Domenico_Cassi­ni
  61. Cassini Ovals
    https://mathworld.wolfram­.com/CassiniOvals.html
  62. Geocentrismus
    https://cs.wikipedia.org/wi­ki/Geocentrismus
  63. Who was Giovanni Cassini?
    https://www.universetoday­.com/130823/who-was-giovanni-cassini/
  64. Special plane curves
    http://xahlee.info/Special­PlaneCurves_dir/ConicSecti­ons_dir/conicSections.html
  65. Why Does Slicing a Cone Give an Ellipse?
    https://infinityisreallybig­.com/2019/02/08/why-does-slicing-a-cone-give-an-ellipse/
  66. Interpolace
    https://mathonline.fme.vut­br.cz/pg/Algoritmy/05_APROX_KRIV­KY.htm
  67. Lagrange Polynomial Interpolation
    https://pythonnumericalmet­hods.berkeley.edu/notebook­s/chapter17.04-Lagrange-Polynomial-Interpolation.html
  68. Python Program for Lagrange Interpolation Method (with Output)
    https://www.codesansar.com/numerical-methods/python-program-lagrange-interpolation-method.htm
  69. Smooth Paths Using Catmull-Rom Splines
    https://qroph.github.io/2018/07/30/smo­oth-paths-using-catmull-rom-splines.html
  70. 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
  71. Geometrie/Úvod do křivek
    https://cs.wikibooks.org/wi­ki/Geometrie/%C3%9Avod_do_k%C5%99i­vek
  72. B-Spline Curves and Surfaces (1)
    http://www.cad.zju.edu.cn/ho­me/zhx/GM/006/00-bscs1.pdf
  73. Praktické ukázky možností aplikace Mandelbulber při tvorbě animací
    https://www.root.cz/clanky/prakticke-ukazky-moznosti-aplikace-mandelbulber-pri-tvorbe-animaci/
  74. Kochanek–Bartels spline
    https://en.wikipedia.org/wi­ki/Kochanek%E2%80%93Bartel­s_spline
  75. class KochanekBartels
    https://splines.readthedoc­s.io/en/latest/_modules/spli­nes.html#KochanekBartels

Byl pro vás článek přínosný?