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.