Algorytm IFS
Janusz Sobieraj - 28 LO

Paproć Barnsleya jako przykład

Algorytm generowania tego fraktala polega na procesie iteracji (wielokrotnego przekształcania) współrzędnych rysowanego punktu. Początkowo losowo wybieramy współrzędne punktu, a następnie również losowo wybieramy jedno z przekształceń afinicznych z odpowiednim prawdopodobieństwem. Po obliczeniu nowych współrzędnych punktu, proces powtarzamy określoną ilość razy.
Odwzorowanie afiniczne na płaszczyźnie jest to przekształcenie, które punktowi (x,y) przyporządkowuje punkt (x',y') w następujący sposób:
(x,y) → ( ax + by + c, dx + ey + f)
Wracając do naszego przykładu. Aby wygenerować paproć Barnsleya, należy użyć poniższych przekształceń losowo w następujących proporcjach: 85:7:7:1

I to jest największa "tajemnica" dla każdej rysowanej figury : ilość przekształceń, ich współczynniki, oraz prawdopodobieństwa zastosowań.
Np trójkąt Sierpińskiego generujemy przy pomocy układu 3-ech przekształceń afinicznych.

f1(x,y) = (0.85x + 0.04y, - 0.04x + 0.85y + 1.6)
f2(x,y) = ( - 0.15x + 0.28y , 0.26x + 0.24y + 0.44)
f3(x,y) = (0.20x - 0.26y , 0.23x + 0.22y + 1.6)
f4(x,y) = (0 , 0.16y)	   
Ale wróćmy do naszej figury. Wystarczy zdefiniować przekształcenia i narysować wg dość prostego pomysłu:
void paprotka() 
{ 
  t[0][0].war(0.85,0.04,0.0);
  t[0][1].war(-0.04,0.85,1.6); 
  
  t[1][0].war(-0.15,0.28,0.0);
  t[1][1].war(0.26,0.24,0.44); 
  
  t[2][0].war(0.10,-0.26,0.0);
  t[2][1].war(0.23,0.22,1.6); 
  
  t[3][0].war(0.0,0.0,0.0);
  t[3][1].war(0.0,0.16,0.0); 
  
  p1=78; 
  p2=20; 
  p3=21; 
  p4=5; 
}
void rysuj(Graphics g) 
{ 
  int los,ktore; 
  double xp; 

  for(int i=0;i<30000;i++) 
  { 
    los=mat.losowa_c(100)+1; 
    if(los<=p4) {ktore=3;g.setColor(Color.gray);} 
     else 
      if(los<=p3) {ktore=2;g.setColor(Color.blue);} 
       else 
       if(los<=p3+p2) {ktore=1;g.setColor(Color.red);} 
        else {ktore=0;g.setColor(Color.green);} 

    xp=p.x; 
    p.x=t[ktore][0].x*xp+t[ktore][0].y*p.y+t[ktore][0].z; 
    p.y=t[ktore][1].x*xp+t[ktore][1].y*p.y+t[ktore][1].z; 
    lo28.punkt(g,p); 
  } 
}