Zbiór Julii
Z wikipedii :
Zbiór Julii - fraktal, będący podzbiorem zespolonej płaszczyzny dwuwymiarowej.
Mianem tym określa się każdy zbiór z pewnej rodziny zbiorów.
Zbiór tworzą te punkty p dla których ciąg opisany równaniem rekurencyjnym:
(*)z0=p ,
zn+1=(zn)2+c nie dąży do nieskończoności (można wykazać, że to oznacza: |zn|<2 ).
Wzór (*), oczywiście zinterpretujemy na płaszczyźnie R2, bo na takiej przyjdzie nam rysować.
Jeśli zauważymy, że :
z2=(x+y·i)2=x2+2·x·y·i-y2=(x2-y2)+(2·x·y)·i
wzór(*) zinterpretujemy tak :
1º
dla punktu p=(p.x,p.y) wielokrotnie będziemy stosowali przekstałcenie:
P(p)=(p.x2-p.y2+c.x , 2·p.x·p.y+c.y)
2º ustalimy kolor dla punktów, które
po n-krotnym stosowaniu przekształcenia P, pozostają nadal wewnątrz okręgu O[(0,0),2]
Funkcja JakiKolor1 wymaga b. starannie dobranej palety. Obok wersja JakiKolor zastosowana u nas:
Color JakiKolor1(pkt2d p) { int il_it=50, i=0; float r,g,b; double x1,x,y,inf=2.0; x=p.x; y=p.y; while(x*x+y*y<inf && i<il_it) { i++; x1=x*x-y*y+c.x; y=2*x*y+c.y; x=x1; } return(paleta[i]); } |
Color JakiKolor(pkt2d p) { int il_it=50, i=0; float r,g,b; double x1,x,y,inf=2.0; x=p.x; y=p.y; while(x*x+y*y<inf && i<il_it) { i++; x1=x*x-y*y+c.x; y=2*x*y+c.y; x=x1; } r=(float)Math.sin(Math.PI*i/il_it); if( r < 0) r = 0; g=(float)Math.sin(1.5*Math.PI*i/il_it); if( g < 0) g = 0; b=(float)Math.sin(2.*Math.PI*i/il_it); if( b < 0) b = 0; return(new Color(r,g,b)); } |
Przydały się tu bardzo doświadczenia zdobyte przy pracy nad tematem:
"dywan trygonometryczny"
Zwróć uwagę na zakres w jakim rysujemy dywan.
W następnym rozdziale omówimy dokładniej technikę skalowania.
Kolor i skalowanie to ważne umiejętności, potrzebne, by w pełni pokazać piękno tych zbiorów.