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