
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




import "graphics" for Canvas, Color
import "dome" for Window
import "random" for Random
 
var Rand = Random.new()
 
class BarnsleyFern {
    construct new(width, height, points) {
        Window.title = "Barnsley Fern"
        Window.resize(width, height)
        Canvas.resize(width, height)
        _w = width
        _h = height
        _n = points
    }
 
    init() {
        createFern()
    }
 
    createFern() {
        var x = 0
        var y = 0
        var c = Color.hex("#32cd32")
        for (i in 0..._n) {
            var tx
            var ty
            var r = Rand.float()
            if (r <= 0.01) {
                tx = 0
                ty = 0.16 * y
            } else if (r <= 0.86) {
                tx =  0.85 * x + 0.04 * y
                ty = -0.04 * x + 0.85 * y + 1.6
            } else if (r <= 0.93) {
                tx = 0.2  * x - 0.26 * y
                ty = 0.23 * x + 0.22 * y + 1.6
            } else {
                tx = -0.15 * x + 0.28 * y
                ty =  0.26 * x + 0.24 * y + 0.44
            }
            x = tx
            y = ty
            Canvas.pset((_w/2 + x * _w/11).round, (_h - y * _h/11).round, c)
        }
    }
 
    update() {}
 
    draw(alpha) {}
}
 
var Game = BarnsleyFern.new(640, 640, 200000)