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