sawine@74: var QUOTES_NUMBER = 39; sawine@78: var SERVER = "http://" + window.location.hostname + ":" + window.location.port; sawine@78: var simulation; sawine@80: var gameoflife; sawine@74: sawine@78: $(document).ready(function() { sawine@82: simulation = new Simulation(document.getElementById("sim"), sawine@85: 670, 50, 6, green, background); sawine@74: var image = new Image(); sawine@74: image.onload = init_logo; sawine@74: image.src = "images/logobase.png"; sawine@74: $("#logo").click(handle_click); sawine@74: $("#logo").hover(function() { sawine@75: $(this).css("cursor", "pointer"); sawine@74: }, function() { sawine@74: $(this).css("cursor", "auto"); sawine@77: }); sawine@79: $("#sim").mousemove(function(event) { simulation.mouse_moved(mouse_pos(event, "#sim")); }); sawine@78: var onEachFrame; sawine@78: if (window.webkitRequestAnimationFrame) { sawine@78: onEachFrame = function(cb) { sawine@78: var _cb = function() { cb(); webkitRequestAnimationFrame(_cb); } sawine@78: _cb(); sawine@78: }; sawine@78: } else if (window.mozRequestAnimationFrame) { sawine@78: onEachFrame = function(cb) { sawine@78: var _cb = function() { cb(); mozRequestAnimationFrame(_cb); } sawine@78: _cb(); sawine@78: }; sawine@78: } else { sawine@78: onEachFrame = function(cb) { sawine@78: setInterval(cb, 1000 / 30); sawine@78: } sawine@78: } sawine@78: window.onEachFrame = onEachFrame; sawine@81: window.onEachFrame(update); sawine@81: var pos = document.location.href.lastIndexOf("/") + 1; sawine@81: var page = document.location.href.substr(pos); sawine@84: if (page == "mandelbrot.html") { sawine@81: draw(0, 0, 0, 0, 0); sawine@81: } else if (page == "gameoflife.html") { sawine@84: init_gameoflife("text"); sawine@81: } sawine@74: }); sawine@74: sawine@78: $(document).keypress(function(event) { sawine@78: if (event.which == 13) { sawine@74: event.preventDefault(); sawine@74: update_logo(); sawine@74: } sawine@74: }); sawine@74: sawine@74: var menu_width = 670; sawine@77: var menu_height = 100; sawine@77: var menu_splits = new Array(180, 350, 505); sawine@74: sawine@74: var click_events = new Array(); sawine@74: click_events["logo"] = new Array(); sawine@74: click_events["logo"][0] = new Object(); sawine@74: click_events["logo"][0]["min_x"] = 0; sawine@75: click_events["logo"][0]["max_x"] = menu_splits[0]; sawine@74: click_events["logo"][0]["min_y"] = 0; sawine@74: click_events["logo"][0]["max_y"] = menu_height; sawine@74: click_events["logo"][0]["func"] = switch_page; sawine@74: click_events["logo"][0]["args"] = new Array("personalwork.html"); sawine@74: click_events["logo"][1] = new Object(); sawine@75: click_events["logo"][1]["min_x"] = menu_splits[0] + 1; sawine@75: click_events["logo"][1]["max_x"] = menu_splits[1]; sawine@74: click_events["logo"][1]["min_y"] = 0; sawine@74: click_events["logo"][1]["max_y"] = menu_height; sawine@74: click_events["logo"][1]["func"] = switch_page; sawine@74: click_events["logo"][1]["args"] = new Array("howiwork.html"); sawine@74: click_events["logo"][2] = new Object(); sawine@75: click_events["logo"][2]["min_x"] = menu_splits[1] + 1; sawine@75: click_events["logo"][2]["max_x"] = menu_splits[2]; sawine@74: click_events["logo"][2]["min_y"] = 0; sawine@74: click_events["logo"][2]["max_y"] = menu_height; sawine@74: click_events["logo"][2]["func"] = switch_page; sawine@74: click_events["logo"][2]["args"] = new Array("books.html"); sawine@74: click_events["logo"][3] = new Object(); sawine@75: click_events["logo"][3]["min_x"] = menu_splits[2] + 1; sawine@74: click_events["logo"][3]["max_x"] = menu_width - 1; sawine@74: click_events["logo"][3]["min_y"] = 0; sawine@74: click_events["logo"][3]["max_y"] = menu_height; sawine@74: click_events["logo"][3]["func"] = switch_page; sawine@74: click_events["logo"][3]["args"] = new Array("links.html", "linksend.html"); sawine@74: sawine@78: function mouse_pos(event, id) { sawine@78: var offset = $(id).offset(); sawine@77: return new Array(event.pageX - offset.left, sawine@77: event.pageY - offset.top); sawine@77: } sawine@77: sawine@77: function handle_click(event) { sawine@78: var xy = mouse_pos(event, "#logo"); sawine@77: var x = xy[0]; sawine@77: var y = xy[1]; sawine@77: for (var i in click_events[event.target.id]) { sawine@77: var ces = click_events[event.target.id][i]; sawine@74: if (ces && x >= ces["min_x"] && x <= ces["max_x"] sawine@74: && y >= ces["min_y"] && y <= ces["max_y"]) { sawine@77: ces["func"](event.target.id, ces); sawine@74: break; sawine@74: } sawine@74: } sawine@74: } sawine@74: sawine@74: function switch_page(id, params) { sawine@74: var page = params["args"][0]; sawine@74: $("body").load(page); sawine@74: document.location.href = page; sawine@74: } sawine@74: sawine@77: function colour_area(image, min_x, max_x, min_y, max_y, colour) { sawine@74: var pixels = image.data; sawine@74: for (var y = min_y; y <= max_y; y += 1) { sawine@74: for (var x = min_x; x <= max_x; x += 1) { sawine@74: var pix_colour = getPixel(image, x, y); sawine@74: if (pix_colour.a > 0) { sawine@74: colour.a = pix_colour.a; sawine@74: setPixel(image, x, y, colour); sawine@74: } sawine@74: } sawine@77: } sawine@74: } sawine@74: sawine@74: function init_logo(event) { sawine@74: var canvas = document.getElementById("logo"); sawine@77: var context = canvas.getContext("2d"); sawine@74: canvas.width = menu_width; sawine@74: canvas.height = menu_height; sawine@74: context.drawImage(event.target, 0, 0); sawine@78: var image = context.getImageData(0, 0, menu_width, menu_height); sawine@74: for (var i in click_events["logo"]) { sawine@77: var p = click_events["logo"][i]; sawine@77: var min_x = p["min_x"]; sawine@77: var max_x = p["max_x"]; sawine@77: var min_y = p["min_y"]; sawine@77: var max_y = p["max_y"]; sawine@74: var pos = document.location.href.lastIndexOf("/") + 1; sawine@77: var page = document.location.href.substr(pos); sawine@74: for (var j in p["args"]) { sawine@74: if (page == p["args"][j]) { sawine@78: colour_area(image, min_x, max_x, 0, 60, black); sawine@78: colour_area(image, min_x, max_x, 60, max_y, white); sawine@74: break; sawine@74: } sawine@78: else { sawine@78: colour_area(image, min_x, max_x, 0, 60, white); sawine@78: colour_area(image, min_x, max_x, 60, max_y, orange); sawine@78: } sawine@78: } sawine@77: } sawine@78: context.putImageData(image, 0, 0); sawine@77: // context.fillStyle = green.str(); sawine@77: // console.log((found["max_x"] - found["min_x"]) / 2 + found["min_x"] - 2); sawine@77: // context.fillRect((found["max_x"]-found["min_x"])/2+found["min_x"]-1, 95, 2, 5); sawine@80: draw_menu_lines(); sawine@75: } sawine@75: sawine@80: function draw_menu_lines() { sawine@75: var canvas = document.getElementById("logo"); sawine@75: var context = canvas.getContext("2d"); sawine@75: var image = context.getImageData(0, 0, menu_width, menu_height); sawine@75: var pixels = image.data; sawine@75: context.lineCap = "round"; sawine@75: context.lineWidth = 1; sawine@75: var colour1a = new Colour(0, 0, 0, 0.1); sawine@75: context.beginPath(); sawine@75: context.moveTo(0, menu_height - 1); sawine@75: context.lineTo(menu_width - 1, menu_height - 1); sawine@75: context.closePath(); sawine@75: context.strokeStyle = colour1a.str(); sawine@76: context.stroke(); sawine@76: var colour1e = new Colour(0, 0, 0, 0.05); sawine@76: context.beginPath(); sawine@76: context.moveTo(70, menu_height - 1); sawine@76: context.lineTo(menu_width - 71, menu_height - 1); sawine@76: context.closePath(); sawine@76: context.strokeStyle = colour1e.str(); sawine@76: context.stroke(); sawine@76: var colour1b = new Colour(0, 0, 0, 0.05); sawine@75: context.beginPath(); sawine@75: context.moveTo(50, menu_height - 1); sawine@75: context.lineTo(menu_width - 51, menu_height - 1); sawine@75: context.closePath(); sawine@75: context.strokeStyle = colour1b.str(); sawine@75: context.stroke(); sawine@75: var colour1c = new Colour(0, 0, 0, 0.05); sawine@75: context.beginPath(); sawine@75: context.moveTo(25, menu_height - 1); sawine@75: context.lineTo(menu_width - 26, menu_height - 1); sawine@75: context.closePath(); sawine@75: context.strokeStyle = colour1c.str(); sawine@75: context.stroke(); sawine@75: var colour1d = new Colour(0, 0, 0, 0.05); sawine@75: context.beginPath(); sawine@75: context.moveTo(10, menu_height - 1); sawine@75: context.lineTo(menu_width - 11, menu_height - 1); sawine@75: context.closePath(); sawine@75: context.strokeStyle = colour1d.str(); sawine@75: context.stroke(); sawine@75: sawine@75: var colour2 = new Colour(0, 0, 0, 0.2); sawine@75: context.beginPath(); sawine@75: context.moveTo(menu_splits[0], 0); sawine@75: context.lineTo(menu_splits[0], menu_height - 1); sawine@75: context.moveTo(menu_splits[1], 0); sawine@75: context.lineTo(menu_splits[1], menu_height - 1); sawine@75: context.moveTo(menu_splits[2], 0); sawine@75: context.lineTo(menu_splits[2], menu_height - 1); sawine@75: context.closePath(); sawine@75: context.strokeStyle = colour2.str(); sawine@75: context.stroke(); sawine@75: sawine@75: context.clearRect(menu_splits[0] - 1, menu_height - 1, 2, 2); sawine@75: context.clearRect(menu_splits[1] - 1, menu_height - 1, 2, 2); sawine@75: context.clearRect(menu_splits[2] - 1, menu_height - 1, 2, 2); sawine@76: sawine@76: context.clearRect(menu_splits[0] - 1, menu_height - 2, 1, 1); sawine@76: context.clearRect(menu_splits[1] - 1, menu_height - 2, 1, 1); sawine@76: context.clearRect(menu_splits[2] - 1, menu_height - 2, 1, 1); sawine@75: } sawine@75: sawine@75: function clearMenuLines() { sawine@75: var canvas = document.getElementById("logo"); sawine@75: var context = canvas.getContext("2d"); sawine@75: var image = context.getImageData(0, 0, menu_width, menu_height); sawine@75: var pixels = image.data; sawine@75: context.clearRect(0, menu_height - 2, menu_width - 1, 2); sawine@75: context.clearRect(menu_splits[0] - 1, 0, 2, menu_height - 1); sawine@75: context.clearRect(menu_splits[1] - 1, 0, 2, menu_height - 1); sawine@75: context.clearRect(menu_splits[2] - 1, 0, 2, menu_height - 1); sawine@74: } sawine@74: sawine@80: function draw_sim_lines() { sawine@80: var w = 670; sawine@80: var h = 50; sawine@80: var canvas = document.getElementById("sim"); sawine@80: var context = canvas.getContext("2d"); sawine@80: var image = context.getImageData(0, 0, w, h); sawine@80: var pixels = image.data; sawine@80: context.lineCap = "round"; sawine@80: context.lineWidth = 1; sawine@80: var colour1a = new Colour(0, 0, 0, 0.1); sawine@80: context.beginPath(); sawine@80: context.moveTo(0, h - 1); sawine@80: context.lineTo(w - 1, h - 1); sawine@80: context.closePath(); sawine@80: context.strokeStyle = colour1a.str(); sawine@80: context.stroke(); sawine@82: var colour1e = new Colour(0, 0, 0, 0.05); sawine@82: context.beginPath(); sawine@82: context.moveTo(70, h - 1); sawine@82: context.lineTo(w - 71, h - 1); sawine@82: context.closePath(); sawine@82: context.strokeStyle = colour1e.str(); sawine@82: context.stroke(); sawine@80: var colour1b = new Colour(0, 0, 0, 0.05); sawine@80: context.beginPath(); sawine@80: context.moveTo(50, h - 1); sawine@80: context.lineTo(w - 51, h - 1); sawine@80: context.closePath(); sawine@80: context.strokeStyle = colour1b.str(); sawine@80: context.stroke(); sawine@82: var colour1c = new Colour(0, 0, 0, 0.05); sawine@82: context.beginPath(); sawine@82: context.moveTo(25, h - 1); sawine@82: context.lineTo(w - 26, h - 1); sawine@82: context.closePath(); sawine@82: context.strokeStyle = colour1c.str(); sawine@82: context.stroke(); sawine@80: var colour1d = new Colour(0, 0, 0, 0.05); sawine@80: context.beginPath(); sawine@80: context.moveTo(10, h - 1); sawine@80: context.lineTo(w - 11, h - 1); sawine@80: context.closePath(); sawine@80: context.strokeStyle = colour1d.str(); sawine@80: context.stroke(); sawine@80: } sawine@80: sawine@74: function update_logo() { sawine@74: var canvas = document.getElementById("logo"); sawine@74: var context = canvas.getContext("2d"); sawine@74: var image = context.getImageData(0, 0, menu_width, menu_height); sawine@74: var pixels = image.data; sawine@74: var white = new Colour(255, 255, 255); sawine@74: for (var y = 0; y < menu_height; y += 1) { sawine@74: for (var x = 0; x < menu_width; x += 1) { sawine@74: var pix_colour = getPixel(image, x, y); sawine@74: if (pix_colour.a > 0) { sawine@74: setPixel(image, x, y, new Colour(90, 215, 21, pix_colour.a)); sawine@74: } sawine@74: } sawine@74: } sawine@74: context.putImageData(image, 0, 0); sawine@74: } sawine@74: sawine@84: var char_map = new Array(); sawine@84: char_map["A"] = new Array(new Array(0, 4), new Array(1, 3), sawine@84: new Array(2, 2), new Array(3, 1), sawine@84: new Array(4, 0), new Array(5, 1), sawine@84: new Array(6, 2), new Array(7, 3), sawine@84: new Array(8, 4), new Array(2, 3), sawine@84: new Array(3, 3), new Array(4, 3), sawine@84: new Array(5, 3), new Array(6, 3)); sawine@84: char_map["M"] = new Array(new Array(0, 4), new Array(0, 3), sawine@84: new Array(0, 2), new Array(0, 1), sawine@84: new Array(0, 0), new Array(0, 5), sawine@84: new Array(5, 4), new Array(5, 3), sawine@84: new Array(5, 2), new Array(5, 1), sawine@84: new Array(5, 0), new Array(5, 5), sawine@84: new Array(1, 1), new Array(2, 2), sawine@84: new Array(4, 2), new Array(5, 1), sawine@84: new Array(3, 3)); sawine@84: char_map["E"] = new Array(new Array(0, 4), new Array(0, 3), sawine@84: new Array(0, 2), new Array(0, 1), sawine@84: new Array(0, 0), new Array(0, 5), sawine@84: new Array(1, 0), new Array(2, 0), sawine@84: new Array(3, 0), sawine@84: new Array(1, 3), new Array(2, 3), sawine@84: new Array(1, 5), new Array(2, 5), sawine@84: new Array(3, 5)) sawine@84: char_map["7"] = new Array(new Array(0, 0), new Array(1, 0), sawine@84: new Array(2, 0), sawine@84: new Array(0, 5), new Array(0, 4), sawine@84: new Array(1, 3), new Array(2, 2)); sawine@84: char_map["3"] = new Array(new Array(2, 4), new Array(2, 3), sawine@84: new Array(2, 2), new Array(2, 1), sawine@84: new Array(0, 0), new Array(0, 5), sawine@84: new Array(1, 0), new Array(2, 0), sawine@84: new Array(1, 3), new Array(2, 3), sawine@84: new Array(1, 5), new Array(2, 5)) sawine@84: sawine@84: function init_gameoflife(text) { sawine@81: var canvas = document.getElementById("gameoflife"); sawine@84: var cell_size = 16; sawine@81: if (canvas) { sawine@84: gameoflife = new Simulation(canvas, 670, 670, cell_size, sawine@82: green, black); sawine@80: $("#gameoflife").mousemove(function(event) { sawine@80: gameoflife.mouse_moved(mouse_pos(event, "#gameoflife")); sawine@84: }); sawine@84: text = "ME73"; sawine@84: var offset = new Array(13, 17); sawine@84: for (var c in text) { sawine@84: var w = 0; sawine@84: for (p in char_map[text[c]]) { sawine@84: var x = char_map[text[c]][p][0]; sawine@84: var y = char_map[text[c]][p][1]; sawine@84: w = Math.max(w, x); sawine@84: var pos = new Array((x + offset[0]) * cell_size, sawine@84: (y + offset[1]) * cell_size); sawine@84: gameoflife.activate_cell(pos); sawine@84: } sawine@84: offset[0] += w + 2; sawine@84: } sawine@84: } sawine@80: } sawine@80: sawine@74: function Colour(r, g, b, a) { sawine@74: this.r = r; sawine@74: this.g = g; sawine@74: this.b = b; sawine@77: this.a = a == undefined ? 255 : a; sawine@74: } sawine@74: Colour.prototype.equals = function(rhs) { sawine@74: for (p in this) { sawine@74: if (typeof(rhs[p]) == undefined sawine@74: || this[p] != rhs[p]) { sawine@74: return false; sawine@74: } sawine@74: } sawine@74: return true; sawine@74: } sawine@75: Colour.prototype.str = function() { sawine@75: return "rgba(" + this.r + "," + this.g + "," + this.b + "," + this.a + ")"; sawine@75: } sawine@74: sawine@78: var white = new Colour(255, 255, 255); sawine@78: var black = new Colour(0, 0, 0); sawine@78: var orange = new Colour(201, 87, 35); sawine@78: var green = new Colour(90, 215, 21); sawine@78: var background = new Colour(34, 34, 34); sawine@78: sawine@77: function setPixel(image, x, y, colour) { sawine@74: var index = 4 * (x + y * image.width); sawine@77: image.data[index] = colour.r; sawine@77: image.data[index + 1] = colour.g; sawine@77: image.data[index + 2] = colour.b; sawine@77: image.data[index + 3] = colour.a; sawine@74: } sawine@74: sawine@74: function getPixel(image, x, y) { sawine@74: var index = 4 * (x + y * image.width); sawine@74: var r = image.data[index]; sawine@74: var g = image.data[index + 1]; sawine@74: var b = image.data[index + 2]; sawine@74: var a = image.data[index + 3]; sawine@74: return new Colour(r, g, b, a); sawine@74: } sawine@74: sawine@74: function load_random_quote() { sawine@74: var file = "/quotes/quote" + Math.floor(Math.random() * QUOTES_NUMBER + 1) + ".html"; sawine@74: $.ajax({url: SERVER + file, sawine@74: success: write_quote}); sawine@74: } sawine@74: sawine@74: function write_quote(data, status, xhr) { sawine@74: $("#random_quote").html(data); sawine@74: } sawine@74: sawine@74: function load_footer() sawine@74: { sawine@74: var file = "/footer.html"; sawine@74: var currentFile = self.location.hostname + self.location.pathname; sawine@74: var request = http_request_object(); sawine@74: var url = "http://" + self.location.hostname + file; sawine@74: request.open("GET", url, false); sawine@74: request.setRequestHeader("User-Agent", navigator.userAgent); sawine@74: request.send(null) sawine@74: // if (oRequest.status == 200) alert(oRequest.responseText); sawine@74: // else alert("Error executing XMLHttpRequest call!"); sawine@74: //document.write(url); sawine@74: //document.write(request.responseText); sawine@74: document.getElementById('footer').innerHTML = request.responseText; sawine@74: } sawine@74: sawine@74: sawine@74: sawine@74: // Mandelbrot functions sawine@74: function Complex(real, imag) sawine@74: { sawine@74: this.real = real; sawine@74: this.imag = imag; sawine@74: } sawine@74: sawine@74: var MIN_C = new Complex(-2.2, -1.4); sawine@74: var MAX_C = new Complex(1.0, 1.4); sawine@74: var min_c = MIN_C; sawine@74: var max_c = MAX_C; sawine@74: var MIN_ITER = 100; sawine@74: var max_iter = MIN_ITER; sawine@74: var zoom = 1.0; sawine@74: var resolution = 3; sawine@74: var bailout = 4.0; sawine@74: sawine@74: function Result(z, iter) sawine@74: { sawine@74: this.z = z; sawine@74: this.iter = iter; sawine@74: } sawine@74: sawine@74: function complex_quad(c) sawine@74: { sawine@74: return new Complex(Math.pow(c.real, 2) - Math.pow(c.imag, 2), sawine@74: 2.0 * c.real * c.imag); sawine@74: } sawine@74: sawine@74: function complex_quad_value(c) sawine@74: { sawine@74: return Math.pow(c.real, 2) + Math.pow(c.imag, 2); sawine@74: } sawine@74: sawine@74: function complex_add(c1, c2) sawine@74: { sawine@74: return new Complex(c1.real + c2.real, c1.imag + c2.imag); sawine@74: } sawine@74: sawine@74: function complex_equal(c1, c2) sawine@74: { sawine@74: return (c1.real == c2.real) && (c1.imag == c2.imag); sawine@74: } sawine@74: sawine@74: function iterate(z, c) sawine@74: { sawine@74: z_quad = complex_quad(z); sawine@74: return new Complex(z_quad.real + c.real, z_quad.imag + c.imag); sawine@74: } sawine@74: sawine@74: function test(c, max_iter) sawine@74: { sawine@74: var iter = 0; sawine@74: var z = new Complex(0.0, 0.0); sawine@74: var last_z = new Complex(-1.0, 0.0); sawine@74: var quad_z = complex_quad_value(z); sawine@74: sawine@74: while (iter < max_iter sawine@74: && !complex_equal(z, last_z) sawine@74: && quad_z <= bailout) sawine@74: { sawine@74: last_z = z; sawine@74: z = iterate(z, c); sawine@74: quad_z = complex_quad_value(z); sawine@74: iter++; sawine@74: } sawine@74: return new Result(quad_z, iter); sawine@74: } sawine@74: sawine@74: function draw(diter, dx, dy, dz, dres) sawine@74: { sawine@74: var canvas = document.getElementById('mandelbrot'); sawine@74: sawine@74: if (canvas.getContext) sawine@74: { sawine@74: zoom += dz; sawine@74: var ctx = canvas.getContext('2d'); sawine@74: sawine@74: if (dres != 0) sawine@74: { sawine@74: resolution = Math.max(1, resolution + dres); sawine@74: } sawine@74: sawine@74: if (diter != 0) sawine@74: { sawine@74: max_iter = Math.max(MIN_ITER, max_iter + diter); sawine@74: } sawine@74: sawine@74: var red = "rgb(255, 0, 0)"; sawine@74: var white = "rgb(255, 255, 255)"; sawine@74: var width = canvas.width; sawine@74: var height = canvas.height; sawine@74: var dim = Math.max(width, height); sawine@74: var dim_ratio = Math.round(width / height); sawine@74: var diff_c = new Complex(max_c.real - min_c.real, sawine@74: max_c.imag - min_c.imag); sawine@74: dx_min = diff_c.real / 100 * (dx + dz); sawine@74: dx_max = diff_c.real / 100 * (dx - dz); sawine@74: sawine@74: dy_min = diff_c.imag / 100 * (dy + dz); sawine@74: dy_max = diff_c.imag / 100 * (dy - dz); sawine@74: sawine@74: var min_inc = new Complex(dx_min * dim_ratio / 2.0, dy_min); sawine@74: var max_inc = new Complex(dx_max * dim_ratio / 2.0, dy_max); sawine@74: min_c = complex_add(min_c, min_inc); sawine@74: max_c = complex_add(max_c, max_inc); sawine@74: diff_c = new Complex(max_c.real - min_c.real, sawine@74: max_c.imag - min_c.imag); sawine@74: sawine@74: for (var y = 0; y < height; y += resolution) sawine@74: { sawine@74: for (var x = 0; x < width; x += resolution) sawine@74: { sawine@74: var c = new Complex(min_c.real + diff_c.real / dim * x, sawine@74: min_c.imag + diff_c.imag / dim * y); sawine@74: var result = test(c, max_iter); sawine@74: var r = Math.min(255, Math.pow(Math.max(0, sawine@74: (result.iter - max_iter / 20.0)), 2)); sawine@74: var g = Math.min(255, Math.pow(Math.max(0, sawine@74: (result.iter - max_iter / 25.0)), 2)); sawine@74: var b = Math.min(255, Math.pow(Math.max(0, sawine@74: (result.iter - max_iter / 20.0)), 2)); sawine@74: var colour = "rgb(" + r + "," + g + "," + b + ")"; sawine@74: ctx.fillStyle = colour; sawine@74: ctx.fillRect(x, y, resolution, resolution); sawine@74: } sawine@74: } sawine@74: } sawine@74: } sawine@74: sawine@74: function getEventOffsetX(evt) sawine@74: { sawine@74: if (evt.offsetX != null) sawine@74: return evt.offsetX; sawine@74: sawine@74: var obj = evt.target || evt.srcElement; sawine@74: setPageTopLeft(obj); sawine@74: return (evt.clientX - obj.pageLeft); sawine@74: } sawine@74: sawine@74: function getEventOffsetY(evt) sawine@74: { sawine@74: if (evt.offsetY != null) sawine@74: return evt.offsetY; sawine@74: sawine@74: var obj = evt.target || evt.srcElement; sawine@74: setPageTopLeft(obj); sawine@74: return (evt.clientY - obj.pageTop); sawine@74: } sawine@74: sawine@74: function setPageTopLeft( o ) sawine@74: { sawine@74: var top = 0, sawine@74: left = 0, sawine@74: obj = o; sawine@74: sawine@74: while (o.offsetParent) sawine@74: { sawine@74: left += o.offsetLeft ; sawine@74: top += o.offsetTop ; sawine@74: o = o.offsetParent ; sawine@74: }; sawine@74: sawine@74: obj.pageTop = top; sawine@74: obj.pageLeft = left; sawine@74: } sawine@74: sawine@78: function draw2(evt) { sawine@78: var iter = 0; sawine@78: var res = 0; sawine@78: var x = (getEventOffsetX(evt) - 335) / 167.5; sawine@74: var y = (getEventOffsetY(evt) - 140) / 70; sawine@78: var z = 0; sawine@78: draw(iter, x, y, z, res); sawine@74: } sawine@74: sawine@78: function update() { sawine@78: simulation.update(); sawine@78: simulation.draw(); sawine@80: if (gameoflife) { sawine@80: gameoflife.update(); sawine@80: gameoflife.draw(); sawine@80: } sawine@78: } sawine@74: sawine@78: function Grid(width, height, cell_size) { sawine@82: this.width = parseInt(width / cell_size + 0.5); sawine@82: this.height = parseInt(height / cell_size + 0.5); sawine@78: this.canvas_width = width; sawine@78: this.canvas_height = height; sawine@78: this.cell_size = cell_size; sawine@78: this.cells = new Array(); sawine@78: for (var y = 0; y < this.height; ++y) { sawine@78: this.cells[y] = new Array(); sawine@78: for (var x = 0; x < this.width; ++x) { sawine@78: this.cells[y][x] = new Cell(x, y, 0, this); sawine@78: } sawine@78: } sawine@78: } sawine@78: Grid.prototype.cell = function(x, y) { sawine@78: return this.cells[y][x]; sawine@78: } sawine@78: Grid.prototype.pick_cell = function(x, y) { sawine@80: var lx = parseInt(x / this.cell_size - 0.5); sawine@80: var ly = parseInt(y / this.cell_size - 0.5); sawine@78: return this.cells[ly][lx]; sawine@78: } sawine@78: sawine@78: function Cell(x, y, value, grid) { sawine@78: this.x = x; sawine@78: this.y = y; sawine@78: this.canvas_x = x * grid.cell_size; sawine@78: this.canvas_y = y * grid.cell_size; sawine@78: this.value = value; sawine@78: this.grid = grid; sawine@78: this._neighbours = new Array(); sawine@78: this.last_mod = 0; sawine@78: } sawine@78: Cell.prototype.hash = function() { sawine@78: return this.x + ", " + this.y; sawine@78: } sawine@78: Cell.prototype.set_value = function(value) { sawine@78: this.value = value; sawine@78: this.last_mod = $.now(); sawine@78: } sawine@78: Cell.prototype.neighbours = function() { sawine@78: if (this._neighbours.length) { sawine@78: return this._neighbours; sawine@78: } sawine@78: if (this.x > 0) { sawine@78: this._neighbours.push(this.grid.cell(this.x-1, this.y)); sawine@78: if (this.y > 0) { sawine@78: this._neighbours.push(this.grid.cell(this.x-1, this.y-1)); sawine@78: this._neighbours.push(this.grid.cell(this.x, this.y-1)); sawine@78: } sawine@78: if (this.y + 1 < this.grid.height) { sawine@78: this._neighbours.push(this.grid.cell(this.x-1, this.y+1)); sawine@78: } sawine@83: } sawine@78: if (this.x + 1 < this.grid.width) { sawine@78: this._neighbours.push(this.grid.cell(this.x+1, this.y)); sawine@78: if (this.y + 1 < this.grid.height) { sawine@78: this._neighbours.push(this.grid.cell(this.x+1, this.y+1)); sawine@78: this._neighbours.push(this.grid.cell(this.x, this.y+1)); sawine@78: } sawine@78: if (this.y > 0) { sawine@78: this._neighbours.push(this.grid.cell(this.x+1, this.y-1)); sawine@78: } sawine@78: } sawine@78: return this._neighbours; sawine@78: } sawine@78: Cell.prototype.density = function() { sawine@78: var d = 0; sawine@78: var neighbours = this.neighbours(); sawine@78: for (var n in neighbours) { sawine@78: d += neighbours[n].value; sawine@78: } sawine@78: return d; sawine@78: } sawine@78: sawine@82: function Simulation(canvas, w, h, cell_size, life_colour, dead_colour) { sawine@84: this.last_update = $.now() + 3000; sawine@78: this.last_draw = 0; sawine@78: this.last_mouse_moved = 0; sawine@78: this.redraw = new Array(); sawine@78: this.canvas = canvas; sawine@80: this.canvas.width = w; sawine@80: this.canvas.height = h; sawine@78: this.context = canvas.getContext("2d"); sawine@78: this.pos_queue = new Array(); sawine@78: this.cell_queue = new Array(); sawine@81: this.cell_size = cell_size; sawine@82: this.life_colour = life_colour; sawine@82: this.dead_colour = dead_colour; sawine@78: this.grid = new Grid(this.canvas.width, this.canvas.height, cell_size); sawine@80: draw_sim_lines(); sawine@78: } sawine@78: Simulation.prototype.draw = function() { sawine@78: var now = $.now(); sawine@79: if (this.redraw.length) { sawine@83: var cell = this.redraw[0]; sawine@83: this.redraw.shift(); sawine@82: this.context.fillStyle = cell.value == 1 ? sawine@82: this.life_colour.str() : this.dead_colour.str(); sawine@78: this.context.fillRect(cell.canvas_x, cell.canvas_y, sawine@78: this.grid.cell_size, this.grid.cell_size); sawine@78: this.last_draw = $.now(); sawine@78: } sawine@78: } sawine@78: Simulation.prototype.update = function() { sawine@78: var now = $.now(); sawine@84: while (this.pos_queue.length) { sawine@83: var pos = this.pos_queue.pop(); sawine@78: if (pos[0] < this.canvas.width sawine@78: && pos[1] < this.canvas.height) { sawine@78: var cell = this.grid.pick_cell(pos[0], pos[1]); sawine@78: cell.set_value(1); sawine@78: this.cell_queue.push(cell); sawine@78: this.cell_queue.concat(cell.neighbours()); sawine@83: this.redraw.unshift(cell); sawine@78: } sawine@78: } sawine@79: if (this.last_update + 1000 > now) { sawine@78: return; sawine@78: } sawine@78: var changed = new Array(); sawine@79: var next_cell_queue = new Array(); sawine@79: while (this.cell_queue.length) { sawine@83: var cell = this.cell_queue.pop(); sawine@79: if (changed[cell.hash()]) { sawine@79: continue; sawine@78: } sawine@78: var d = cell.density(); sawine@78: if (d == 3 && cell.value == 0) { sawine@79: changed[cell.hash()] = cell; sawine@79: next_cell_queue = next_cell_queue.concat(cell.neighbours()); sawine@78: } else if (cell.value == 1) { sawine@78: if (d < 2 || d > 3) { sawine@78: changed[cell.hash()] = cell; sawine@79: next_cell_queue = next_cell_queue.concat(cell.neighbours()); sawine@78: } sawine@78: } sawine@78: } sawine@78: for (var pos in changed) { sawine@78: var cell = changed[pos]; sawine@78: cell.set_value(1 - cell.value); sawine@78: this.redraw.push(cell); sawine@78: } sawine@83: this.cell_queue = next_cell_queue; sawine@78: this.last_update = now; sawine@78: } sawine@84: Simulation.prototype.activate_cell = function(pos) { sawine@84: this.pos_queue.push(pos); sawine@84: } sawine@78: Simulation.prototype.mouse_moved = function(pos) { sawine@78: var now = $.now(); sawine@84: if (this.last_mouse_moved + 50 < now) { sawine@84: this.pos_queue.push(pos); sawine@78: this.last_mouse_moved = now; sawine@78: } sawine@78: } sawine@78: sawine@78: