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