Rekurencja

w opracowaniu klasy E '91

Atraktor Clifforda

Grzegorz Bajkowski

Rezultat

Przedstawiony applet obrazuje atraktor Clifforda.

Atrakot Clifforda jest określony wzorem:
xn+1=sin(a·yn)+c·cos(a·xn)
yn+1=sin(b·xn)+d·cos(b·yn)

Aplet pozwala na obejrzenie atraktora przy zmieniających się wartościach a, b, c, d. Zmiana tych wartości jest połączona z myszką co pozwala uzyskać bardzo ciekawy efekt i obejrzeć atrakotr w wielu różnych wariacjach.

Kliknieciem zmienia sie wartość c, d. Przeciągnięciem zmienia się warość a, b.Ich wartość jest przedstawiona w górnej częsci apletu. W prawym gornym rogu jest guzik wyłączający animacje.

pkt2d w=new pkt2d(0,0); 
pkt2d k=new pkt2d(0,0); 
pkt2d z=new pkt2d(0,0); 

pkt2d P(pkt2d p) 
{
  double pom1; 
  double pom2; 

  pom1=p.x; 
  pom2=p.y; 

  p.x=Math.sin(a*pom2)+c*Math.cos(a*pom1);
  p.y=Math.sin(b*pom1)+d*Math.cos(b*pom2);
  return(p);
} 

void rysuj(Graphics g) 
{
  lo28.punkt(g,k); 
  for(int i=0;i<n;i++) 
  {
    w=P(w);
    k.war(1.5*w.x,1.5*w.y);
  lo28.punkt(g,k);
  }
}

Jest to procedura rysująca atraktor, łatwo zauważyć, że pkt2d P() jest interpretacją wzoru podanego powyżej. rysuj() obrazuje wzór w układzie prostokątnym.

Punkt K jest odwzorowaniem punktu W w skali=1.5. Dzięki czemu rysunek jest wyraźniejszy.

public boolean handleEvent(Event zd) 
{
  if(zd.id==Event.MOUSE_DOWN) 
  {
    z=lo28.r2(zd.x,zd.y); 
    c=z.x; 
    d=z.y; 
    
    repaint( );
  } 
  if(zd.id==Event.MOUSE_DRAG) 
  {
    z=lo28.r2(zd.x,zd.y); 
    a=z.x; 
    b=z.y; 
  
    repaint( );
  }	
  return true;
}

Punkt Z bedący miejscem kliknięcia lub przeciągnięcia myszy nadaje swoim wartościom odciętych i rzędnych wartości a, b, c lub d.