Innen: Hungarian Scratch-Wiki
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.