Wpisany przez Tomasz Lubiński,
18 sierpnia 2008 22:39
Po raz pierwszy pojęcie fraktala zostało użyte przez Benoit Mandelbrota w latach 70-tych XX wieku. Po łacinie fractus oznacza podzielny, ułamkowy, cząstkowy. Nazwa ta nie ma ścisłej matematycznej definicji. Oznacza ona obiekty, które mają nietrywialną strukturę w każdej skali oraz są samopodobne - czyli każda ich część przypomina całość. Mandelbrot prowadził badania przy pomocy komputera. Pierwsze obrazy zbioru opublikował w roku 1980.
By zdefiniować zbiór Mandelbrota, zdefiniujemy najpierw dla danego punktu p na płaszczyźnie zespolonej nieskończony ciąg liczb zespolonych z0, z1, z2, ... o wartościach zdefiniowanych następująco:
A gdzie tutaj wspomniany fraktal? Otóż fraktalem jest brzeg tego zbioru. W praktyce by narysować fraktale oblicza się kolejne przybliżenia zbioru, które oznacza się różnymi kolorami. I tak kolejne przybliżenia zdefiniujemy jako zbiór liczb zespolonych p takich, że:
Zatem funkcję obliczającą z jakim maksymalnym przybliżeniem dany punkt p należy do zbioru Mandelbrota możemy zdefiniować następująco (gdzie maxIter to maksymalne przybliżenie z jakim chcemy wyznaczać zbiór):
Przypomnijmy jeszcze działania na liczbach zespolonych jakie będziemy potrzebować podczas obliczeń. Liczba zespolona z składa się z części rzeczywistej zr oraz części urojonej zi, czyli
Dla kolejnych punktów na płaszczyźnie, obliczamy przybliżenia zgodnie z podanym algorytmem i wzorami. Oś X oznacza wartości reczywiste, natomiast os Y wartości urojone. Przedstawiając kolejne przybliżenia na płaszczyźnie (lewy górny róg ma współrzędne -2.0 + -1.25i, dolny prawy róg ma współrzędne 0.5 + 1.25i) i oznaczając je różnymi kolorami otrzymujemy wynik - zbiór Mandelbrota, zwany też czasami ze względu na swój wygląd żukiem Mandelbrota. Na obrazie poniżej kolory kolejnych przybliżeń wyznaczono zgodnie z modelem HSV, ale można też użyć do tego celu odcieni szarości, bądź innego modelu barw.
Dokonując przybliżenia wybranych obszarów możemy otrzymać m.in:
By zdefiniować zbiór Mandelbrota, zdefiniujemy najpierw dla danego punktu p na płaszczyźnie zespolonej nieskończony ciąg liczb zespolonych z0, z1, z2, ... o wartościach zdefiniowanych następująco:
z_0 = 0\\\\
z_{n+1} = z_n^2 + p
Zbiór Mandelbrota (ang. Mandelbrot Set) definiujemy jako zbiór liczb zespolonych p takich, że zdefiniowany powyżej ciąg nie dąży do nieskończoności.A gdzie tutaj wspomniany fraktal? Otóż fraktalem jest brzeg tego zbioru. W praktyce by narysować fraktale oblicza się kolejne przybliżenia zbioru, które oznacza się różnymi kolorami. I tak kolejne przybliżenia zdefiniujemy jako zbiór liczb zespolonych p takich, że:
- 1 przybliżenie: wszystkie punkty
- 2 przybliżenie: |z1| < 2
- 3 przybliżenie: |z1| < 2 oraz |z2| < 2
- 4 przybliżenie: |z1| < 2 oraz |z2| < 2 oraz |z3| < 2
- ...
- n-te przybliżenie: |z1| < 2 oraz |z2| < 2, ... |zn-1| < 2
Zatem funkcję obliczającą z jakim maksymalnym przybliżeniem dany punkt p należy do zbioru Mandelbrota możemy zdefiniować następująco (gdzie maxIter to maksymalne przybliżenie z jakim chcemy wyznaczać zbiór):
przyblizenie(p)
begin
iter := 0;
z := 0;
repeat
iter := iter + 1;
z = z^2 + p;
until (|z| < 2) and (iter < maxIter)
przyblizenie = iter;
end;
Przypomnijmy jeszcze działania na liczbach zespolonych jakie będziemy potrzebować podczas obliczeń. Liczba zespolona z składa się z części rzeczywistej zr oraz części urojonej zi, czyli
z = z_{r} + iz_{i}
Potęgowanie definiujemy następująco:
z^2 = (z_r^2 - z_i^2) + i(2*z_r * z_i)
Dodawanie definiujemy następująco:
a + b = (a_r + b_r) + i(a_i + b_i)
Moduł z liczby zespolonej definiujemy następująco:
|z|=\sqrt{z_{r}^{2}+z_{i}^{2}}
dlatego też w praktyce warunek |z| < 2 zastępuje się równoważną nierównością
z_{r}^{2}+z_{i}^{2} < 4
Pozbywamy się tutaj czasochłonnego obliczania pierwiastka kwadratowego.Dla kolejnych punktów na płaszczyźnie, obliczamy przybliżenia zgodnie z podanym algorytmem i wzorami. Oś X oznacza wartości reczywiste, natomiast os Y wartości urojone. Przedstawiając kolejne przybliżenia na płaszczyźnie (lewy górny róg ma współrzędne -2.0 + -1.25i, dolny prawy róg ma współrzędne 0.5 + 1.25i) i oznaczając je różnymi kolorami otrzymujemy wynik - zbiór Mandelbrota, zwany też czasami ze względu na swój wygląd żukiem Mandelbrota. Na obrazie poniżej kolory kolejnych przybliżeń wyznaczono zgodnie z modelem HSV, ale można też użyć do tego celu odcieni szarości, bądź innego modelu barw.
Dokonując przybliżenia wybranych obszarów możemy otrzymać m.in:
- dolinę słonia (ang. elephant valley) - (lewy górny róg
ma współrzędne 0.25 + -0.05i, dolny prawy róg ma współrzędne 0.35 + 0.05i)
- dolinę konika morskiego (ang. sea horse valley) - (obszar w okolicy punktu
-0.75 + 0.1i), poniżej przybliżenie jednej ze struktur w dolinie konika morskiego
Przykład w JavaScript:
Zaznaczając obszar uzyskasz jego powiększony obraz. Kliknięcie prawym klawiszem (bądź dotknięcie dwoma palcami na urządzeniach z ekranem dotykowym) spowoduje powtórne pokazanie całego zbioru.
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Tomasz Lubiński | C# | MS Visual Studio .net | .cs | .cs | ***** / 5 |
Tomasz Lubiński | C/C++ | Borland Builder 6 | .cpp | .cpp | ***** / 9 |
Tomasz Lubiński | Delphi/Pascal | Borland Delphi 5 | .pas | .pas | ***** / 2 |
Tomasz Lubiński | JavaScript | Firefox 3.0+, Safari 3.0+, Chrome 3.0+, Opera 9.5+, IE 9.0+ | .js | .js | ***** / 3 |
Poprawiony: 26 sierpnia 2012 13:42
Komentarze
+1
#
g0nz4l4
2010-02-24 19:39
Świetny art, bardzo mi pomógł. Mógłbyś jeszcze przedstawić metodę i algorytm tworzenia tzw. Buddhabrota, bo ciężko znaleźć coś na ten temat.
Odpowiedz | Odpowiedz z cytatem | Cytować
+2
#
Tomasz Lubiński
2015-08-26 14:02
Buddhabrot jest już opisany - www.algorytm.org/fraktale/buddhabrot.html
Odpowiedz | Odpowiedz z cytatem | Cytować
0
#
cx3
2013-01-05 02:18
Bardzo mi pomogłeś! Dziękuję Ci bardzo za ogół różnych artów, kawał świetnej roboty, nie ma co. Bardzo ciężko znaleźć cokolwiek nt. zbioru Mandelbrota w 3D, strasznie gruby temat, ale nie tylko ja wierzę, że łebski z Ciebie facet ;)
Odpowiedz | Odpowiedz z cytatem | Cytować
0
#
Anonim
2015-08-19 10:17
Świetny artykuł - prosty i przyjemny dzięki Ci wielkie autorze !
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz