Added Pi-approximating automatons.
10 def set(self, pos, value=1):
11 if not pos in self.cells or value != self.cells[pos]:
12 self.cells[pos] = value
22 def update(self, (x, y)):
23 self.minx = min(x, self.minx)
24 self.maxx = max(x, self.maxx)
25 self.miny = min(y, self.miny)
26 self.maxy = max(y, self.maxy)
30 return self.maxx - self.minx + 1
33 return self.maxy - self.miny + 1
36 return len(self.cells)
45 def iterate(self, oldgrid):
46 grid = copy.deepcopy(oldgrid)
47 for x in xrange(oldgrid.minx - 1, oldgrid.maxx + 2):
48 for y in xrange(oldgrid.miny - 1, oldgrid.maxy + 2):
49 #print x, y, self.neighbours(oldgrid, x, y)
50 n = self.neighbours(oldgrid, (x, y))
55 def neighbours(self, grid, (testx, testy)):
57 #print "testing ", testx, testy
58 for x in range(testx - 1, testx + 2):
59 for y in range(testy - 1, testy + 2):
60 if (x, y) in grid.cells:
68 def iterate(self, oldgrid):
69 grid = copy.deepcopy(oldgrid)
70 for x in xrange(oldgrid.minx - 1, oldgrid.maxx + 2):
71 for y in xrange(oldgrid.miny, oldgrid.maxy + 2):
72 #print "testing ", x, y,
73 if (x+1, y) in oldgrid.cells or (x, y-1) in oldgrid.cells:
80 class PotentialGrowth(object):
85 def iterate(self, oldgrid):
86 grid = copy.deepcopy(oldgrid)
87 for cell in oldgrid.cells.iteritems():
91 new_pos, new_value = self.grow(grid, pos)
92 grid.set(new_pos, new_value)
93 grid.set(pos, value - 1)
96 def grow(self, grid, (x, y)):
97 neighbours = [(x-1, y), (x, y+1), (x+1, y), (x, y-1)]
98 neighbours = [n for n in neighbours if n not in grid.cells]
100 pos = random.choice(neighbours)
104 value = grid.cells[pos]
114 grid.set((0, 1)).set((1, 0)).set((0, -1)).set((-1, 0))
117 print "iteration radius(diff) area(diff) pi"
119 iterations = int(sys.argv[1])
121 for i in range(iterations):
123 r = grid.width() / 2.0
124 r_ideal = math.sqrt(A / math.pi)
125 A_ideal = r**2 * math.pi
127 print "%i %f(%f) %i(%i) %f" % (i, r, r - r_ideal,
130 grid = rule.iterate(grid)
131 dumpGrid(grid, "grid.cfg")
137 grid.set((0, 0)).set((-1, 0)).set((0, 1))
140 iterations = int(sys.argv[1])
142 for i in range(iterations):
143 a = (float(len(grid)) - grid.width()) * 4.0
144 pi = 1.0 / ((grid.width()-1)**2 / ((a + olda) / 2.0))
145 print i, grid.width(), len(grid), pi
146 grid = rule.iterate(grid)
148 dumpGrid(grid, "grid.cfg")
151 rule = PotentialGrowth()
155 iterations = int(sys.argv[1])
157 for i in range(iterations):
159 r = grid.width() / 4.0 + grid.height() / 4.0
160 r_ideal = math.sqrt(A / math.pi)
161 A_ideal = r**2 * math.pi
163 print "%i %f(%f) %i(%i) %f" % (i, r, r - r_ideal,
166 grid = rule.iterate(grid)
167 dumpGrid(grid, "grid.cfg")
174 if __name__ == "__main__":