Znalost moderního programování otevírá dveře budoucností.

asdfasdf

Algoritmické umění a fraktály

v Pythonu II.

Sdílet příspěvek

Rekurze, geometrie a praktické algoritmy v knihovně turtle

Algoritmické umění představuje efektivní způsob, jak propojit výuku programování s vizuálně atraktivními výstupy. V této navazující části se zaměříme na dva významné fraktální obrazce – Sierpinského trojúhelník a Hilbertovu křivku. Oba příklady rozvíjejí práci s rekurzí, funkcemi a prostorovou představivostí, avšak každý z nich akcentuje odlišný algoritmický princip i didaktický přínos.

Sierpinského trojúhelník – rekurzivní dělení plochy

Sierpinského trojúhelník patří mezi základní fraktální útvary využívané ve výuce algoritmizace. Jeho hlavní charakteristikou je rekurzivní dekompozice plochy – původní trojúhelník se opakovaně rozděluje na tři menší trojúhelníky, přičemž středový je vynechán.

Algoritmický princip

Základem algoritmu je práce s vrcholy trojúhelníku reprezentovanými jako seznam souřadnic. Pro výpočet nových trojúhelníků je nezbytné:

vypočítat středy stran (aritmetický průměr souřadnic),

rekurzivně volat vykreslovací funkci pro tři rohové trojúhelníky,

řídit hloubku rekurze parametrem uroven.

Barevné odlišení jednotlivých úrovní pomocí seznamu barev a operátoru modulo zvyšuje názornost algoritmu a podporuje experimentování.

Funkční příklad v Pythonu


    import turtle

    def stred(p1, p2):
        """Vrátí střed úsečky mezi body p1 a p2."""
        return ((p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2)

    def nakresli_trojuhelnik(t, body, barva):
        """Vykreslí vyplněný trojúhelník dané barvy."""
        t.fillcolor(barva)
        t.begin_fill()
        t.up()
        t.goto(body[0])
        t.down()
        t.goto(body[1])
        t.goto(body[2])
        t.goto(body[0])
        t.end_fill()

    def sierpinski(t, body, uroven, barvy):
        """Rekurzivně vykreslí Sierpinského trojúhelník."""
        nakresli_trojuhelnik(t, body, barvy[uroven % len(barvy)])
        if uroven > 0:
            sierpinski(
                t,
                [body[0], stred(body[0], body[1]), stred(body[0], body[2])],
                uroven - 1,
                barvy
            )
            sierpinski(
                t,
                [body[1], stred(body[0], body[1]), stred(body[1], body[2])],
                uroven - 1,
                barvy
            )
            sierpinski(
                t,
                [body[2], stred(body[2], body[1]), stred(body[0], body[2])],
                uroven - 1,
                barvy
            )

    # Nastavení plátna a želvy
    screen = turtle.Screen()
    screen.setup(800, 600)

    t = turtle.Turtle()
    t.speed(0)
    t.hideturtle()

    barvy = ["blue", "red", "green", "yellow"]
    body = [(-200, -100), (0, 200), (200, -100)]

    sierpinski(t, body, 4, barvy)

    screen.mainloop()
    

Didaktický přínos

Sierpinského trojúhelník je vhodný zejména pro:

pochopení rekurzivního rozkladu problému,

práci se seznamy a předáváním argumentů,

rozvoj logického a geometrického myšlení.

Hilbertova křivka – rekurze v pohybu prostoru

Hilbertova křivka představuje pokročilejší fraktální útvar, který na rozdíl od Sierpinského trojúhelníku nepracuje s plochou, ale s kontinuálním zaplněním prostoru pomocí jediné křivky. Její význam přesahuje estetickou rovinu a má konkrétní technické využití.

Algoritmická struktura

Implementace je založena na rekurzivní funkci, která:

pracuje s parametry hloubky rekurze, úhlu otáčení a délky kroku,

provádí čtyři rekurzivní volání v jednom kroku,

využívá kladné i záporné úhly k zajištění správné orientace křivky.

Tento typ rekurze je pro studenty náročnější, protože vyžaduje sledování směru a pořadí volání.

Funkční příklad v Pythonu


    import turtle

    def hilbert(t, uroven, uhel, krok):
        """Rekurzivně vykreslí Hilbertovu křivku."""
        if uroven == 0:
            return

        t.right(uhel)
        hilbert(t, uroven - 1, -uhel, krok)

        t.forward(krok)
        t.left(uhel)
        hilbert(t, uroven - 1, uhel, krok)

        t.forward(krok)
        hilbert(t, uroven - 1, uhel, krok)

        t.left(uhel)
        t.forward(krok)
        hilbert(t, uroven - 1, -uhel, krok)
        t.right(uhel)

    # Nastavení plátna
    screen = turtle.Screen()
    screen.setup(800, 600)

    t = turtle.Turtle()
    t.speed(0)
    t.hideturtle()

    t.up()
    t.goto(-100, 100)
    t.down()

    hilbert(t, 4, 90, 10)

    screen.mainloop()
    

Praktické využití

Hilbertova křivka nachází uplatnění zejména v:

mapování dat a databázových indexech,

algoritmech prostorového dělení,

vizualizaci složitých datových struktur a algoritmů.

Didaktický význam

Z pohledu výuky programování umožňuje:

procvičit složitější formy rekurze,

pochopit význam parametrů a jejich změn v rekurzivních voláních,

propojit matematiku, algoritmizaci a informatiku s reálnými aplikacemi.

Sierpinského trojúhelník a Hilbertova křivka představují dva rozdílné, ale vzájemně se doplňující přístupy k fraktální geometrii v Pythonu. První klade důraz na rozklad plochy a práci se strukturami dat, druhý na řízení pohybu v prostoru a algoritmickou přesnost. V didaktickém kontextu jsou oba obrazce velmi vhodné pro projektovou a soutěžní výuku, kde studenti mohou experimentovat s parametry, barvami i vlastními úpravami algoritmů.

Související články

Algoritmické umění a fraktály v Pythonu I.

Algoritmické umění a fraktály v Pythonu III.

PUBLIKOVÁNO
18.01.2026, 19:34
ODKAZ
https://www.weloveit.education/Article/20260118-Algoritmicke-umeni-a-fraktaly-v-Pythonu-II/
asfdasd
asfdasd
asfdasd
asfdasd
asfdasd
asfdasd

Začni hned teď
pracovat na zlepšení svých znalostí.

Vytvoř si vlastní síť zkušeností, přesně tak, jak potřebuješ.