
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




function barnsleyfern(n::Integer)
    funs = (
        (x, y) -> (0, 0.16y),
        (x, y) -> (0.85x + 0.04y, -0.04x + 0.85y + 1.6),
        (x, y) -> (0.2x - 0.26y, 0.23x + 0.22y + 1.6),
        (x, y) -> (-0.15x + 0,28y, 0.26x + 0.24y + 0.44))
    rst = Matrix{Float64}(n, 2)
    rst[1, :] = 0.0
    for row in 2:n
        r = rand(0:99)
        if r < 1;      f = 1;
        elseif r < 86; f = 2;
        elseif r < 93; f = 3;
        else           f = 4; end
        rst[row, 1], rst[row, 2] = funs[f](rst[row-1, 1], rst[row-1, 2])
    end
    return rst
end