algorytm.org

Buddhabrot



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?

Buddhabrot
Ocena użytkowników:***** / 15
SłabyŚwietny 
Wpisany przez Tomasz Lubiński, 08 listopada 2011 11:21

Buddhabrot jest fraktalem zbudowanym w oparciu o zbiór Mandelbrot'a. Jego nazwa pochodzi od podobieństwa do obrazu Buddy, siedzącego w pozie medytacyjnej. Technikę uzyskania tego obrazu odkryła i opisała w roku 1993 Melinda Green.
Najpierw przypomnijmy sobie definicję zbióru Mandelbrota. Jest to zbiór liczb zespolonych p takich, że ciąg liczb zespolonych z0, z1, z2, ... o wartościach zdefiniowanych następująco:
z0 = 0
z1 = z0 + p
z2 = z1 + p
...
zn+1 = zn + p

nie dąży do nieskończoności

W praktyce sprawdza się czy punkt p należy do zbioru mandelbrota z pewnym przybliżeniem:
By utworzyć fraktal Buddhabrot najpierw zdefiniujemy:
Proces tworzenia fraktala wygląda następująco:

Należy zauważyć, że tablica liczników przechowuje wartości liczników tylko dla określonych wartości. Na przykład jeżeli ma ona rozmiar 30 na 30, to kolejne jej punkty odpowiadają wartościom: (-1.5; -2i), (-1.4, -2i), (-1.3, -2i), ... (-1.5; -1.9i), (-1.4; -1.9i), (-1.3; -1.9i), ... Co zrobić gdy punkt uzyskany w trakcie obliczania przybliżenia ma wartość na przykład (-1.32, -1.99i)? Jak do tego wszystkiego się zabrać? Najpierw obliczmy jakie odległości są pomiędzy kolejnymi licznikami. Przy czym osobno należy obliczyć odległości w poziomie (oznaczmy ją jako odl_x) i odległości w pionie (oznaczmy ją jako odl_y)
odl_x obliczymy następująco: (maksymalna wartość X - minimalna wartość X) / wielkość tablicy liczników w poziomie
odl_y obliczymy następująco: (maksymalna wartość Y - minimalna wartość Y) / wielkość tablicy liczników w pionie
Dla naszego przykładu 30 na 30 będzie to: odl_x = 1.5 - (-1.5) / 30 = 3 / 30 = 0.1, odl_y = 1.0 - (-2.0) / 30 = 3 / 30 = 0.1. Zatem różnica pomiędzy sąsiednimi punktami w pionie i poziomie będzie wynosić 0.1 (zgadza się to z wartościami, które przytoczyłem wcześniej).

Jak zatem obliczyć, który licznik zwiększyć dla obliczonego punktu (x, y). Można to zrobić na kilka sposobów:
Ja w swoim programie zastosowałem ostatnie podejście. Cechą charakterystyczną dla tego fraktala jest to, że im zastosujemy większą wartość maksymalnego przybliżenia tym więcej szczegółów zobaczymy. Widać to znakomicie na przykładach poniżej:
Przykład w JavaScript:

Liczba iteracji (bailout):
Liczba punktów:

Implementacje
AutorJęzyk
programowania
KomentarzOtwórzPobierzOcena
Tomasz LubińskiJavaScriptFirefox 3.0+, Safari 3.0+, Chrome 3.0+, Opera 9.5+, IE 9.0+
.js
.js
***** / 1
 
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: 01 sierpnia 2012 19:35
Komentarze
photo
-2 # Wem 2012-12-31 21:03
Wszystko fajnie, ale jest jeden duży, bardzo duży problem. Jeżeli dwa razy uruchomimy algorytm z takimi samymi danymi wyjściowymi wyniki będą różne, często nawet znacząco. Potwierdza to mój program(wzorowa ny na tym artykule) zapisany w C++ jak i przykładowy w JS.

Wydaje mi się, że najbardziej wrażliwymi elementami na tą zmienność jest generator licz pseudolosowych, oraz sposób wyliczania koloru na podstawie wartości minimalnej,maks ymalnej w tablicy licznik oraz licznik[x][y].

Nie przeprowadziłem jeszcze testów, ale wydaje się że:
1) załączenie bardziej losowego generatora niż systemowy
2) zmniejszenie wagi min i max, i zastosowanie średniej z wszystkich elementów licznik'a do kolorowania
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz