algorytm.org

Płonący Statek



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Płonący Statek
Ocena użytkowników:***** / 4
SłabyŚwietny 
Wpisany przez Tomasz Lubiński, 16 stycznia 2009 21:20

Fraktal Płonący Statek (ang. Burning Ship) został po raz pierwszy opisany w 1992 roku. Jego twórcami są Michael Michelitsch oraz Otto Rössler. By opisać fraktal, 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} = ( | \Re(z_n) | + i | \Im(z_n) | )^2 + p
Widać tutaj podobieństwo do wzoru na ciąg opisujący zbiór Mandelbrota (ang. Mandelbrot Set), różnica polega na tym, że w przypadku Płonącego Statku do potęgi podnoszona jest liczba o wartościach bezwzględnych części rzeczywistej oraz urojonej. Fraktalem jest brzeg zbioru liczb zespolonych p takich, że zdefiniowany powyżej ciąg nie dąży do nieskończoności. 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 Płonącego Statku 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 = (|zr| + i|zi|)^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)
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:
|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.
W funkcji przedstawionej powyżej nie należy mylić modułu z liczby zespolonej z wartością bezwzględną jej części rzeczywistej: |zr| oraz części urojonej |zi|

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.85 + -0.1i, dolny prawy róg ma współrzędne -1.7 + 0.05i) i oznaczając je kolorem różnej jasności otrzymujemy wynik - Fraktal Płonący Statek. Na obrazie poniżej barwy kolejnych przybliżeń wyznaczono zgodnie z modelem HSV, zmieniając parametr V (jasność) logarytmicznie w zależności od przybliżenia do którego należy dany punkt. Można też użyć do tego celu odcieni szarości, bądź innego modelu barw.

Płonący Statek


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
AutorJęzyk
programowania
KomentarzOtwórzPobierzOcena
Tomasz LubińskiC#MS Visual Studio .net
.cs
.cs
***** / 1
Tomasz LubińskiC/C++Borland Builder 6
.cpp
.cpp
***** / 1
Tomasz LubińskiDelphi/PascalBorland Delphi 5
.pas
.pas
***** / 1
Tomasz LubińskiJavaScriptFirefox 3.0+, Safari 3.0+, Chrome 3.0+, Opera 9.5+, IE 9.0+
.js
.js
***** / 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: 27 sierpnia 2012 18:37
Dodaj komentarz