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 |
|