StartAlgorytmyFraktaleZbiór Phoenix Julia
Baza Wiedzy
Wersja offline serwisu przeznaczona na urządzenia z systemem Android.

Darowizny
darowiznaWspomóż rozwój serwisu


Nagłówki RSS
Kanał artykuły
Kanał implementacje
Kanał komentarze
Kanał forum


Bookmarki









Sonda
Implementacji w jakim języku programowania poszukujesz?
 
Zbiór Phoenix Julia
Ocena użytkowników:+++++ / 2
SłabyŚwietny 
Wpisany przez Tomasz Lubiński
środa, 15 lipca 2009 20:16
Wyróżniamy dwie odmiany zbioru Phoenix: Phoenix Julia oraz Phoenix Mandelbrot (od nazw zbiorów, z których zostały wywiedzione). By zdefiniować zbiór Phoenix Julia, zdefiniujemy najpierw dla stałej stałej c i 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 = p
zn+1 = zn2 + Re(c) + Im(c)*zn-1

Zbiór Phoenix Julia 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 Julia 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 := p;

  repeat
     iter := iter + 1;
     z_next = z^2 + c.r + c.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ęsci 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ść cześci rzeczywistej liczby:
Re(a) = a.r
Im(a) oznacza wartość cześci urojonej liczby:
Im(a) = a.i
Moduł z liczby zespolonej definiujemy następująco:
moduł liczby zespolonej |z|=\sqrt{z_{r}^{2}+z_{i}^{2}} ,
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 -1.5 + -1.5i, dolny prawy róg ma współrzędne 1.5 + 1.5i) i oznaczając je różnymi kolorami otrzymujemy wynik - zbiór Phoenix typu Julia. 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. W przykładzie poniżej stała c = 0,56667 -0,5i i jest to wartość dla której otrzymany fraktal ma postać krzywej Phoenix opisanej przez Shigehiro Ushiki.

Phoenix Julia


Dokonując przybliżenia wybranych obszarów zobaczymy charakterystyczne dla tego fraktala spirale:
(lewy górny róg ma współrzędne 0.10 + 0.28i, dolny prawy róg ma współrzędne 0.12 + 0.30i)

Phoenix Julia - spirale


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.
Część rzeczywista parameteru c:
Część urojona parameteru c:



Autor Język programowania Komentarz Otwórz Pobierz Ocena
Tomasz Lubiński C# MS Visual Studio .net
Implementacja w C#
Implementacja w C#
++++- / 1
Tomasz Lubiński C/C++ Borland Builder 6
Implementacja w C/C++
Implementacja w C/C++
++++- / 1
Tomasz Lubiński Delphi/Pascal Borland Delphi 5
Implementacja w Delphi/Pascal
Implementacja w Delphi/Pascal
++++- / 1
Tomasz Lubiński Java Script Firefox 3.0+, Safari 3.0+, Chrome 3.0+, Opera 9.5+, IE 9.0+
Implementacja w Java Script
Implementacja w Java Script
----- / 0
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie



Poprawiony: środa, 11 stycznia 2012 21:44

Dodaj komentarz

Kod antysapmowy
Odśwież