Miten yksinkertaisia, viivoista tai esim. neliöistä koostuvia fraktaaleja ohjelmoidaan? Jos vaikka haluaisin piirtää Sierpinskin kolmion tms., pitääkö jokainen viiva erikseen piirtää vai onko siihen jokin matemaattinen kaava, joka laskee kuuluuko ruudulla oleva piste kuvioon?
Entä mandelbrot yms.?
P.S. ajattelin sijoittaa viestin tänne, koska fraktaalejahan voi piirtää melkein millä tahansa kielellä...Sanokaa jos ei ole oikea paikka :)
Lyhyt vastaus: iterointi.
Yksinkertaisimman fraktaalin saa aikaan vaikka iteroimalla funktiota H(x, y)=(y + 1 - ax^2, bx) eri a:n ja b:n arvoilla (esim. a=1,4, b=0,3) [lähteenä lukiokurssin Numeerinen matematiikka -kirja].
Iterointi tarkoittaa karkeasti sitä, että edellisestä lausekkeesta saadut arvot sijoitetaan seuraavaan lähtöarvoiksi. Esimerkiksi neliöjuuri luvusta a voidaan laskea iteroimalla funktiota x = 1/2 * (x + a/x), esim. lasketaan luvun 5 neliöjuuri alkuarvauksella 2:
x = 0,5 * (2 + 5/2) = 2,25 x = 0,5 * (2,25 + 5/2,25) = 2,23611 x = 0,5 * (2,23611, + 5/2,23611) = 2,2360
Ja näin jatketaan, ja lopulta iterointi suppenee tiettyyn arvoon (tämä voidaan osoittaa melko helposti). Oikeasti √5=2,236...
Vastaavalla tavalla voit iteroida tuota antamaani kahden muuttujan funktiota sijoittamalla x-koordinaatin muuttujaksi x ja y-koordinaatin muuttujaksi y. Tämän jälkeen piirrät aina pisteen kohtaan (x,y) jonka tuo funktio antaa, jolloin saat erään fraktaalikuvion.
Tässä vielä joku vanha kovalevyn syövereistä löytynyt ohjelmani joka ehkä selventää asiaa, iteroi juuri tuota yllä esittelemääni funktiota: http://heikki.homelinux.net/~heikki/fraktaali.
"Hienompia" fraktaaleja saa aikaan erilaisia funktioita iteroimalla, esim. ns. Mandelbrotin joukko saadaan iteroimalla funktiota f(z)=z^2+c, missä z ja c ovat kompleksilukuja ja värittämällä sitten kompleksilukua vastaava tason piste tietyllä värillä, joka riippuu iterointikerran määrästä.
hmm...eli heitän hatusta a ja b-arvot...teenkö saman x- ja y-arvoille? Kuinka kauan iterointia pitäisi jatkaa? Ja pitäisikö iteroinnin mennä näin:
x=y+1-a*x^2; y=b*x;
vai näin:
tempX=x; tempY=y; x=tempY+1-a*tempX; y=b*tempX;
,jolloin y-arvo laskettaisiin vanhalla x-arvolla eikä uudella?
Tuolla jälkimmäisellä tavalla.
Kaikilla a:n ja b:n arvoilla tuosta ei edes tule fraktaalia, mutta ainakin antamillani arvoilla a=1,4, b=0,3 pitäisi tulla. x:lle ja y:lle valitaan alussa vaan jotkut arvot, tämän jälkeen kannattaa iteroida vaikka 100 kertaa jolloin alkuarvojen vaikutus häviää. Se, kuinka paljon pitää iteroida jotta saa aikaan hienon kuvion onkin sitten hankalampi sanoa, kokeilemalla löydät varmaan hyvän arvon.
Aihe on jo aika vanha, joten et voi enää vastata siihen.