sawine@3: import copy sawine@3: from caugrid import Grid sawine@3: sawine@3: class Rule(object): sawine@3: sawine@3: def iterate(self, oldgrid): sawine@3: grid = copy.deepcopy(oldgrid) sawine@3: for x in xrange(oldgrid.minx - 1, oldgrid.maxx + 2): sawine@3: for y in xrange(oldgrid.miny - 1, oldgrid.maxy + 2): sawine@3: #print x, y, self.neighbours(oldgrid, x, y) sawine@3: n = self.neighbours(oldgrid, (x, y)) sawine@3: if n > 2: sawine@3: grid.set((x, y)) sawine@3: return grid sawine@3: sawine@3: def neighbours(self, grid, (testx, testy)): sawine@3: n = 0 sawine@3: #print "testing ", testx, testy sawine@3: for x in range(testx - 1, testx + 2): sawine@3: for y in range(testy - 1, testy + 2): sawine@3: if (x, y) in grid.cells: sawine@3: n += 1 sawine@3: #print x, y, n sawine@3: return n sawine@3: sawine@3: sawine@3: class Rule2(object): sawine@3: sawine@3: def iterate(self, oldgrid): sawine@3: grid = copy.deepcopy(oldgrid) sawine@3: for x in xrange(oldgrid.minx - 1, oldgrid.maxx + 2): sawine@3: for y in xrange(oldgrid.miny, oldgrid.maxy + 2): sawine@3: #print "testing ", x, y, sawine@3: if (x+1, y) in oldgrid.cells or (x, y-1) in oldgrid.cells: sawine@3: grid.set((x, y), 1) sawine@3: return grid sawine@3: sawine@3: import random sawine@3: import caumarshal as marshal sawine@3: sawine@3: class PotentialGrowth(object): sawine@3: sawine@3: def __init__(self): sawine@3: random.seed() sawine@3: sawine@3: def iterate(self, oldgrid): sawine@5: grid = oldgrid sawine@5: value_pos = {} sawine@5: for i in range(2, 5): sawine@5: if i in oldgrid.valuemap: sawine@5: value_pos[i] = copy.deepcopy(oldgrid.valuemap[i]) sawine@5: for i in range(2, 5): sawine@5: if i in oldgrid.valuemap: sawine@5: for cell in value_pos[i]: sawine@5: pos = cell sawine@5: value = i sawine@5: new_pos, new_value = self.grow(grid, pos) sawine@5: grid.set(new_pos, new_value) sawine@5: grid.set(pos, value - 1) sawine@3: return grid sawine@3: sawine@3: def grow(self, grid, (x, y)): sawine@4: n1 = [(x-1, y), (x, y+1), (x+1, y), (x, y-1)] sawine@4: n2 = [(x+1, y+1), (x+1, y-1), (x-1, y-1), (x-1, y+1)] sawine@6: c0 = (n1, ) sawine@6: c1 = (n1, n2) sawine@6: c2 = (n1, n1, n2) sawine@6: neighbours = random.choice(random.choice((c0, c1, c2))) sawine@3: neighbours = [n for n in neighbours if n not in grid.cells] sawine@4: if len(neighbours): sawine@3: pos = random.choice(neighbours) sawine@3: value = 4 sawine@4: else: sawine@3: pos = (x, y) sawine@3: value = grid.cells[pos] sawine@3: return pos, value sawine@3: sawine@3: import sys sawine@3: import math sawine@3: sawine@3: def ruleTest(): sawine@3: rule = Rule() sawine@3: grid = Grid() sawine@3: grid.set((0, 0)) sawine@3: grid.set((0, 1)).set((1, 0)).set((0, -1)).set((-1, 0)) sawine@3: sawine@3: sawine@3: print "iteration radius(diff) area(diff) pi" sawine@3: sawine@3: iterations = int(sys.argv[1]) sawine@3: sawine@3: for i in range(iterations): sawine@3: A = len(grid) sawine@3: r = grid.width() / 2.0 sawine@3: r_ideal = math.sqrt(A / math.pi) sawine@3: A_ideal = r**2 * math.pi sawine@3: pi = A / r**2 sawine@3: print "%i %f(%f) %i(%i) %f" % (i, r, r - r_ideal, sawine@3: A, A - A_ideal, pi) sawine@3: sawine@3: grid = rule.iterate(grid) sawine@3: marshal.dumpGrid(grid, "grid.cfg") sawine@3: #print sawine@3: sawine@3: def rule2Test(): sawine@3: rule = Rule2() sawine@3: grid = Grid() sawine@3: grid.set((0, 0)).set((-1, 0)).set((0, 1)) sawine@3: olda = 1 sawine@3: sawine@3: iterations = int(sys.argv[1]) sawine@3: sawine@3: for i in range(iterations): sawine@3: a = (float(len(grid)) - grid.width()) * 4.0 sawine@3: pi = 1.0 / ((grid.width()-1)**2 / ((a + olda) / 2.0)) sawine@3: print i, grid.width(), len(grid), pi sawine@3: grid = rule.iterate(grid) sawine@3: olda = a sawine@3: marshal.dumpGrid(grid, "grid.cfg") sawine@3: sawine@3: def potentialTest(): sawine@3: rule = PotentialGrowth() sawine@3: grid = Grid() sawine@3: grid.set((0, 0), 4) sawine@3: sawine@3: iterations = int(sys.argv[1]) sawine@5: last_pi = 3.0 sawine@3: for i in range(iterations): sawine@3: A = len(grid) sawine@3: r = grid.width() / 4.0 + grid.height() / 4.0 sawine@3: r_ideal = math.sqrt(A / math.pi) sawine@3: A_ideal = r**2 * math.pi sawine@3: pi = A / r**2 sawine@5: pi = (pi + last_pi) / 2.0 sawine@5: last_pi = pi sawine@3: print "%i %f(%f) %i(%i) %f" % (i, r, r - r_ideal, sawine@3: A, A - A_ideal, pi) sawine@3: sawine@3: grid = rule.iterate(grid) sawine@3: marshal.dumpGrid(grid, "grid.cfg") sawine@3: sawine@3: def main(): sawine@3: #ruleTest() sawine@3: #rule2Test() sawine@3: potentialTest() sawine@3: sawine@3: if __name__ == "__main__": sawine@3: main()