Barnsley Fern in Python

Last Updated : 22 Oct, 2018
Barnsley fern is a fractal shape created by mathematician Michael Barnsley. The geometric features of this fractal resemble a natural fern and hence it gets its name. Barnsley fern is created by iterating over a large number of times on four mathematical equations, introduced by Barnsley, known as Iterated Function System (IFS). The transformation Barnsley used had the formula : where, the letters had following value :
 a b c d e f p PART 0 0 0 0.16 0 0 0.01 Stem 0.85 0.04 -0.04 0.85 0 1.60 0.85 Small Leaflet 0.20 -0.26 0.23 0.22 0 1.60 0.07 Large Leaflet(Left) -0.15 0.28 0.26 0.24 0 0.44 0.07 Large Leaflet(Right)
and “p” is the probability. Thus the four equations are: With the help of above equations, the fern is created. Now lets see the Python3 implementation for the same.
 `# importing necessary modules ``import` `matplotlib.pyplot as plt ``from` `random ``import` `randint `` ` `# initializing the list ``x ``=` `[] ``y ``=` `[] `` ` `# setting first element to 0 ``x.append(``0``) ``y.append(``0``) `` ` `current ``=` `0`` ` `for` `i ``in` `range``(``1``, ``50000``): `` ` `    ``# generates a random integer between 1 and 100 ``    ``z ``=` `randint(``1``, ``100``) `` ` `    ``# the x and y coordinates of the equations ``    ``# are appended in the lists respectively. ``     ` `    ``# for the probability 0.01 ``    ``if` `z ``=``=` `1``: ``        ``x.append(``0``) ``        ``y.append(``0.16``*``(y[current])) ``     ` `    ``# for the probability 0.85     ``    ``if` `z>``=` `2` `and` `z<``=` `86``: ``        ``x.append(``0.85``*``(x[current]) ``+` `0.04``*``(y[current])) ``        ``y.append(``-``0.04``*``(x[current]) ``+` `0.85``*``(y[current])``+``1.6``) ``     ` `    ``# for the probability 0.07     ``    ``if` `z>``=` `87` `and` `z<``=` `93``: ``        ``x.append(``0.2``*``(x[current]) ``-` `0.26``*``(y[current])) ``        ``y.append(``0.23``*``(x[current]) ``+` `0.22``*``(y[current])``+``1.6``) ``     ` `    ``# for the probability 0.07     ``    ``if` `z>``=` `94` `and` `z<``=` `100``: ``        ``x.append(``-``0.15``*``(x[current]) ``+` `0.28``*``(y[current])) ``        ``y.append(``0.26``*``(x[current]) ``+` `0.24``*``(y[current])``+``0.44``) ``         ` `    ``current ``=` `current ``+` `1``  ` `plt.scatter(x, y, s ``=` `0.2``, edgecolor ``=``'green'``) `` ` `plt.show()         `

Output : Note: The whole output depends upon the coefficients of the equations. One experiment might be to change the coefficients and get a new pattern every time.

Article Tags :
Practice Tags :