
A Barnsley fern is a fractal named after British mathematician Michael Barnsley and can be created using an iterated function system (IFS).



Task

Create this fractal fern, using the following transformations:

 ƒ1   (chosen 1% of the time)
        xn + 1 = 0
        yn + 1 = 0.16 yn

 ƒ2   (chosen 85% of the time)
        xn + 1 = 0.85 xn + 0.04 yn
        yn + 1 = −0.04 xn + 0.85 yn + 1.6

 ƒ3   (chosen 7% of the time)
        xn + 1 = 0.2 xn − 0.26 yn
        yn + 1 = 0.23 xn + 0.22 yn + 1.6

 ƒ4   (chosen 7% of the time)
        xn + 1 = −0.15 xn + 0.28 yn
        yn + 1 = 0.26 xn + 0.24 yn + 0.44.

Starting position: x = 0, y = 0




fcn barnsleyFern(){
   w,h:=640,640;
   bitmap:=PPM(w+1,h+1,0xFF|FF|FF);  // White background
 
   x,y, nx,ny:=0.0, 0.0, 0.0, 0.0;
   do(0d100_000){
      r:=(0).random(100);  // [0..100)%
      if     (r<= 1) nx,ny= 0, 		      0.16*y;
      else if(r<= 8) nx,ny= 0.2*x  - 0.26*y,  0.23*x + 0.22*y + 1.6;
      else if(r<=15) nx,ny=-0.15*x + 0.28*y,  0.26*x + 0.24*y + 0.44;
      else           nx,ny= 0.85*x + 0.04*y, -0.04*x + 0.85*y + 1.6;
      x,y=nx,ny;
      bitmap[w/2 + x*60, y*60] = 0x00|FF|00;  // Green dot
   }
   bitmap.writeJPGFile("barnsleyFern.jpg");
}();