Fork me on GitHub




In [1]:
import numpy as np
In [2]:
from pylab import imshow, show
In [3]:
import math
In [4]:
from timeit import default_timer as timer
In [5]:
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
In [6]:
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
In [7]:
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()
Fractal generated in 39.847765 s

In [8]:
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()
Fractal generated in 29.372203 s

In [9]:
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()
Fractal generated in 94.405396 s

In [ ]:






© 2016 Valera Rozuvan. Fork me at GitHub.