field and rule class
This commit is contained in:
		
							
								
								
									
										45
									
								
								field.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								field.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					import numpy as np
 | 
				
			||||||
 | 
					import rule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Field(object):
 | 
				
			||||||
 | 
					    def __init__(self, shape = (32,32)):
 | 
				
			||||||
 | 
					        self.resize(shape)
 | 
				
			||||||
 | 
					        self.a_to_b = True
 | 
				
			||||||
 | 
					        self.rule = rule.Rule(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def setRule(self, rule):
 | 
				
			||||||
 | 
					        self.rule = rule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def resize(self, shape):
 | 
				
			||||||
 | 
					        self.shape = shape
 | 
				
			||||||
 | 
					        self.matrix_a = np.matrix(np.zeros(shape, int))
 | 
				
			||||||
 | 
					        self.matrix_b = np.matrix(np.zeros(shape, int))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def update(self):
 | 
				
			||||||
 | 
					        self.a_to_b = False if self.a_to_b else True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        a = self.matrix_a if self.a_to_b else self.matrix_b
 | 
				
			||||||
 | 
					        b = self.matrix_b if self.a_to_b else self.matrix_a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h, w = self.shape
 | 
				
			||||||
 | 
					        for i in range(h):
 | 
				
			||||||
 | 
					            for j in range(w):
 | 
				
			||||||
 | 
					                b[i,j] = self.rule.applyRule(a, i, j)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def getField(self):
 | 
				
			||||||
 | 
					        return self.matrix_b if self.a_to_b else self.matrix_a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def setValue(self, y, x, val):
 | 
				
			||||||
 | 
					        self.matrix_a[y,x] = val
 | 
				
			||||||
 | 
					        self.matrix_b[y,x] = val
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# some testing
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
					    f = Field((160,90))
 | 
				
			||||||
 | 
					    r = rule.Rule(2)
 | 
				
			||||||
 | 
					    f.setRule(r)
 | 
				
			||||||
 | 
					    f.setValue(2,2,1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for i in range(10):
 | 
				
			||||||
 | 
					        print(f.getField())
 | 
				
			||||||
 | 
					        f.update()
 | 
				
			||||||
							
								
								
									
										48
									
								
								rule.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								rule.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					import numpy as np
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Rule(object):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, rule_id, r = 1, k = 2):
 | 
				
			||||||
 | 
					        self.r = r
 | 
				
			||||||
 | 
					        self.k = k
 | 
				
			||||||
 | 
					        self.a = 2 * r + 1
 | 
				
			||||||
 | 
					        self.a2 = self.a**2
 | 
				
			||||||
 | 
					        self.rule_table = np.zeros(k**self.a2, int)
 | 
				
			||||||
 | 
					        self.setRule(rule_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def setRule(self, rule_id):
 | 
				
			||||||
 | 
					        if rule_id < 0:
 | 
				
			||||||
 | 
					            self.rule_id = 0
 | 
				
			||||||
 | 
					        elif rule_id >= self.k**self.a2:
 | 
				
			||||||
 | 
					            self.rule_id = self.k**self.a2 - 1
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            self.rule_id = rule_id
 | 
				
			||||||
 | 
					        self.generateRuleTable()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def applyRule(self, matrix_field, pos_y, pos_x):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        e = 0
 | 
				
			||||||
 | 
					        sum = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h, w = matrix_field.shape
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for i in range(pos_y - self.r, pos_y + self.r + 1):
 | 
				
			||||||
 | 
					            for j in range(pos_x - self.r, pos_x + self.r + 1):
 | 
				
			||||||
 | 
					                y = i if i < h else i - h
 | 
				
			||||||
 | 
					                x = j if j < w else j - w
 | 
				
			||||||
 | 
					                sum += matrix_field[y,x] * self.k**e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                e += 1
 | 
				
			||||||
 | 
					        return self.rule_table[sum]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def generateRuleTable(self):
 | 
				
			||||||
 | 
					        id =  self.rule_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        i = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while id > 0:
 | 
				
			||||||
 | 
					            self.rule_table[i] = id % self.k
 | 
				
			||||||
 | 
					            id = id // 2
 | 
				
			||||||
 | 
					            i = i + 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #print(self.rule_table)
 | 
				
			||||||
		Reference in New Issue
	
	Block a user