Digitális ábrázolás / BMEEPAGA205

Fraktál

Háttér

Koch snowflake

A fraktáloknak egye­lőre nincs kon­szen­zussal el­fo­gadott teljes­körű mate­matikai defi­níciója – a fel­merült defi­níciók esetén mindig talál­tak olyat, melyet tulaj­donságai alapján frak­tálnak lehet tekinteni, ám e szemp­ontból érdek­telen (pl. az ön­hason­lóság az egyenes ese­tén is tel­je­sül), vagy olyat, amit érdemes lehet tárgyalni, pedig eléggé külön­böző (pl. az itt tár­gyalt abszt­rakt, de­ter­mi­nisz­tikus frak­tálok konst­ruk­ciója nyil­ván sokban eltér a termé­szeti formá­kat után­zó sztoc­hasz­ti­kus frak­tálok­tól, mégis érződik elvi hason­lóság). A sza­ba­tos de­fi­níció hiánya ugyanakkor nyilván nem jelenti azt, hogy a frak­tálok vizs­gá­lata ne vetne fel számos érdekes prob­lémát.

Az illuszt­ráción szereplő alakzat a Koch hópehely, az egyik legelső és talán leg­ismer­tebb olyan fraktál, mely egy­értelmű helyet­tesí­tési szabá­lyok alap­ján, rekur­zív módon gene­rálható.

A kiinduló forma (initiator) egy szabá­lyos sokszög, a helyet­tesítési szabály (generator) pedig az, hogy a sok­szög oldalait elhar­ma­doljuk, majd minden oldal középső har­madát egy szabá­lyos három­szög két másik olda­lával helyet­te­sít­jük. E helyet­tesí­tést rekur­zív módon ismé­telve az oldal­hosszak összege (a sík­idom kerü­lete) minden lépésben 1⅓ mér­tékben növek­szik – azaz elvileg (a végte­lenedik ite­rá­cióban) vég­telen. Mind­eköz­ben terü­lete nyil­ván­valóan véges, hiszen sehol nem lép ki a ki­induló sík­idom köré írt kör terü­le­té­ről.

Egy lehetséges megoldás: LETÖLTÉS

A fraktálok leírá­sá­nak egy bevett formá­lis nyelve az L-rendszer (Lindenmayer Arisztid után), melynek nyelvtani szabályait iteratív módon kell alkalmazni. E rekur­zív jellegből adódó ön­hason­lóság révén a fraktál­szerű formák könnyen leír­hatók. Ha minden szim­bó­lum­hoz pon­tosan egy ki­menet kap­cso­ló­dik, akkor a rend­szer deter­minisz­tikus, ha több (és minde­gyiket bizo­nyos való­szí­nű­ség­gel vá­laszt­juk ki minden ite­ráció során), akkor sztochasztikus.

A Koch-hó­pehely egysze­rűen leír­ható L-rend­szer­ként egyet­len vál­tozó (f), és két konstans (+, ) segít­ségével. Az f („draw forward”) egy sza­kaszt raj­zol, a + balra for­du­lást (120°), a  jobb­ra for­du­lást (60°) jelent. A ki­induló sza­bá­lyos három­szög leír­ható f+f+f formáb­an, a helyet­tesí­tési sza­bály pedig f → f-f+f-f for­mában (ez a SUBSTITUTE() függvénnyel könnyen megvalósítható). Az első ite­ráció így a követ­kező­képp néz ki: f–f+f–f+f–f+f–f+f–f+f–f. A követ­kező ite­ráció sajnos emberi fogyasz­tásra már kevés­sé al­kal­mas: f–f+f–f–f–f+f–f+f–f+f–f–f–f+f–f+f–f+f–f–f–f+f–f+f–f+f–f–f–f+f–f+f–f+f–f–f–f+f–f+f–f+f–f–f–f+f–f. A rend­szer számunk­ra kényel­metlen tulaj­don­sága az is, hogy rela­tív szö­geket al­kal­maz, azaz a követ­kező szegmens irá­nyát az előző szeg­mens irá­nyá­hoz képest adja meg – ezért egy má­sik rend­szer alkal­mazá­sát java­sol­juk.

