Fraktal - konkurs

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!

fraktal_1

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.

paproc

 

Książka profesora Mollera, wraz z przykładowym kodem jest cały czas dostępna na stronach firmy MathWork.

Systemy Lindemayera

fraktal2

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 z = x + iy i sprawdzić, co się dzieje z ciągiem z_{n+1} = {z_n}^2 + C . Na wykresie punkt otrzymuje kolor odpowiadający ostatniej liczbie n, dla której |z_n| < 2 .

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

fraktal3

Jak widać, możliwości jest sporo. Skarpetki czekają!

(Visited 635 times, 1 visits today)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *