cellpimat.py
author Eugen Sawin <sawine@me73.com>
Thu, 30 Dec 2010 15:19:36 +0100
changeset 5 dd036093fc09
parent 2 ccbf96145796
permissions -rw-r--r--
More efficient grid iteration.
     1 import copy
     2 from caugrid import Grid
     3 
     4 class Rule(object):
     5 
     6 	def iterate(self, oldgrid):
     7 		grid = copy.deepcopy(oldgrid)
     8 		for x in xrange(oldgrid.minx - 1, oldgrid.maxx + 2):
     9 			for y in xrange(oldgrid.miny - 1, oldgrid.maxy + 2):
    10 				#print x, y, self.neighbours(oldgrid, x, y)
    11 				n = self.neighbours(oldgrid, (x, y))
    12 				if n > 2:
    13 					grid.set((x, y))					
    14 		return grid
    15 
    16 	def neighbours(self, grid, (testx, testy)):
    17 		n = 0
    18 		#print "testing ", testx, testy
    19 		for x in range(testx - 1, testx + 2):
    20 			for y in range(testy - 1, testy + 2):
    21 				if (x, y) in grid.cells:
    22 					n += 1
    23 				#print x, y, n
    24 		return n 
    25 	
    26 
    27 class Rule2(object):
    28 
    29 	def iterate(self, oldgrid):
    30 		grid = copy.deepcopy(oldgrid)
    31 		for x in xrange(oldgrid.minx - 1, oldgrid.maxx + 2):
    32 			for y in xrange(oldgrid.miny, oldgrid.maxy + 2):
    33 				#print "testing ", x, y,
    34 				if (x+1, y) in oldgrid.cells or (x, y-1) in oldgrid.cells:
    35 					grid.set((x, y), 1)								
    36 		return grid
    37 
    38 import random
    39 import caumarshal as marshal
    40 
    41 class PotentialGrowth(object):
    42 		
    43 	def __init__(self):
    44 		random.seed()
    45 
    46 	def iterate(self, oldgrid):
    47 		grid = copy.deepcopy(oldgrid)
    48 		for cell in oldgrid.cells.iteritems():
    49 			pos = cell[0]
    50 			value = cell[1]
    51 			if value > 1:
    52 				new_pos, new_value = self.grow(grid, pos)
    53 				grid.set(new_pos, new_value)
    54 				grid.set(pos, value - 1)
    55 		return grid
    56 
    57 	def grow(self, grid, (x, y)):
    58 		neighbours = [(x-1, y), (x, y+1), (x+1, y), (x, y-1)]
    59 		neighbours = [n for n in neighbours if n not in grid.cells]
    60 		try:
    61 			pos = random.choice(neighbours)	
    62 			value = 4
    63 		except IndexError:
    64 			pos = (x, y)
    65 			value = grid.cells[pos]
    66 		return pos, value
    67 
    68 import sys
    69 import math
    70 
    71 def ruleTest():
    72 	rule = Rule()
    73 	grid = Grid()
    74 	grid.set((0, 0))
    75 	grid.set((0, 1)).set((1, 0)).set((0, -1)).set((-1, 0))
    76 	
    77 	
    78 	print "iteration radius(diff) area(diff) pi"
    79 
    80 	iterations = int(sys.argv[1])
    81 
    82 	for i in range(iterations):
    83 		A = len(grid)
    84 		r = grid.width() / 2.0
    85 		r_ideal = math.sqrt(A / math.pi)
    86 		A_ideal = r**2 * math.pi
    87 		pi = A / r**2
    88 		print "%i %f(%f) %i(%i) %f" % (i, r, r - r_ideal, 
    89 										A, A - A_ideal, pi)
    90 
    91 		grid = rule.iterate(grid)
    92 		marshal.dumpGrid(grid, "grid.cfg")
    93 		#print
    94 
    95 def rule2Test():
    96 	rule = Rule2()
    97 	grid = Grid()
    98 	grid.set((0, 0)).set((-1, 0)).set((0, 1))
    99 	olda = 1
   100 
   101 	iterations = int(sys.argv[1])
   102 
   103 	for i in range(iterations):
   104 		a =  (float(len(grid)) - grid.width()) * 4.0
   105 		pi = 1.0 / ((grid.width()-1)**2 / ((a + olda) / 2.0))
   106 		print i, grid.width(), len(grid), pi
   107 		grid = rule.iterate(grid)
   108 		olda = a
   109 		marshal.dumpGrid(grid, "grid.cfg")
   110 
   111 def potentialTest():
   112 	rule = PotentialGrowth()
   113 	grid = Grid()
   114 	grid.set((0, 0), 4)
   115 
   116 	iterations = int(sys.argv[1])
   117 
   118 	for i in range(iterations):
   119 		A = len(grid)
   120 		r = grid.width() / 4.0 + grid.height() / 4.0
   121 		r_ideal = math.sqrt(A / math.pi)
   122 		A_ideal = r**2 * math.pi
   123 		pi = A / r**2
   124 		print "%i %f(%f) %i(%i) %f" % (i, r, r - r_ideal, 
   125 										A, A - A_ideal, pi)
   126 
   127 		grid = rule.iterate(grid)
   128 		marshal.dumpGrid(grid, "grid.cfg")
   129 
   130 def main():
   131 	#ruleTest()
   132 	#rule2Test()
   133 	potentialTest()
   134 
   135 if __name__ == "__main__":
   136 	main()