Wpisany przez Tomasz Lubiński
czwartek, 16 lipca 2009 19:53
Wyróżniamy dwie odmiany zbioru Phoenix: Phoenix Julia oraz Phoenix Mandelbrot. By zdefiniować zbiór Phoenix Mandelbrot, 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:
z0 = 0
zn+1 = zn2 + Re(p) + Im(p)*zn-1
Zbiór Phoenix Mandelbrot definiujemy jako zbiór liczb zespolonych p takich, że zdefiniowany powyżej ciąg nie dąży do nieskończoności.
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 Phoenix Mandelbrot 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 z = zr + i zi.
Potęgowanie definiujemy następująco:
z2 = (zr2 - zi2) + i(2 zr zi)
Dodawanie definiujemy następująco:
a + b = (ar + br) + i(ai + bi)
Mnożenie definiujemy następująco:
a * b = ( ar*br - ai*bi ) + i( ar*bi + ai*br )
Re(a) oznacza wartość części rzeczywistej liczby:
Re(a) = a.r
Im(a) oznacza wartość części urojonej liczby:
Im(a) = a.i
Moduł z liczby zespolonej definiujemy następująco:
,
dlatego też w praktyce warunek |z| < 2 zastępuje się równoważną nierównością (zr2 + zi2) < 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 rzeczywiste, 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.5i, dolny prawy róg ma współrzędne 1 + 1.2i) i oznaczając je różnymi kolorami otrzymujemy wynik - niezbyt urodziwy zbiór Phoenix Mandelbrot. Na obrazie poniżej kolory kolejnych przybliżeń wyznaczono zgodnie z modelem HSV. Dodatkowo jasność koloru uzależniono od wartości z jaką dany punkt wypadł z danego przybliżenia. Do kolorowania wyniku można też użyć odcieni szarości, bądź innego modelu barw.

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.
z0 = 0
zn+1 = zn2 + Re(p) + Im(p)*zn-1
Zbiór Phoenix Mandelbrot definiujemy jako zbiór liczb zespolonych p takich, że zdefiniowany powyżej ciąg nie dąży do nieskończoności.
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 Phoenix Mandelbrot możemy zdefiniować następująco (gdzie maxIter to maksymalne przybliżenie z jakim chcemy wyznaczać zbiór):
przyblizenie(p)
begin
iter := 0;
z_prev := 0;
z := 0;
repeat
iter := iter + 1;
z_next = z^2 + p.r + p.i * z_prev;
z_prev = z;
z = z_next;
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 = zr + i zi.
Potęgowanie definiujemy następująco:
z2 = (zr2 - zi2) + i(2 zr zi)
Dodawanie definiujemy następująco:
a + b = (ar + br) + i(ai + bi)
Mnożenie definiujemy następująco:
a * b = ( ar*br - ai*bi ) + i( ar*bi + ai*br )
Re(a) oznacza wartość części rzeczywistej liczby:
Re(a) = a.r
Im(a) oznacza wartość części urojonej liczby:
Im(a) = a.i
Moduł z liczby zespolonej definiujemy następująco:
,dlatego też w praktyce warunek |z| < 2 zastępuje się równoważną nierównością (zr2 + zi2) < 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 rzeczywiste, 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.5i, dolny prawy róg ma współrzędne 1 + 1.2i) i oznaczając je różnymi kolorami otrzymujemy wynik - niezbyt urodziwy zbiór Phoenix Mandelbrot. Na obrazie poniżej kolory kolejnych przybliżeń wyznaczono zgodnie z modelem HSV. Dodatkowo jasność koloru uzależniono od wartości z jaką dany punkt wypadł z danego przybliżenia. Do kolorowania wyniku można też użyć odcieni szarości, bądź innego modelu barw.

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.
| Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
| Tomasz Lubiński | C# | MS Visual Studio .net | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 |
| Tomasz Lubiński | C/C++ | Borland Builder 6 | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 |
| Tomasz Lubiński | Delphi/Pascal | Borland Delphi 5 | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 |
| Tomasz Lubiński | Java Script | Firefox 3.0+, Safari 3.0+, Chrome 3.0+, Opera 9.5+, IE 9.0+ | ![]() | ![]() |
![]() ![]() ![]() ![]() / 0 |
Poprawiony: wtorek, 21 czerwca 2011 19:25



/ 1

