
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




# adjustable window altoght
# call the subroutine with the altoght you want
# it's possible to have a window that's large than your display
call barnsley(800)
end
 
subroutine barnsley(alto)
    graphsize alto / 2, alto
    color rgb(0, 255, 0)
 
    f = alto / 10.6
    c = alto / 4 - alto / 40
    x = 0 : y = 0
 
    for n = 1 to alto * 50
        p = rand * 100
        begin case
            case p <= 1
                nx = 0
                ny = 0.16 * y
            case p <= 8
                nx = 0.2  * x - 0.26 * y
                ny = 0.23 * x + 0.22 * y + 1.6
            case p <= 15
                nx = -0.15 * x + 0.28 * y
                ny =  0.26 * x + 0.24 * y + 0.44
            else
                nx =  0.85 * x + 0.04 * y
                ny = -0.04 * x + 0.85 * y + 1.6
        end case
        x = nx : y = ny
        plot(c + x * f, alto - y * f)
    next n
 
    # remove comment (#) in next line to save window as .png file
    # imgsave("Barnsley_fern.png")
end subroutine