Paraméterek

 • Rendszámok

A helyettesítési szabály egy lehetséges reprezentációja, hogy a teljes fraktált egy többjegyű számként kezeljük.

A Koch-hópehely esetében az első iteráció (3 oldal 4 szegmensre osztva) leírható a négyes számrendszer első 12 számaként:
00, 01, 02, 03, 10, 11, 12, 13, 20, 21, 22, 23

Hozzuk létre a táblázatban a szükséges darabszám-paramétereket!
 • Méretek

A fraktál befoglaló mérete az iteráció során nem változik, hiszen épp azt akarjuk illusztrálni, hogy a kerület csak a pontosabb mérés, azaz a „rövidebb vonalzó” miatt növekszik.

Hozzuk létre a táblázatban a szükséges méret-paramétereket!
 • Irányok

Természetesen a fenti rendszámok csak a logikai vázat írják le, önmagukban nem árulják el az egyes szegmensek irányát.

Hozzuk létre a táblázatban az irányokat megadó paraméter-tömböket!

Szögek

A fraktál ábrázolásához értelemszerűen minden egyes szakaszának koordinátáját ki kell számoljuk. Ennek egy egyszerű megoldása, ha lekövetjük a kezdőpontból indított vonal útját – mivel minden szegmens hossza azonos, ehhez tulajdonképp elegendő azt ismernünk, hogy az aktuális pontból induló él milyen irányú. Erre alkalmas az előbbiekben vázolt rekurzív megoldás.

A program sajnos nem tud tetszőleges számrendszerben számolni, így nem számíthatunk arra a vizuális segítségre, mely a számra nézve azonnal mutatja, hogy hányadik iterációs szintnél járunk. Az egyes „számjegyek” értékei viszont enélkül is elég egyszerűen kinyerhetők.

Hozzuk létre az élek irányait megadó tömb sorait és oszlopait!

A fenti képlet elsőre talán nem triviális – érdemes végiggondolni, melyik sorban és oszlopban mit is csinál.

Strommer decimal anti-snowflake

Érdemes talán megjegyezni, hogy könnyen lehet olyan szabályt kitalálni, amelynél az iterácós lépéseknél adódó szegmensek száma (itn) éppen tíz – ekkor nyilván a rendszám is a tízes számrendszerben lesz (a képen pgn= 4).

Mivel itt a megszokott tízes számrendszert kell használni, talán könnyebb megérteni, mi történik.

Valójában azonban minket nem maga a rendszám érdekel, hanem annak aktuális számjegyei alapján kalkulálható szög. Mint láttuk, ezt nem is egy helyről kell kiolvasni, hanem az első oszlop esetén a poligon oldalainak _pgd tömbjéből, a többi esetben az iteráció _itd tömbjéből – a valós érték pedig ezek összege lesz.

Hozzuk létre az élek irányait megadó tömböt!

Koordináták

Az előbbi _d tömb tehát megadja az egyes iterációs lépésekből örökölt elforgatási szögeket, csak össze kell adni azokat.

Számoljuk ki az egyes élek valós szögét!

Az előbbi módon kapott _a tömb tehát megadja minden él (abszolút) irányát. Mivel az élek hossza is ismert (l), akár már meg is lehet rajzolni a fraktált. Ahhoz viszont, hogy diagramot készíthessünk, szükség van minden pont koordinátájára.

Számoljuk ki az egyes élek végpontjainak koordinátáit!

Az x és y koordináták ismeretében már nincs más teendő, mint a diagram beszúrása.

Cesàro snowflake
Hozzuk létre a koordináták által leírt sokszög diagramját!

Mivel a vázolt megoldás alkalmas a fraktálok egy teljes családjának ábrázolására, érdemes kicsit játszani az egyes paraméterekkel, hogy megtapasztaljuk, milyen lehetőségeket rejtenek.