Rekurencja

w opracowaniu klasy E '91

Atraktor Rosslera 3D

Grzegorz Kosicki

Rezultat

Checkboxem możemy pauzować proces rysowania lub go znów przywołać. Przy pomocy suwaków możemy zmieniać wartości zmiennych a,b,c, oraz d, które występują we wzorze. Po ich zmianie natychmiast będzie widoczna zmiana wykresu atraktora.

Poczatkowa konfiguracja to: a=0.2, b=0.2, c=5.7, d=0.05.

Wyrażony jest takim układem równań:

Punktem początkowym u mnie jest punkt W(-10,-10,-10). Atraktor powstaje poprzez wielokrotne narysowanie punktu:
W(x+d*(-y-z), y+d*(x+a*y), z+d*(b+z*(x-c)))

Kod procedury rysującej atraktor Rosslera, w najprostszej postaci:

pkt3d P(pkt3d p) 
{
  double xp,yp,zp;
  
  xp=p.x; 
  yp=p.y; 
  zp=p.z;
  
  p.x= xp + d*(-yp - zp); 
  p.y= yp + d*(xp + a*yp); 
  p.z= zp + d*(b + zp*(xp - c)); 
  
  return(p);
} 

void rysuj(Graphics g) 
{ 
  pkt3d w=new pkt3d(-10,-10,-10); 
  
  for(int i=0;i<20;i++) 
  {
    w=P(w); 
    _3d.punkt(g,w); 
  }
}

Na początku, gdy rysujemy ten atraktor występuje bardzo duże przybliżenie. W celu oddalenia widoku zastosowałem proste rozwiązanie, które przedstawiłem w kodzie poniżej:

void rysuj(Graphics g) 
{ 
  pkt3d w=new pkt3d(-10,-10,-10); 
  pkt3d k=new pkt3d(0,0,0); 
  
  for(int i=0;i<20;i++) 
  {
    w=P(w); 
    k.war(w.x/4,w.y/4,w.z/4); 
    _3d.punkt(g,k); 
  }
}