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