algorithm.py
author Eugen Sawin <sawine@me73.com>
Sat, 03 Jul 2010 22:36:34 +0200
changeset 7 fdf52cc6952f
parent 4 4cee17e91d29
permissions -rw-r--r--
Added Canvas Mandelbrot
sawine@1
     1
import time
sawine@5
     2
#cells range -2.2-1.4j 1+1.4j res 1000x1000 sha256:  82fe54e221a7ac3283443fc189bb0baf579bba013a7ed3405606bb2dd8c03127
sawine@5
     3
#empty cells sha256: 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
sawine@1
     4
def profile(func):
sawine@1
     5
	def wrapper(*arg):
sawine@1
     6
		t1 = time.clock()
sawine@1
     7
		res = func(*arg)
sawine@1
     8
		t2 = time.clock()
sawine@1
     9
		print "duration: %fs" % float(t2-t1)
sawine@1
    10
		return res
sawine@1
    11
	return wrapper
sawine@1
    12
sawine@1
    13
def isDivergent(c):
sawine@1
    14
	if c.real == float("inf") or c.real == float("-inf"):
sawine@0
    15
		return True
sawine@1
    16
	if c.imag == float("inf") or c.imag == float("-inf"):
sawine@1
    17
		return True
sawine@1
    18
	return False
sawine@1
    19
sawine@1
    20
def isPeriodic(z):
sawine@0
    21
	return False
sawine@0
    22
sawine@0
    23
class Cell(object):
sawine@0
    24
	def __init__(self, c, value, iterations):
sawine@0
    25
		self.c = c
sawine@0
    26
		self.value = value
sawine@0
    27
		self.iterations = iterations
sawine@0
    28
		
sawine@0
    29
class Mandelbrot(object):
sawine@0
    30
	def __init__(self, range, resolution):
sawine@0
    31
		self.range = range
sawine@0
    32
		self.resolution = resolution
sawine@0
    33
	def iterate(self, z, c):
sawine@0
    34
		return z * z + c
sawine@0
    35
	def test(self, c, max_iter):
sawine@0
    36
		z = [0]
sawine@0
    37
		for i in xrange(max_iter):
sawine@0
    38
			z.append(self.iterate(z[-1], c))
sawine@1
    39
			if isDivergent(z[-1]):
sawine@1
    40
				break
sawine@1
    41
			if isPeriodic(z[-10:-1]):
sawine@0
    42
				break
sawine@4
    43
		return z[-1]
sawine@1
    44
	@profile	
sawine@0
    45
	def resolve(self, max_iter):
sawine@0
    46
		cells = {}
sawine@0
    47
		x_diff = (self.range[1].real - self.range[0].real) / self.resolution[0]
sawine@0
    48
		y_diff = (self.range[1].imag - self.range[0].imag) / self.resolution[1]
sawine@0
    49
		c_diff = complex(x_diff, y_diff)
sawine@0
    50
		
sawine@0
    51
		for y in xrange(self.resolution[1]):
sawine@0
    52
			for x in xrange(self.resolution[0]):	
sawine@0
    53
				c = self.range[0] + c_diff * complex(x, y)
sawine@4
    54
				cells[c] = self.test(c, max_iter)
sawine@4
    55
		return cells
sawine@0
    56
	
sawine@0
    57