I’ve been experimenting with creating fractal images using iterating functions of the form
where
.
Without getting into all the details right now, within each frame of the animation every pixel represents a different value of the complex variable c. For a given value of c, the number of iterations required for the magnitude of z_n to pass a pre-defined threshold determines the colour of the corresponding pixel. If the sequence exceeds the limit within a small number of iterations, the pixel will be white. Conversely, if the magnitude of z_n remains within the threshold until the maximum number of iterations is reached, the pixel ends up black.
In the following animation, a remains constant (a=5.0) from frame to frame while b is incremented in steps of 0.01 from 0.0 to 4.0. The region of the complex plane shown is -2 < Re{c} < 0 and 0 < Im{c} < 2.
I used the following Python script to generate the individual frames of the animation:
#
# fractal_movie.py - Written by Ted Burke, last updated 7-1-2016
#
import subprocess
import math
centre = 0 + 2j # complex value at centre of image
w,h = 800,400 # image width and height
pxw = 0.01 # pixel width
limit = 4.0 # once z reaches this value, iteration ceases
# Create a buffer to store a row of pixel values
row = w*[0]
# Create fractal image files
for t in range(401):
a = 5
b = t/100.0
# Open file
pgmfilename = 'crpf_a{:1.3f}_b{:1.3f}_pxw{:.3f}_lim{:1.1f}_{:d}x{:d}px.pgm'.format(a, b, pxw, limit, w, h)
print(pgmfilename)
pgmfile = file(pgmfilename, 'w')
pgmfile.write('P5\n{} {}\n255\n'.format(w,h))
# Generate image
for y in range(h):
for x in range(w):
c = centre + complex(((x-(w-1)/2.0)*pxw),(((h-1)/2.0-y)*pxw))
z = 0
n = 0
while abs(z) < limit and n < 51:
try:
z = (pow(z,a) + c)/(pow(z,b) - c)
n = n + 1
except ZeroDivisionError:
z = limit
row[x] = int(255 * (0.5 + 0.5*math.cos(math.pi*n/51.0)))
pgmfile.write(bytearray(row))
# Close file
pgmfile.close()
subprocess.call('mogrify -format png ' + pgmfilename, shell=True)
subprocess.call('rm ' + pgmfilename, shell=True)
I used a second Python script to rename the PNG frames as frame001.png, frame002.png, etc.
#
# renamer.py - Written by Ted Burke, last updated 12-1-2016
#
import subprocess
# Create fractal image files
for t in range(401):
b = t/100.0
origfilename = 'crpf_a5.000_b{:1.3f}_pxw0.010_lim4.0_800x400px.png'.format(b)
newfilename = 'frame{:03d}.png'.format(t)
print(origfilename + ' ' + newfilename)
subprocess.call('cp ' + origfilename + ' ' + newfilename, shell=True)
Finally, I used ffmpeg to combine the individual PNG frames into a single video file, as follows:
ffmpeg -framerate 10 -i frame%03d.png -c:v libx264 -pix_fmt yuv420p out.mp4