Fraktal
Dziś firma ONT startuje z konkursem "Fraktal", w którym można wygrać kubek z logiem MATLAB&Simulink, parę ciepłych skarpet na zimę z wyszytą membraną MathWorks'a i inne, równie atrakcyjne nagrody. Zasady konkursu są bardzo proste. Do 23 października na adres mailowy konkurs@ont.com.pl należy nadesłać stworzony w MATLABie obraz przedstawiający fraktal oraz m-kod służący do wygenerowania tegoż obrazu. Oceniany, od strony artystycznej, będzie wyłącznie obraz. Kod posłuży jedynie do weryfikacji, że dzieło powstało w MATLABie, a nie na kalkulatorze na przykład. Zasady proste, nagrody ciekawe, zapraszam do wzięcia udziału!
W związku z wielkim konkursem o ciepłe skarpetki dzisiaj wpis poświęcony fraktalom.
Fraktal to słowo pochodzące od łacińskiego fractus, tłumaczonego na złamany, cząstkowy. Definicja mówi, że fraktal to obiekt samopodobny, w budowie którego możemy odnaleźć jakiś powtarzający się wzór. Definicja jak widać nie jest specjalnie jednoznaczna, nie ma też jednego przepisu na tworzenie fraktali. Można je tworzyć na dziesiątki różnych sposobów, poniżej kilka przykładów.
Liść paproci
Temu fraktalowi profesor Cleve Molle, twórca MATLABa poświęcił cały rozdział w swojej książce „Experiments with MATLAB”.
Liść paproci powstaje w bardzo prosty sposób. W skrócie, bierzemy punkt startowy i na jego podstawie, zgodnie z prostym wzorem, wyznaczamy lokacje kolejnego punktu. Wzór nie jest jednak zawsze taki sam, przed transformacją losujemy jedną z trzech jego wersji. By osiągnąć widoczny efekt procedurę powtarzamy wiele, wiele razy.
Książka profesora Mollera, wraz z przykładowym kodem jest cały czas dostępna na stronach firmy MathWork.
Systemy Lindemayera
W przypadku L-systemów fraktale mogą być tworzone z wyłączeniem czynnika losowości. Początkowy prosty łańcuch symboli reprezentujących reguły rysowania fraktalu jest w kolejnych iteracjach zwielokrotniany na tej zasadzie, że pojedynczy symbol zostaje zastąpiony całym łańcuchem. Końcowy łańcuch jest interpretowany jako ścieżka, tj. pojedyncze znaki oznaczają „skręć w lewo o kąt”, ‘”idź prosto”, „cofnij się” itp. Wydaje się to skomplikowane, jednak analiza poniższego, przykładowego m-kodu powinna wszystko wyjaśnić
% zdefiniowanie regół start = 'X'; zamiana_X = 'F[[X]+X]+F[+FX]X'; zamiana_F = 'FF'; pochylenie = 25; % 25° powtorzen = 6; % tworzenie wzoru wzor = start; for i=1:powtorzen wzor = strrep(wzor,'X',zamiana_X); wzor = strrep(wzor, 'F', zamiana_F); end % rysowanie zgodnie ze wzorem X = 0; Y = 0; kat = pi/8; % start licznik_pamieci = 1; hold on % dla każdego znaku wykonaj for i=1:length(wzor) switch wzor(i) % znaki + i - zmieniają kąt rysowania case '+' kat = kat + pochylenie*3.14/180; case '-' kat = kat - pochylenie*3.14/180; % znaki [ oraz ] oznaczają operacje na pamięci case '[' pamiec(licznik_pamieci,:) = [X Y kat]; licznik_pamieci = licznik_pamieci + 1; case ']' licznik_pamieci = licznik_pamieci - 1; X=pamiec(licznik_pamieci,1); Y=pamiec(licznik_pamieci,2); kat=pamiec(licznik_pamieci,3); % znaki X i F powodują narysowanie linii i zmianę położenia punktu otherwise nowyX = X + cos(kat); nowyY = Y + sin(kat); line([Y nowyY], [X nowyX]); X = nowyX; Y = nowyY; end end
Zbiór Julii
Najbardziej złożony w tym zestawieniu typ fraktalu. Idea konstrukcji jest następująca: na płaszczyźnie zespolonej należy wybrać punkt i sprawdzić, co się dzieje z ciągiem . Na wykresie punkt otrzymuje kolor odpowiadający ostatniej liczbie n, dla której .
C=0.285+0.01i; rozdz = 1024; zakres_x = linspace(-0.5,1,rozdz); zakres_y = linspace(-1.25,0.5,rozdz); obraz = zeros(rozdz); m = 256; for x = zakres_x for y = zakres_y z = x + 1i*y; n = 0; while (norm(z) < 2) && (n < m) z = z^2 + C; n = n + 1; end obraz((x==zakres_x),(y==zakres_y)) = n; end end imagesc(obraz) axis off
Jak widać, możliwości jest sporo. Skarpetki czekają!