import numpy as np
from pylab import imshow, show
import math
from timeit import default_timer as timer
def fractal(
x, y,
max_iters, bailout_dist,
a11, a12, a21, a22, a31, a32, a33, a34, a35, a36, a41, a42
):
"""
Given the real and imaginary parts of a complex number,
determine if it is a candidate for membership in the fractal
set given a fixed number of iterations.
"""
c = complex(x, y)
cL = abs(c)
try:
w1 = a11 * cL + a12
except (OverflowError, ZeroDivisionError) as e:
return max_iters
try:
w2 = a21 * cL + a22
except (OverflowError, ZeroDivisionError) as e:
return max_iters
try:
w3 = pow(a31 * cL + a32, a33 * c + a34) + (a35 * cL + a36) * c
except (OverflowError, ZeroDivisionError) as e:
return max_iters
try:
w4 = a41 * cL + a42
except (OverflowError, ZeroDivisionError) as e:
return max_iters
z = 0.0j
for i in range(max_iters):
try:
z = pow(pow(w1 + z, w2) + w3, w4)
except (OverflowError, ZeroDivisionError) as e:
return max_iters
if (z.real*z.real + z.imag*z.imag) >= bailout_dist:
return i
return max_iters
def create_fractal(
min_x, max_x, min_y, max_y,
image,
iters, bailout_dist,
a11, a12, a21, a22, a31, a32, a33, a34, a35, a36, a41, a42
):
height = image.shape[0]
width = image.shape[1]
pixel_size_x = (max_x - min_x) / width
pixel_size_y = (max_y - min_y) / height
for x in range(width):
real = min_x + x * pixel_size_x
for y in range(height):
imag = min_y + y * pixel_size_y
escape_num = fractal(
real, imag,
iters, bailout_dist,
a11, a12, a21, a22, a31, a32, a33, a34, a35, a36, a41, a42
)
if (escape_num == iters):
image[y, x] = 0
else:
image[y, x] = 255
height = 1080.0
width = 1920.0
image = np.zeros((int(height), int(width), 3), dtype = np.uint8)
centerX = -0.5
centerY = 0.0
viewWidth = 449.82162780783005
viewHeight = viewWidth * (height / width)
min_x = centerX - viewWidth * 0.5
max_x = centerX + viewWidth * 0.5
min_y = centerY - viewHeight * 0.5
max_y = centerY + viewHeight * 0.5
a11 = complex(1.0, 0.0)
a12 = complex(0.0, -10.0)
a21 = complex(1.0, 0.0)
a22 = complex(0.0, 10.0)
a31 = complex(0.0, -2.0)
a32 = complex(-100.0, 0.0)
a33 = complex(1.0, 0.0)
a34 = complex(0.0, 0.0)
a35 = complex(0.0, -1.0)
a36 = complex(-200.0, 0.0)
a41 = complex(0.0, 1.0)
a42 = complex(0.0, 0.0)
max_iter = 50
bailout_dist = 400000.0
start = timer()
create_fractal(
min_x, max_x, min_y, max_y,
image,
max_iter, bailout_dist,
a11, a12, a21, a22, a31, a32, a33, a34, a35, a36, a41, a42
)
dt = timer() - start
print "Fractal generated in %f s" % dt
imshow(image, origin='lower', extent=(min_x, max_x, min_y, max_y))
show()
height = 1080.0
width = 1920.0
image = np.zeros((int(height), int(width), 3), dtype = np.uint8)
centerX = -0.055515619873081685
centerY = 0.00002206854513772745
viewWidth = 0.008159161006168078
viewHeight = viewWidth * (height / width)
min_x = centerX - viewWidth * 0.5
max_x = centerX + viewWidth * 0.5
min_y = centerY - viewHeight * 0.5
max_y = centerY + viewHeight * 0.5
a11 = complex(0.0, 0.0)
a12 = complex(1.0, 0.0)
a21 = complex(0.0, 0.0)
a22 = complex(64.0, 0.0)
a31 = complex(0.0, 0.0)
a32 = complex(128.0, 0.0)
a33 = complex(1.0, 0.0)
a34 = complex(0.0, 0.0)
a35 = complex(0.0, 0.0)
a36 = complex(32.0, 0.0)
a41 = complex(0.0, 0.0)
a42 = complex(2.000001, 0.0001)
max_iter = 500
bailout_dist = 4000000000.0
start = timer()
create_fractal(
min_x, max_x, min_y, max_y,
image,
max_iter, bailout_dist,
a11, a12, a21, a22, a31, a32, a33, a34, a35, a36, a41, a42
)
dt = timer() - start
print "Fractal generated in %f s" % dt
imshow(image, origin='lower', extent=(min_x, max_x, min_y, max_y))
show()
height = 1080.0
width = 1920.0
image = np.zeros((int(height), int(width), 3), dtype = np.uint8)
centerX = -0.5
centerY = 0.0
viewWidth = 5.2
viewHeight = viewWidth * (height / width)
min_x = centerX - viewWidth * 0.5
max_x = centerX + viewWidth * 0.5
min_y = centerY - viewHeight * 0.5
max_y = centerY + viewHeight * 0.5
a11 = complex(0.0, 0.0)
a12 = complex(0.0, 0.0)
a21 = complex(0.0, 0.0)
a22 = complex(2.0, 0.0)
a31 = complex(0.0, 0.0)
a32 = complex(0.0, 0.0)
a33 = complex(0.0, 0.0)
a34 = complex(1.0, 0.0)
a35 = complex(0.0, 0.0)
a36 = complex(1.0, 0.0)
a41 = complex(0.0, 0.0)
a42 = complex(1.0, 0.0)
max_iter = 500
bailout_dist = 400000.0
start = timer()
create_fractal(
min_x, max_x, min_y, max_y,
image,
max_iter, bailout_dist,
a11, a12, a21, a22, a31, a32, a33, a34, a35, a36, a41, a42
)
dt = timer() - start
print "Fractal generated in %f s" % dt
imshow(image, origin='lower', extent=(min_x, max_x, min_y, max_y))
show()