X-Git-Url: https://disinclined.org/git/?a=blobdiff_plain;f=2d.js;h=2e731c93a3162ad412a3d75adb748e1bb8ea8ec9;hb=26a8f8ddaa0becf3b923ace41a976c04598d00bd;hp=cb48fdfba45969142eef1cbffdcea8f2ae9d71ab;hpb=96eed2a09cdd6d2e4796cf232347fd59291b594f;p=cellular-automaton.git diff --git a/2d.js b/2d.js index cb48fdf..2e731c9 100644 --- a/2d.js +++ b/2d.js @@ -3,11 +3,6 @@ $(document).ready(function(){ var canvas = $('#2d-automaton')[0]; var c = canvas.getContext('2d'); - var rows = 50; - var columns = 50; - - var cellWidth = canvas.width / rows; - var cellHeight = canvas.height / columns; function cell(x, y, h, l) { this.x = x; @@ -33,43 +28,77 @@ $(document).ready(function(){ function universe(blank) { this.population = []; this.generation = 0; - var blank = blank || 0; + this.running = 0; + this.tickID = 0; + + this.blank = blank || 0; + + this.rows = 50; + this.columns = 50; + + this.cellWidth = canvas.width / this.rows; + this.cellHeight = canvas.height / this.columns; - for (var i = 0; i < rows; i++) { + for (var i = 0; i < this.rows; i++) { var world = []; var x = 0; - var y = i * cellHeight; - for (var ii = 0; ii < columns; ii++) { - world.push(new cell(x, y, cellWidth, cellHeight)); - x += cellWidth; - if (blank) { world[ii].kill(); } + var y = i * this.cellHeight; + for (var ii = 0; ii < this.columns; ii++) { + world.push(new cell(x, y, this.cellWidth, this.cellHeight)); + x += this.cellWidth; + if (this.blank) { world[ii].kill(); } else { Math.random() > .5 ? world[ii].revive() : world[ii].kill(); } } this.population.push(world); } - this.highlight = function() { - for (var i = 0; i < rows; i++) { - for (var ii = 0; ii < columns; ii++) { - if (this.population[i][ii].state == 1) { - this.population[i][ii].highlight(); - } - } - } + this.start = function() { + this.tickID = setInterval(function(){tick(automaton)}, 100); + this.running = 1; + } + + this.stop = function() { + clearInterval(this.tickID); + this.running = 0; + } + + this.toggle = function() { + this.running ? this.stop() : this.start(); } this.redraw = function() { - for (var i = 0; i < rows; i++) { - for (var ii = 0; ii < columns; ii++) { + for (var i = 0; i < this.rows; i++) { + for (var ii = 0; ii < this.columns; ii++) { if (this.population[i][ii].state == 1) { this.population[i][ii].redraw(); } } } } + + this.serialize = function() { + var serial = []; + for (var i = 0; i < this.rows; i++) { + var row = []; + for (var ii = 0; ii < this.columns; ii++) { + row[ii] = this.population[i][ii].state; + } + serial.push(row); + } + return serial; + } + + this.populate = function(seed) { + for (var i = 0; i < this.rows; i++) { + for (var ii = 0; ii < this.columns; ii++) { + seed[i][ii] ? this.population[i][ii].revive() + : this.population[i][ii].kill(); + } + } + } } - function tick(automaton, blank) { + function tick(automaton) { automaton.generation += 1; var universe = automaton.population; var newUniverse = []; @@ -109,45 +138,39 @@ $(document).ready(function(){ } var automaton = new universe; - var tickID = 0; - var running = 0; $('#controls #start-automaton').click(function(e){ - tickID = setInterval(function(){tick(automaton)}, 100); + automaton.start(); $('#controls #start-automaton').hide(); $('#controls #stop-automaton').show(); - running = 1; }); $('#controls #stop-automaton').click(function(e){ - if (running) clearInterval(tickID); + automaton.stop(); $('#controls #stop-automaton').hide(); $('#controls #start-automaton').show(); - running = 0; }); $('#controls #reseed-automaton').click(function(e){ - if (running) clearInterval(tickID); + automaton.stop(); $('#controls #stop-automaton').hide(); $('#controls #start-automaton').show(); automaton = new universe(); - running = 0; }); $('#controls #custom-seed-automaton').click(function(e){ - if (running) clearInterval(tickID); + automaton.stop(); $('#controls #stop-automaton').hide(); $('#controls #start-automaton').show(); automaton = new universe(1); - running = 0; }); $('#2d-automaton').click(function(e) { - if (!running) { + if (!automaton.running) { var x = e.pageX - $('#2d-automaton').offset().left; var y = e.pageY - $('#2d-automaton').offset().top; - var row = Math.floor(y / cellHeight); - var column = Math.floor(x / cellWidth); + var row = Math.floor(y / automaton.cellHeight); + var column = Math.floor(x / automaton.cellWidth); automaton.population[row][column].toggle(); } });