-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathautomata.js
112 lines (92 loc) · 2.2 KB
/
automata.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
function Automata(w, l) {
var self = this
self.generateAutomata = function() {
self.automata = [];
self.automata[0] = []
for (x = 0; x < w; x++)
self.automata[0][x] = self.random()
for (y = 1; y < l; y++) {
self.automata[y] = []
for (x = 0; x < w; x++) {
var left = self.getLeft(),
center = self.getCenter(),
right = self.getRight()
self.automata[y][x] = self.rule(left, center, right)
}
}
}
self.random = function() {
return Math.random() < 0.5;
}
self.getCenter = function() {
return self.automata[y-1][x]
}
self.getLeft = function() {
var left
if (x == 0)
left = self.automata[y-1][w-1]
else
left = self.automata[y-1][x-1]
return left
}
self.getRight = function() {
var right
if (x == w-1)
left = self.automata[y-1][0]
else
left = self.automata[y-1][x+1]
}
self.rule = function(left, center, right) {
if (left && center && right)
return false
else if (left && center && !right)
return false
else if (left && !center && right)
return false
else if (left && !center && !right)
return true
else if (!left && center && right)
return true
else if (!left && center && !right)
return true
else if (!left && !center && right)
return true
else if (!left && !center && !right)
return false
}
self.renderAutomata = function() {
var main = document.createElement('div')
main.style.width = 5 * w + 'px'
main.classList.add('main')
document.body.appendChild(main)
self.rowsRendered = 0
self.renderRows()
}
self.renderRows = function() {
if (self.rowsRendered < l)
setTimeout(function() {
self.renderNextRow()
self.rowsRendered++
self.renderRows()
}, 10)
}
self.renderNextRow = function() {
var main = document.querySelector('.main')
var row = document.createElement('div')
row.classList.add('row')
var y = self.rowsRendered
for (x = 0; x < w; x++) {
var cell = document.createElement('div')
cell.classList.add('cell')
if (self.automata[y][x])
cell.classList.add('active')
row.appendChild(cell)
}
main.appendChild(row)
}
}
window.onload = function () {
var automata = new Automata(300, 300)
automata.generateAutomata()
automata.renderAutomata()
}