Zbiór Mandelbrota- wersja 3D
Ten trówymiarowy pokaz traktuję, jako zwykłą "zabawę informatyczną". Można powiedzieć, że został wykonany bez specjalnego powodu i do poznania tej fascynującej figury niewiele wnosi.
Cały rusunek to wykres funkcji z=F(x,y)
ktorej dziedzina:
Wartości funkcji są proporcjonalne do ilości iteracji potrzebnych do ustalenia faktu :
"jestem punktem zbioru Mandelbrota".
Przygotuję gradient koloru, którym wyrażę jedną z dwu sytuacji :
1° punkt należy do zbioru Mandelbrota.
2° punkt nie należy do zbioru, ale jego chęć ucieczki określa pewna liczba iteracji, po której znika..
Zdefiniuję również funkcję o wartościach integer, która po pierwsze ustali kolor jakim określimy "stan" rysowanego punktu dziedziny funkcji F(x,y), a po drugie posłuży do ustalenia wartości z=F(x,y).
void rysuj(Graphics g) { pkt2d p=new pkt2d(0,0); pkt3d w=new pkt3d(0,0,0); int kolor; for(p.x=x_min;p.x<x_max;p.x+=dx) for(p.y=y_min;p.y<y_max;p.y+=dy) { kolor=JakiKolor(p); g.setColor(paleta[kolor]); w.war(p.x , p.y, 1.5* kolor/20.0); _3d.punkt(g,w); } } |
int JakiKolor(pkt2d a) { int il_it=90,i=0; double x1,x,y,inf=2.5; x=y=0; while(x*x+y*y<inf&&i<il_it) { i++; x1=x*x-y*y+a.x; y=2*x*y+a.y; x=x1; } if(i>=il_it)return(90); else return(i); } |
Color paleta[]; paleta= new Color [91]; void gradient() { for(int i=0;i<91;i++) paleta[i]=new Color(165+i,165+i,125); } |
Moja impresja 3D nie jest oczywiście jedyna, np ciekawe podejście (i efekt) prezentowane jest przez Russell'a Walsmith'a, który nieco inaczej "uzyskuje" trzecią współrzędną. Na podanej stronie podany jest kod rozwiązania oraz przykłady uzyskanych grafik.
Prezentację 3D wykonałem stosując aksonometrię wg modelu opisanym w tym artykule na stronie informatycznej 28 LO