
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




' version 10-10-2016
' compile with: fbc -s console
 
Sub barnsley(height As UInteger)
 
  Dim As Double x, y, xn, yn
  Dim As Double f = height / 10.6
  Dim As UInteger offset_x = height \ 4 - height \ 40
  Dim As UInteger n, r
 
  ScreenRes height \ 2, height, 32
 
  For n = 1 To height * 50
 
    r = Int(Rnd * 100)      ' f from 0 to 99
 
    Select Case As Const r
      Case 0 To 84
        xn  =  0.85 * x + 0.04 * y
        yn  = -0.04 * x + 0.85 * y + 1.6
      Case 85 To 91
        xn  = 0.2  * x - 0.26 * y
        yn  = 0.23 * x + 0.22 * y + 1.6
      Case 92 To 98
        xn  = -0.15 * x + 0.28 * y
        yn  =  0.26 * x + 0.24 * y + 0.44
      Case Else
        xn = 0
        yn = 0.16 * y
    End Select
 
    x = xn : y = yn
    PSet( offset_x + x * f, height - y * f), RGB(0, 255, 0)
 
  Next
' remove comment (') in next line to save window as .bmp file
' BSave "barnsley_fern_" + Str(height) + ".bmp", 0
 
End Sub
 
 
' ------=< MAIN >=------
 
' adjustable window height
' call the subroutine with the height you want
' it's possible to have a window that's large than your display
 barnsley(800)
 
 
' empty keyboard buffer
While Inkey <> "" : Wend
Windowtitle "hit any key to end program"
Sleep
End