Fixed embrassing typo.
1 var QUOTES_NUMBER = 42;
2 var SERVER = "http://" + window.location.hostname + ":" + window.location.port;
6 $(document).ready(function() {
7 simulation = new Simulation(document.getElementById("sim"),
8 670, 50, 6, green, background);
9 var image = new Image();
10 image.onload = init_logo;
11 image.src = "images/logobase.png";
12 $("#logo").click(handle_click);
13 $("#logo").hover(function(event) {
14 $(this).css("cursor", "pointer");
16 $(this).css("cursor", "auto");
18 $("#logo").mousemove(function(event) { handle_hover(event); });
19 $("#logo").mouseout(function(event) { handle_mouse_out(event); });
20 $("#sim").mousemove(function(event) { simulation.mouse_moved(mouse_pos(event, "#sim")); });
22 if (window.webkitRequestAnimationFrame) {
23 onEachFrame = function(cb) {
24 var _cb = function() { cb(); webkitRequestAnimationFrame(_cb); }
27 } else if (window.mozRequestAnimationFrame) {
28 onEachFrame = function(cb) {
29 var _cb = function() { cb(); mozRequestAnimationFrame(_cb); }
33 onEachFrame = function(cb) {
34 setInterval(cb, 1000 / 30);
37 window.onEachFrame = onEachFrame;
38 window.onEachFrame(update);
39 var pos = document.location.href.lastIndexOf("/") + 1;
40 var page = document.location.href.substr(pos);
41 if (page == "mandelbrot.html") {
43 } else if (page == "" || page == "index.html") {
44 init_gameoflife("ME73");
45 } else if (page == "gameoflife.html") {
50 $(document).keypress(function(event) {
51 if (event.which == 13) {
52 event.preventDefault();
58 var menu_height = 100;
59 var menu_splits = new Array(180, 350, 505);
61 var click_events = new Array();
62 click_events["logo"] = new Array();
63 click_events["logo"][0] = new Object();
64 click_events["logo"][0]["min_x"] = 0;
65 click_events["logo"][0]["max_x"] = menu_splits[0];
66 click_events["logo"][0]["min_y"] = 0;
67 click_events["logo"][0]["max_y"] = menu_height;
68 click_events["logo"][0]["func"] = switch_page;
69 click_events["logo"][0]["args"] = new Array("personalwork.html");
70 click_events["logo"][1] = new Object();
71 click_events["logo"][1]["min_x"] = menu_splits[0] + 1;
72 click_events["logo"][1]["max_x"] = menu_splits[1];
73 click_events["logo"][1]["min_y"] = 0;
74 click_events["logo"][1]["max_y"] = menu_height;
75 click_events["logo"][1]["func"] = switch_page;
76 click_events["logo"][1]["args"] = new Array("howiwork.html");
77 click_events["logo"][2] = new Object();
78 click_events["logo"][2]["min_x"] = menu_splits[1] + 1;
79 click_events["logo"][2]["max_x"] = menu_splits[2];
80 click_events["logo"][2]["min_y"] = 0;
81 click_events["logo"][2]["max_y"] = menu_height;
82 click_events["logo"][2]["func"] = switch_page;
83 click_events["logo"][2]["args"] = new Array("books.html");
84 click_events["logo"][3] = new Object();
85 click_events["logo"][3]["min_x"] = menu_splits[2] + 1;
86 click_events["logo"][3]["max_x"] = menu_width - 1;
87 click_events["logo"][3]["min_y"] = 0;
88 click_events["logo"][3]["max_y"] = menu_height;
89 click_events["logo"][3]["func"] = switch_page;
90 click_events["logo"][3]["args"] = new Array("links.html", "linksend.html");
92 function mouse_pos(event, id) {
93 var offset = $(id).offset();
94 return new Array(event.pageX - offset.left,
95 event.pageY - offset.top);
98 function handle_click(event) {
99 var xy = mouse_pos(event, "#logo");
102 for (var i in click_events[event.target.id]) {
103 var ces = click_events[event.target.id][i];
104 if (ces && x >= ces["min_x"] && x <= ces["max_x"]
105 && y >= ces["min_y"] && y <= ces["max_y"]) {
106 ces["func"](event.target.id, ces);
107 last_colours[0] = black;
113 function handle_hover(event) {
114 var xy = mouse_pos(event, "#logo");
117 for (var i in click_events[event.target.id]) {
118 var ces = click_events[event.target.id][i];
119 if (ces && x >= ces["min_x"] && x <= ces["max_x"]
120 && y >= ces["min_y"] && y <= ces["max_y"]) {
121 highlight_menu(event.target.id, ces);
127 function handle_mouse_out(event) {
128 highlight_menu(event.target.id, null);
131 function switch_page(id, params) {
132 var page = params["args"][0];
133 $("body").load(page);
134 document.location.href = page;
138 var last_colours = new Array();
140 function highlight_menu(id, p) {
141 if (last_highlight == p) {
144 var canvas = document.getElementById("logo");
145 var context = canvas.getContext("2d");
146 var image = context.getImageData(0, 0, menu_width, menu_height);
147 if (last_highlight && last_colours && last_colours[0] && last_colours[1]) {
148 page = last_highlight["args"][0];
149 min_x = last_highlight["min_x"];
150 max_x = last_highlight["max_x"];
151 min_y = last_highlight["min_y"];
152 max_y = last_highlight["max_y"];
153 colour_area(image, min_x + 10, max_x - 10, 0, 60,
155 colour_area(image, min_x + 10, max_x - 10, 60, max_y - 10,
159 var page = p["args"][0];
160 var min_x = p["min_x"];
161 var max_x = p["max_x"];
162 var min_y = p["min_y"];
163 var max_y = p["max_y"];
164 last_colours[0] = colour_area(image, min_x + 10, max_x - 10, 0, 60,
166 last_colours[1] = colour_area(image, min_x + 10, max_x - 10, 60, max_y - 10,
170 context.putImageData(image, 0, 0);
174 function colour_area(image, min_x, max_x, min_y, max_y, colour) {
175 var pixels = image.data;
177 for (var y = min_y; y <= max_y; y += 1) {
178 for (var x = min_x; x <= max_x; x += 1) {
179 var pix_colour = getPixel(image, x, y);
180 if (pix_colour.a > 0) {
181 colour.a = pix_colour.a;
182 setPixel(image, x, y, colour);
183 if (pix_colour.a == 255) {
184 old_colour = pix_colour;
192 function init_logo(event) {
193 var canvas = document.getElementById("logo");
194 var context = canvas.getContext("2d");
195 canvas.width = menu_width;
196 canvas.height = menu_height;
197 context.drawImage(event.target, 0, 0);
198 var image = context.getImageData(0, 0, menu_width, menu_height);
199 for (var i in click_events["logo"]) {
200 var p = click_events["logo"][i];
201 var min_x = p["min_x"];
202 var max_x = p["max_x"];
203 var min_y = p["min_y"];
204 var max_y = p["max_y"];
205 var pos = document.location.href.lastIndexOf("/") + 1;
206 var page = document.location.href.substr(pos);
207 for (var j in p["args"]) {
208 if (page == p["args"][j]) {
209 colour_area(image, min_x, max_x, 0, 60, blue);
210 colour_area(image, min_x, max_x, 60, max_y, white);
214 colour_area(image, min_x, max_x, 0, 60, white);
215 colour_area(image, min_x, max_x, 60, max_y, orange);
219 context.putImageData(image, 0, 0);
220 // context.fillStyle = green.str();
221 // console.log((found["max_x"] - found["min_x"]) / 2 + found["min_x"] - 2);
222 // context.fillRect((found["max_x"]-found["min_x"])/2+found["min_x"]-1, 95, 2, 5);
226 function draw_menu_lines() {
227 var canvas = document.getElementById("logo");
228 var context = canvas.getContext("2d");
229 var image = context.getImageData(0, 0, menu_width, menu_height);
230 var pixels = image.data;
231 context.lineCap = "round";
232 context.lineWidth = 1;
233 var colour1a = new Colour(0, 0, 0, 0.1);
235 context.moveTo(0, menu_height - 1);
236 context.lineTo(menu_width - 1, menu_height - 1);
238 context.strokeStyle = colour1a.str();
240 var colour1e = new Colour(0, 0, 0, 0.05);
242 context.moveTo(70, menu_height - 1);
243 context.lineTo(menu_width - 71, menu_height - 1);
245 context.strokeStyle = colour1e.str();
247 var colour1b = new Colour(0, 0, 0, 0.05);
249 context.moveTo(50, menu_height - 1);
250 context.lineTo(menu_width - 51, menu_height - 1);
252 context.strokeStyle = colour1b.str();
254 var colour1c = new Colour(0, 0, 0, 0.05);
256 context.moveTo(25, menu_height - 1);
257 context.lineTo(menu_width - 26, menu_height - 1);
259 context.strokeStyle = colour1c.str();
261 var colour1d = new Colour(0, 0, 0, 0.05);
263 context.moveTo(10, menu_height - 1);
264 context.lineTo(menu_width - 11, menu_height - 1);
266 context.strokeStyle = colour1d.str();
269 var colour2 = new Colour(0, 0, 0, 0.2);
271 context.moveTo(menu_splits[0], 0);
272 context.lineTo(menu_splits[0], menu_height - 1);
273 context.moveTo(menu_splits[1], 0);
274 context.lineTo(menu_splits[1], menu_height - 1);
275 context.moveTo(menu_splits[2], 0);
276 context.lineTo(menu_splits[2], menu_height - 1);
278 context.strokeStyle = colour2.str();
281 context.clearRect(menu_splits[0] - 1, menu_height - 1, 2, 2);
282 context.clearRect(menu_splits[1] - 1, menu_height - 1, 2, 2);
283 context.clearRect(menu_splits[2] - 1, menu_height - 1, 2, 2);
285 context.clearRect(menu_splits[0] - 1, menu_height - 2, 1, 1);
286 context.clearRect(menu_splits[1] - 1, menu_height - 2, 1, 1);
287 context.clearRect(menu_splits[2] - 1, menu_height - 2, 1, 1);
290 function clearMenuLines() {
291 var canvas = document.getElementById("logo");
292 var context = canvas.getContext("2d");
293 var image = context.getImageData(0, 0, menu_width, menu_height);
294 var pixels = image.data;
295 context.clearRect(0, menu_height - 2, menu_width - 1, 2);
296 context.clearRect(menu_splits[0] - 1, 0, 2, menu_height - 1);
297 context.clearRect(menu_splits[1] - 1, 0, 2, menu_height - 1);
298 context.clearRect(menu_splits[2] - 1, 0, 2, menu_height - 1);
301 function draw_sim_lines() {
304 var canvas = document.getElementById("sim");
305 var context = canvas.getContext("2d");
306 var image = context.getImageData(0, 0, w, h);
307 var pixels = image.data;
308 context.lineCap = "round";
309 context.lineWidth = 1;
310 var colour1a = new Colour(0, 0, 0, 0.1);
312 context.moveTo(0, h - 1);
313 context.lineTo(w - 1, h - 1);
315 context.strokeStyle = colour1a.str();
317 var colour1e = new Colour(0, 0, 0, 0.05);
319 context.moveTo(70, h - 1);
320 context.lineTo(w - 71, h - 1);
322 context.strokeStyle = colour1e.str();
324 var colour1b = new Colour(0, 0, 0, 0.05);
326 context.moveTo(50, h - 1);
327 context.lineTo(w - 51, h - 1);
329 context.strokeStyle = colour1b.str();
331 var colour1c = new Colour(0, 0, 0, 0.05);
333 context.moveTo(25, h - 1);
334 context.lineTo(w - 26, h - 1);
336 context.strokeStyle = colour1c.str();
338 var colour1d = new Colour(0, 0, 0, 0.05);
340 context.moveTo(10, h - 1);
341 context.lineTo(w - 11, h - 1);
343 context.strokeStyle = colour1d.str();
347 function update_logo() {
348 var canvas = document.getElementById("logo");
349 var context = canvas.getContext("2d");
350 var image = context.getImageData(0, 0, menu_width, menu_height);
351 var pixels = image.data;
352 var white = new Colour(255, 255, 255);
353 for (var y = 0; y < menu_height; y += 1) {
354 for (var x = 0; x < menu_width; x += 1) {
355 var pix_colour = getPixel(image, x, y);
356 if (pix_colour.a > 0) {
357 setPixel(image, x, y, new Colour(90, 215, 21, pix_colour.a));
361 context.putImageData(image, 0, 0);
364 var char_map = new Array();
365 char_map["A"] = new Array(new Array(0, 4), new Array(1, 3),
366 new Array(2, 2), new Array(3, 1),
367 new Array(4, 0), new Array(5, 1),
368 new Array(6, 2), new Array(7, 3),
369 new Array(8, 4), new Array(2, 3),
370 new Array(3, 3), new Array(4, 3),
371 new Array(5, 3), new Array(6, 3));
372 char_map["M"] = new Array(new Array(0, 4), new Array(0, 3),
373 new Array(0, 2), new Array(0, 1),
374 new Array(0, 0), new Array(0, 5),
375 new Array(5, 4), new Array(5, 3),
376 new Array(5, 2), new Array(5, 1),
377 new Array(5, 0), new Array(5, 5),
378 new Array(1, 1), new Array(2, 2),
379 new Array(4, 2), new Array(5, 1),
381 char_map["E"] = new Array(new Array(0, 4), new Array(0, 3),
382 new Array(0, 2), new Array(0, 1),
383 new Array(0, 0), new Array(0, 5),
384 new Array(1, 0), new Array(2, 0),
386 new Array(1, 3), new Array(2, 3),
387 new Array(1, 5), new Array(2, 5),
389 char_map["7"] = new Array(new Array(0, 0), new Array(1, 0),
391 new Array(0, 5), new Array(0, 4),
392 new Array(1, 3), new Array(2, 2));
393 char_map["3"] = new Array(new Array(2, 4), new Array(2, 3),
394 new Array(2, 2), new Array(2, 1),
395 new Array(0, 0), new Array(0, 5),
396 new Array(1, 0), new Array(2, 0),
397 new Array(1, 3), new Array(2, 3),
398 new Array(1, 5), new Array(2, 5))
400 function init_gameoflife(text) {
401 var canvas = document.getElementById("gameoflife");
404 gameoflife = new Simulation(canvas, 670, 670, cell_size,
406 $("#gameoflife").mousemove(function(event) {
407 gameoflife.mouse_moved(mouse_pos(event, "#gameoflife"));
409 var offset = new Array(13, 16);
410 for (var c in text) {
412 for (p in char_map[text[c]]) {
413 var x = char_map[text[c]][p][0];
414 var y = char_map[text[c]][p][1];
416 var pos = new Array((x + offset[0]) * cell_size,
417 (y + offset[1]) * cell_size);
418 gameoflife.activate_cell(pos);
425 function Colour(r, g, b, a) {
429 this.a = a == undefined ? 255 : a;
431 Colour.prototype.equals = function(rhs) {
433 if (typeof(rhs[p]) == undefined
434 || this[p] != rhs[p]) {
440 Colour.prototype.str = function() {
441 return "rgba(" + this.r + "," + this.g + "," + this.b + "," + this.a + ")";
444 var white = new Colour(255, 255, 255);
445 var black = new Colour(0, 0, 0, 255);
446 var orange = new Colour(201, 87, 35, 255);
447 var green = new Colour(90, 215, 21, 255);
448 var blue = new Colour(85, 170, 221, 255);
449 var background = new Colour(34, 34, 34, 255);
451 function setPixel(image, x, y, colour) {
452 var index = 4 * (x + y * image.width);
453 image.data[index] = colour.r;
454 image.data[index + 1] = colour.g;
455 image.data[index + 2] = colour.b;
456 image.data[index + 3] = colour.a;
459 function getPixel(image, x, y) {
460 var index = 4 * (x + y * image.width);
461 var r = image.data[index];
462 var g = image.data[index + 1];
463 var b = image.data[index + 2];
464 var a = image.data[index + 3];
465 return new Colour(r, g, b, a);
468 function load_random_quote() {
469 var file = "/quotes/quote" + Math.floor(Math.random() * QUOTES_NUMBER + 1) + ".html";
470 $.ajax({url: SERVER + file,
471 success: write_quote});
474 function write_quote(data, status, xhr) {
475 $("#random_quote").html(data);
478 function load_footer()
480 var file = "/footer.html";
481 var currentFile = self.location.hostname + self.location.pathname;
482 var request = http_request_object();
483 var url = "http://" + self.location.hostname + file;
484 request.open("GET", url, false);
485 request.setRequestHeader("User-Agent", navigator.userAgent);
487 // if (oRequest.status == 200) alert(oRequest.responseText);
488 // else alert("Error executing XMLHttpRequest call!");
489 //document.write(url);
490 //document.write(request.responseText);
491 document.getElementById('footer').innerHTML = request.responseText;
496 // Mandelbrot functions
497 function Complex(real, imag)
503 var MIN_C = new Complex(-2.2, -1.4);
504 var MAX_C = new Complex(1.0, 1.4);
508 var max_iter = MIN_ITER;
513 function Result(z, iter)
519 function complex_quad(c)
521 return new Complex(Math.pow(c.real, 2) - Math.pow(c.imag, 2),
522 2.0 * c.real * c.imag);
525 function complex_quad_value(c)
527 return Math.pow(c.real, 2) + Math.pow(c.imag, 2);
530 function complex_add(c1, c2)
532 return new Complex(c1.real + c2.real, c1.imag + c2.imag);
535 function complex_equal(c1, c2)
537 return (c1.real == c2.real) && (c1.imag == c2.imag);
540 function iterate(z, c)
542 z_quad = complex_quad(z);
543 return new Complex(z_quad.real + c.real, z_quad.imag + c.imag);
546 function test(c, max_iter)
549 var z = new Complex(0.0, 0.0);
550 var last_z = new Complex(-1.0, 0.0);
551 var quad_z = complex_quad_value(z);
553 while (iter < max_iter
554 && !complex_equal(z, last_z)
555 && quad_z <= bailout)
559 quad_z = complex_quad_value(z);
562 return new Result(quad_z, iter);
565 function draw(diter, dx, dy, dz, dres)
567 var canvas = document.getElementById('mandelbrot');
569 if (canvas.getContext)
572 var ctx = canvas.getContext('2d');
576 resolution = Math.max(1, resolution + dres);
581 max_iter = Math.max(MIN_ITER, max_iter + diter);
584 var red = "rgb(255, 0, 0)";
585 var white = "rgb(255, 255, 255)";
586 var width = canvas.width;
587 var height = canvas.height;
588 var dim = Math.max(width, height);
589 var dim_ratio = Math.round(width / height);
590 var diff_c = new Complex(max_c.real - min_c.real,
591 max_c.imag - min_c.imag);
592 dx_min = diff_c.real / 100 * (dx + dz);
593 dx_max = diff_c.real / 100 * (dx - dz);
595 dy_min = diff_c.imag / 100 * (dy + dz);
596 dy_max = diff_c.imag / 100 * (dy - dz);
598 var min_inc = new Complex(dx_min * dim_ratio / 2.0, dy_min);
599 var max_inc = new Complex(dx_max * dim_ratio / 2.0, dy_max);
600 min_c = complex_add(min_c, min_inc);
601 max_c = complex_add(max_c, max_inc);
602 diff_c = new Complex(max_c.real - min_c.real,
603 max_c.imag - min_c.imag);
605 for (var y = 0; y < height; y += resolution)
607 for (var x = 0; x < width; x += resolution)
609 var c = new Complex(min_c.real + diff_c.real / dim * x,
610 min_c.imag + diff_c.imag / dim * y);
611 var result = test(c, max_iter);
612 var r = Math.min(255, Math.pow(Math.max(0,
613 (result.iter - max_iter / 20.0)), 2));
614 var g = Math.min(255, Math.pow(Math.max(0,
615 (result.iter - max_iter / 25.0)), 2));
616 var b = Math.min(255, Math.pow(Math.max(0,
617 (result.iter - max_iter / 20.0)), 2));
618 var colour = "rgb(" + r + "," + g + "," + b + ")";
619 ctx.fillStyle = colour;
620 ctx.fillRect(x, y, resolution, resolution);
626 function getEventOffsetX(evt)
628 if (evt.offsetX != null)
631 var obj = evt.target || evt.srcElement;
633 return (evt.clientX - obj.pageLeft);
636 function getEventOffsetY(evt)
638 if (evt.offsetY != null)
641 var obj = evt.target || evt.srcElement;
643 return (evt.clientY - obj.pageTop);
646 function setPageTopLeft( o )
652 while (o.offsetParent)
654 left += o.offsetLeft ;
663 function draw2(evt) {
666 var x = (getEventOffsetX(evt) - 335) / 167.5;
667 var y = (getEventOffsetY(evt) - 140) / 70;
669 draw(iter, x, y, z, res);
681 function Grid(width, height, cell_size) {
682 this.width = parseInt(width / cell_size + 0.5);
683 this.height = parseInt(height / cell_size + 0.5);
684 this.canvas_width = width;
685 this.canvas_height = height;
686 this.cell_size = cell_size;
687 this.cells = new Array();
688 for (var y = 0; y < this.height; ++y) {
689 this.cells[y] = new Array();
690 for (var x = 0; x < this.width; ++x) {
691 this.cells[y][x] = new Cell(x, y, 0, this);
695 Grid.prototype.cell = function(x, y) {
696 return this.cells[y][x];
698 Grid.prototype.pick_cell = function(x, y) {
699 var lx = parseInt(x / this.cell_size - 0.5);
700 var ly = parseInt(y / this.cell_size - 0.5);
701 return this.cells[ly][lx];
704 function Cell(x, y, value, grid) {
707 this.canvas_x = x * grid.cell_size;
708 this.canvas_y = y * grid.cell_size;
711 this._neighbours = new Array();
714 Cell.prototype.hash = function() {
715 return this.x + ", " + this.y;
717 Cell.prototype.set_value = function(value) {
719 this.last_mod = $.now();
721 Cell.prototype.neighbours = function() {
722 if (this._neighbours.length) {
723 return this._neighbours;
726 this._neighbours.push(this.grid.cell(this.x-1, this.y));
728 this._neighbours.push(this.grid.cell(this.x-1, this.y-1));
729 this._neighbours.push(this.grid.cell(this.x, this.y-1));
731 if (this.y + 1 < this.grid.height) {
732 this._neighbours.push(this.grid.cell(this.x-1, this.y+1));
735 if (this.x + 1 < this.grid.width) {
736 this._neighbours.push(this.grid.cell(this.x+1, this.y));
737 if (this.y + 1 < this.grid.height) {
738 this._neighbours.push(this.grid.cell(this.x+1, this.y+1));
739 this._neighbours.push(this.grid.cell(this.x, this.y+1));
742 this._neighbours.push(this.grid.cell(this.x+1, this.y-1));
745 return this._neighbours;
747 Cell.prototype.density = function() {
749 var neighbours = this.neighbours();
750 for (var n in neighbours) {
751 d += neighbours[n].value;
756 function Simulation(canvas, w, h, cell_size, life_colour, dead_colour) {
757 this.last_update = $.now() + 3000;
759 this.last_mouse_moved = 0;
760 this.redraw = new Array();
761 this.canvas = canvas;
762 this.canvas.width = w;
763 this.canvas.height = h;
764 this.context = canvas.getContext("2d");
765 this.pos_queue = new Array();
766 this.cell_queue = new Array();
767 this.cell_size = cell_size;
768 this.life_colour = life_colour;
769 this.dead_colour = dead_colour;
770 this.grid = new Grid(this.canvas.width, this.canvas.height, cell_size);
773 Simulation.prototype.draw = function() {
775 if (this.redraw.length) {
776 var cell = this.redraw[0];
778 this.context.fillStyle = cell.value == 1 ?
779 this.life_colour.str() : this.dead_colour.str();
780 this.context.fillRect(cell.canvas_x, cell.canvas_y,
781 this.grid.cell_size, this.grid.cell_size);
782 this.last_draw = $.now();
785 Simulation.prototype.update = function() {
787 while (this.pos_queue.length) {
788 var pos = this.pos_queue.pop();
789 if (pos[0] < this.canvas.width
790 && pos[1] < this.canvas.height) {
791 var cell = this.grid.pick_cell(pos[0], pos[1]);
793 this.cell_queue.push(cell);
794 this.cell_queue.concat(cell.neighbours());
795 this.redraw.unshift(cell);
798 if (this.last_update + 1000 > now) {
801 var changed = new Array();
802 var next_cell_queue = new Array();
803 while (this.cell_queue.length) {
804 var cell = this.cell_queue.pop();
805 if (changed[cell.hash()]) {
808 var d = cell.density();
809 if (d == 3 && cell.value == 0) {
810 changed[cell.hash()] = cell;
811 next_cell_queue = next_cell_queue.concat(cell.neighbours());
812 } else if (cell.value == 1) {
813 if (d < 2 || d > 3) {
814 changed[cell.hash()] = cell;
815 next_cell_queue = next_cell_queue.concat(cell.neighbours());
819 for (var pos in changed) {
820 var cell = changed[pos];
821 cell.set_value(1 - cell.value);
822 this.redraw.push(cell);
824 this.cell_queue = next_cell_queue;
825 this.last_update = now;
827 Simulation.prototype.activate_cell = function(pos) {
828 this.pos_queue.push(pos);
830 Simulation.prototype.mouse_moved = function(pos) {
832 if (this.last_mouse_moved + 50 < now) {
833 this.pos_queue.push(pos);
834 this.last_mouse_moved = now;