2017-05-16 22:49:28 +02:00
|
|
|
|
|
|
|
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
|
2017-05-18 20:58:15 +02:00
|
|
|
self.rule_table = k**self.a2 * [0]
|
2017-05-16 22:49:28 +02:00
|
|
|
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()
|
|
|
|
|
2017-05-18 20:58:15 +02:00
|
|
|
def applyRule(self, matrix_field, shape, pos_y, pos_x):
|
2017-05-16 22:49:28 +02:00
|
|
|
|
|
|
|
e = 0
|
|
|
|
sum = 0
|
|
|
|
|
2017-05-18 20:58:15 +02:00
|
|
|
h, w = shape
|
2017-05-16 22:49:28 +02:00
|
|
|
|
|
|
|
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
|
2017-05-18 20:58:15 +02:00
|
|
|
sum += matrix_field[y][x] * self.k**e
|
2017-05-16 22:49:28 +02:00
|
|
|
|
|
|
|
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)
|