0% found this document useful (0 votes)
7 views

fractals-programming-python-d-69144

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
7 views

fractals-programming-python-d-69144

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 5

DO MY ASSIGNMENT SUBMIT

Sample: Python - Fractals

Code Listing
#!python3
import tkinter

IMAGE_SIZE = 512 # fractal image size


HALF_SIZE = IMAGE_SIZE / 2

CONV_CRITERIA = 10e-3 # the convergence criteria


MAX_ITER = 20 # the maximum number of iterations
H = 10e-4 # delta z value used to compute the derivative of a function

# Colors for different function roots


colors = ((255, 0, 0), (0, 255, 0), (0, 0, 255),
(255, 255, 0), (255, 0, 255), (0, 255, 255))

# Converts image point coordinates to the complex plane coordinates


def convert_coords(x, y):
x = (x - HALF_SIZE) / HALF_SIZE
y = (y - HALF_SIZE) / HALF_SIZE
return complex(x, y)

# Finds a root of a complex function given a starting point $z,


# an error bound $err and an upper iteration limit $iterCount
def find_root(f, z, err, iterCount):
tmp = z + err + 1 # stores previous $z value
iteration = 0 # stores the number of iterations made

while (abs(tmp - z) > err) and (iteration < iterCount):


# Compute function value at $z point
fz = f(z)
# Compute the numerical derivative of the function at $z point
df_dz = (f(z + complex(H, H)) - fz) / complex(H, H)

# Check if $z point won't converge to any of the roots


if df_dz == 0:
return None

tmp = z # save the previous $z complex number value


z = z - fz / df_dz # perform an iteration
iteration += 1
return (z, iteration)

W W W . A S S I G N M E N T E X P E R T. C O M
DO MY ASSIGNMENT SUBMIT

# Returns the number of function root


# to which a given $z complex number converges
def get_root_number(z, roots):
minDistance = abs(z - roots[0])
rootNumber = 0

# Find a root which has the minimum distance to $z number


for k in range(1, len(roots)):
tmp = abs(z - roots[k])
if tmp < minDistance:
minDistance = tmp
rootNumber = k

return rootNumber

# Draws a Newton fractal of the specified complex function on a given image


def draw_fractal(fun, roots, image):
for x in range(IMAGE_SIZE):
for y in range(IMAGE_SIZE):
# Find the root using the coordinates of current pixel
# as the starting point for Newton's method
res = find_root(fun, convert_coords(x, y), CONV_CRITERIA, MAX_ITER)
if res == None:
continue # do not color the points that do not converge

# Get the root found and the number of iterations made


z, i = res
# Get the color of the exact root the found root converges to
rootColor = colors[get_root_number(z, roots)]

# Get color depth


depth = (MAX_ITER - i) / MAX_ITER
# Multiply the components of the exact root color by depth
RGB = tuple(int(depth * a) for a in rootColor)

# Set the color of the image pixel at (x, y)


image.put("#{0:02x}{1:02x}{2:02x}".format(*RGB), (x, y))

W W W . A S S I G N M E N T E X P E R T. C O M
DO MY ASSIGNMENT SUBMIT

# Configures the window to display a fractal in


# Returns an image to draw the fractal on
def configure_window(window, title):
window.title(title) # set window title

# Create a Canvas widget


canvas = tkinter.Canvas(window, width = IMAGE_SIZE, height = IMAGE_SIZE)
# Create a PhotoImage to draw fractal on
img = tkinter.PhotoImage(width = IMAGE_SIZE, height = IMAGE_SIZE)

canvas.create_image((HALF_SIZE, HALF_SIZE), image = img)


canvas.pack() # put canvas widget on the window
return img

# f(z) = z^3 - 1
def f1(z):
return z ** 3 - 1
# f1 complex function roots
f1_roots = (1 + 0j, -(1j ** (1/3)), 1j ** (2/3))

# f(z) = z^3 - 2z + 2
def f2(z):
return z ** 3 - 2 * z + 2
# f2 complex function roots
f2_roots = (-1.76929 + 0j, 0.88465 - 0.58974j, 0.88456 + 0.58974j)

# f(z) = z^5 - 1
def f3(z):
return z ** 5 - 1
# f3 complex function roots
f3_roots = (-1 + 0j, 1j ** (1/5), -(1j ** (2/5)), 1j ** (3/5), -(1j ** (4/5)))

def main():
# Create the toplevel window
window_1 = tkinter.Tk()
img_1 = configure_window(window_1, "f(z) = z^3 - 1")

draw_fractal(f1, f1_roots, img_1) # draw a fractal for f1


img_1.write("fractal_1.gif", "gif") # save the fractal to file

W W W . A S S I G N M E N T E X P E R T. C O M
DO MY ASSIGNMENT SUBMIT

# Create a window to display the second function fractal


window_2 = tkinter.Toplevel()
img_2 = configure_window(window_2, "f(z) = z^2 - 2z + 2")

draw_fractal(f2, f2_roots, img_2) # draw a fractal for f2


img_2.write("fractal_2.gif", "gif") # save the fractal to file

# Create a window for showing the third function fractal


window_3 = tkinter.Toplevel()
img_3 = configure_window(window_3, "f(z) = z^5 - 1")

draw_fractal(f3, f3_roots, img_3) # draw a fractal for f3


img_3.write("fractal_3.gif", "gif") # save the fractal to file

window_1.mainloop() # run the GUI application loop

if __name__ == '__main__':
main()

f(z) = z3 - 1

W W W . A S S I G N M E N T E X P E R T. C O M
DO MY ASSIGNMENT SUBMIT

f(z) = z3 - 2z + 2

f(z) = z5 - 1

W W W . A S S I G N M E N T E X P E R T. C O M

You might also like