sawine@1: import time sawine@5: #cells range -2.2-1.4j 1+1.4j res 1000x1000 sha256: 82fe54e221a7ac3283443fc189bb0baf579bba013a7ed3405606bb2dd8c03127 sawine@5: #empty cells sha256: 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a sawine@1: def profile(func): sawine@1: def wrapper(*arg): sawine@1: t1 = time.clock() sawine@1: res = func(*arg) sawine@1: t2 = time.clock() sawine@1: print "duration: %fs" % float(t2-t1) sawine@1: return res sawine@1: return wrapper sawine@1: sawine@1: def isDivergent(c): sawine@1: if c.real == float("inf") or c.real == float("-inf"): sawine@0: return True sawine@1: if c.imag == float("inf") or c.imag == float("-inf"): sawine@1: return True sawine@1: return False sawine@1: sawine@1: def isPeriodic(z): sawine@0: return False sawine@0: sawine@0: class Cell(object): sawine@0: def __init__(self, c, value, iterations): sawine@0: self.c = c sawine@0: self.value = value sawine@0: self.iterations = iterations sawine@0: sawine@0: class Mandelbrot(object): sawine@0: def __init__(self, range, resolution): sawine@0: self.range = range sawine@0: self.resolution = resolution sawine@0: def iterate(self, z, c): sawine@0: return z * z + c sawine@0: def test(self, c, max_iter): sawine@0: z = [0] sawine@0: for i in xrange(max_iter): sawine@0: z.append(self.iterate(z[-1], c)) sawine@1: if isDivergent(z[-1]): sawine@1: break sawine@1: if isPeriodic(z[-10:-1]): sawine@0: break sawine@4: return z[-1] sawine@1: @profile sawine@0: def resolve(self, max_iter): sawine@0: cells = {} sawine@0: x_diff = (self.range[1].real - self.range[0].real) / self.resolution[0] sawine@0: y_diff = (self.range[1].imag - self.range[0].imag) / self.resolution[1] sawine@0: c_diff = complex(x_diff, y_diff) sawine@0: sawine@0: for y in xrange(self.resolution[1]): sawine@0: for x in xrange(self.resolution[0]): sawine@0: c = self.range[0] + c_diff * complex(x, y) sawine@4: cells[c] = self.test(c, max_iter) sawine@4: return cells sawine@0: sawine@0: