Fraktálok

Fraktálok

A fraktál nem más, mint egy séma (vagy minta), amely egy képet rajzol ki. A fraktálok nagyon gyakran a természetben is előfordulnak. Ismert fraktálok közé tartozik például a Sierpiński-háromszög, a Koch-görbe és a Mandelbrot-halmaz. Leggyakrabban a fraktálok felépítéséhez több lépésre (iterációra) van szükség, melyek lépésről lépésre finomítják a fraktált. Elméletben egy fraktál létrehozásához végtelen számú lépés szükséges, azonban az iterációk száma a gyakorlatban véges.


Fraktálfa

Egy fa segítségével könnyen bemutatható a rekurzió működése. Minden fa ugyanis egy ágból és valahány alfából – nem a görög betű, hanem mint az elnök-alelnök – áll, mely azonban újfent egy ágból és valahány alfából áll. Az egyszerűség kedvéért a továbbiakban a bináris fákkal foglalkozunk. Jellemzőjük, hogy minden ágnak további 2 ága van.


Írjunk egy olyan meghatározást, mely 3 paraméter segítségével kirajzolja a fraktált. A 3 paraméter legyen:

- n (famagasság/ahányszor végrehajtjuk a faépítést),
- h (az ág hossza) és 
- fsz (az előző szint ágához viszonyítva ahány fokos szögben nőnek az új ágak).

Meghatározás készítéséhez kattints a „Továbbiak”, majd „Parancs létrehozása”-ra. Ha legörgeted a beállítások pontot, a parancs által felhasznált elemeket (paramétereket) állíthatod be.

Mivel nem akarunk a végtelenségig fákat rajzolgatni, szükségünk van egy leállási feltételre. N jelölte azt, hogy milyen magasra szeretnénk eljutni, azaz hányszor kell még rekurzívan meghívni az eljárást. Minden szint kirajzolása után nő a fa, azaz a kezdeti famagasságunk eléréséhez már csak N-1 szint kell. Ezért kell rekurzív hívásonként eggyel csökkenteni a fa szintet (N-1), az ághosszt pedig felezni kell (h/2), mert minden szinten felére csökken az ágak hossza, a forgásszög állandó . A rajzolás akkor álljon le, ha N=0. Ez jelenti azt, hogy nincs szükség több szintre.

Az 1. szint a fa törzse (legelső ága), egy függőleges, h hosszú vonal, melyből 2 ág nő ki szimmetrikusan, ághosszuk az előző szinten lévő ágak hosszúságának a fele (h/2). Forduljunk balra fsz szöget, majd rajzoljuk ki a h/2 hosszúságú ágat. Mivel szimmetrikusak, ezért a törzzsel azonos szöget (fsz) zárnak be. Ennek ismeretében kiszámolható, hogy a bal ágból hány fokos fordulattal (2*fsz) juthatunk el a jobb ág kezdőpontjához. Forduljunk 2*fsz-t jobbra és rajzoljuk ki a következő ágat.

Annak érdekében, hogy ne össze-vissza épüljön fel a fa, be kell tartanunk az állapotátlátszóság elvét. Ez azt jelenti, hogy a rajzeszközzel vissza kell térnünk majd az aktuálisan elvégzendő feladat kiindulópontjára, hogy szükség esetén innen újabb műveleteket hajthassunk végre. (Azaz ha előre kell menni, akkor menj majd utána hátra, hogy visszatérj az eredeti helyedre.

Végezetül pedig már csak arra a műveletre van szükségünkj, mely törli a korábbi kirajzolást, amellyel beállíthatjuk, hogy hol, milyen vastagsággal és színnel nőjön ki a fánk, de a legfontosabb: ezzel indítjuk el a farajzoló műveletünket tetszőleges szinttel, ághosszal és forgásszöggel.

meghatározás: farajzol (n) szinttel (h) aghosszal (fsz) forgassal
ha <(n)=[0]> akkor
[ez a feladat v] álljon le
end
menj (h) lépést
fordulj (fsz) fokot
farajzol((n)-(1)) szinttel ((h)/(2)) aghosszal (fsz) forgassal
fordulj ((-2)*(fsz)) fokot
farajzol((n)-(1)) szinttel ((h)/(2)) aghosszal (fsz) forgassal
fordulj (fsz) fokot
tollat emeld fel
menj ((0)-(h)) lépést
tollat tedd le


zz-ra kattintáskor
ugorj x: (0) y: (-175)
nézz (90 v) fokos irányba
tollméret legyen (5)
töröld a rajzokat
tollat tedd le
farajzol (n) szinttel (h) aghosszal (fsz) forgassal 


Hasznos információ: 'Szint megadása csúszkával

- kattints az adatok pontra
- hozz létre egy új változót, nevezd el
- kattints jobb gombbal a bal felső sarokban megjelent, a változót aktuálisan mutató területre
- válaszd a csúszka lehetőséget

A Koch-görbe

A Koch-görbe egy relatív egyszerű fraktál, ezáltal nagyon egyszerűen implementálható Scratch környezetben. A neve kicsit becsapós, ugyanis a fraktál csak egyenes vonalakból áll. Érdekesség, hogy a Koch-görbe a Koch-hópehely alkotóeleme.

A Koch-görbe több lépésben rajzolható ki. Kezdetben (0. lépésben)csak egy egyenes vonalunk van, melyet minden lépésben 3 azonos részre osztunk fel úgy, hogy a középső részből egy „csúcs” keletkezzen. Ezt a folyamatot ismételjük az újonnan létrejött szakaszokra, ezek az iteráció lépései.

Az eredeti szakasz elharmadolása után a középső harmad és a „csúcs” egy szabályos háromszöget alkot. Ez azt jelenti, hogy minden szöge 60°-os. Ennek ismeretében kiszámolható, hogy hány fokot kell fordulnunk rajzolás során. Ezzel a módszerrel, a szükséges számolások után kirajzolható az első iteráció utáni fraktál.

Azonban ha több iterációt szeretnénk végrehajtani, ez a módszer nem praktikus, rekurzióhoz kell fordulnunk. Azaz a „menj hossz/3” utasítás helyett meghívjuk újra magát az egész utasítássorozatot, csak az eredeti hossz harmadával.

meghatározás: fraktalrajzol (m) melyseggel, szakaszhossza: (h)
ha <(m)=[1]> akkor
menj ((h)/(3)) lépést
különben
fraktalrajzol((m)-(1)) melyseggel, szakaszhossza: ((h)/(3))
end
fordulj (60) fokot
ha <(m)=[1]> akkor
menj ((h)/(3)) lépést
különben
fraktalrajzol((m)-(1)) melyseggel, szakaszhossza: ((h)/(3))
end
fordulj (-120) fokot
ha <(m)=[1]> akkor
menj ((h)/(3)) lépést
különben
fraktalrajzol((m)-(1)) melyseggel, szakaszhossza: ((h)/(3))
end
fordulj (60) fokot
ha <(m)=[1]> akkor
menj ((h)/(3)) lépést
különben
fraktalrajzol((m)-(1)) melyseggel, szakaszhossza: ((h)/(3))
end


(k v) lenyomásakor
nézz (90 v) fokos irányba
ugorj x:(-240) y:(-179)
töröld a rajzokat
tollat tedd le
fraktalrajzol (Iteracio) melyseggel, szakaszhossza: (480)
tollat emeld fel

Végezetül nincs más dolgunk, mint a fraktálrajzoló eljárásunk elindítása. Adjuk meg például, hogy a k gomb lenyomására induljon el az eljárásunk.


  • A lap utolsó módosítása: 2018. december 9., 21:19