sawine@105
|
1 |
var QUOTES_NUMBER = 42;
|
sawine@78
|
2 |
var SERVER = "http://" + window.location.hostname + ":" + window.location.port;
|
sawine@78
|
3 |
var simulation;
|
sawine@80
|
4 |
var gameoflife;
|
sawine@72
|
5 |
|
sawine@78
|
6 |
$(document).ready(function() {
|
sawine@82
|
7 |
simulation = new Simulation(document.getElementById("sim"),
|
sawine@85
|
8 |
670, 50, 6, green, background);
|
sawine@72
|
9 |
var image = new Image();
|
sawine@72
|
10 |
image.onload = init_logo;
|
sawine@72
|
11 |
image.src = "images/logobase.png";
|
sawine@72
|
12 |
$("#logo").click(handle_click);
|
sawine@89
|
13 |
$("#logo").hover(function(event) {
|
sawine@75
|
14 |
$(this).css("cursor", "pointer");
|
sawine@72
|
15 |
}, function() {
|
sawine@72
|
16 |
$(this).css("cursor", "auto");
|
sawine@77
|
17 |
});
|
sawine@89
|
18 |
$("#logo").mousemove(function(event) { handle_hover(event); });
|
sawine@89
|
19 |
$("#logo").mouseout(function(event) { handle_mouse_out(event); });
|
sawine@79
|
20 |
$("#sim").mousemove(function(event) { simulation.mouse_moved(mouse_pos(event, "#sim")); });
|
sawine@78
|
21 |
var onEachFrame;
|
sawine@78
|
22 |
if (window.webkitRequestAnimationFrame) {
|
sawine@78
|
23 |
onEachFrame = function(cb) {
|
sawine@78
|
24 |
var _cb = function() { cb(); webkitRequestAnimationFrame(_cb); }
|
sawine@78
|
25 |
_cb();
|
sawine@78
|
26 |
};
|
sawine@78
|
27 |
} else if (window.mozRequestAnimationFrame) {
|
sawine@78
|
28 |
onEachFrame = function(cb) {
|
sawine@78
|
29 |
var _cb = function() { cb(); mozRequestAnimationFrame(_cb); }
|
sawine@78
|
30 |
_cb();
|
sawine@78
|
31 |
};
|
sawine@78
|
32 |
} else {
|
sawine@78
|
33 |
onEachFrame = function(cb) {
|
sawine@78
|
34 |
setInterval(cb, 1000 / 30);
|
sawine@78
|
35 |
}
|
sawine@78
|
36 |
}
|
sawine@78
|
37 |
window.onEachFrame = onEachFrame;
|
sawine@81
|
38 |
window.onEachFrame(update);
|
sawine@81
|
39 |
var pos = document.location.href.lastIndexOf("/") + 1;
|
sawine@81
|
40 |
var page = document.location.href.substr(pos);
|
sawine@84
|
41 |
if (page == "mandelbrot.html") {
|
sawine@81
|
42 |
draw(0, 0, 0, 0, 0);
|
sawine@87
|
43 |
} else if (page == "" || page == "index.html") {
|
sawine@87
|
44 |
init_gameoflife("ME73");
|
sawine@88
|
45 |
} else if (page == "gameoflife.html") {
|
sawine@94
|
46 |
init_gameoflife("");
|
sawine@88
|
47 |
}
|
sawine@72
|
48 |
});
|
sawine@72
|
49 |
|
sawine@78
|
50 |
$(document).keypress(function(event) {
|
sawine@78
|
51 |
if (event.which == 13) {
|
sawine@72
|
52 |
event.preventDefault();
|
sawine@72
|
53 |
update_logo();
|
sawine@72
|
54 |
}
|
sawine@72
|
55 |
});
|
sawine@72
|
56 |
|
sawine@72
|
57 |
var menu_width = 670;
|
sawine@77
|
58 |
var menu_height = 100;
|
sawine@77
|
59 |
var menu_splits = new Array(180, 350, 505);
|
sawine@72
|
60 |
|
sawine@72
|
61 |
var click_events = new Array();
|
sawine@72
|
62 |
click_events["logo"] = new Array();
|
sawine@72
|
63 |
click_events["logo"][0] = new Object();
|
sawine@72
|
64 |
click_events["logo"][0]["min_x"] = 0;
|
sawine@75
|
65 |
click_events["logo"][0]["max_x"] = menu_splits[0];
|
sawine@72
|
66 |
click_events["logo"][0]["min_y"] = 0;
|
sawine@72
|
67 |
click_events["logo"][0]["max_y"] = menu_height;
|
sawine@72
|
68 |
click_events["logo"][0]["func"] = switch_page;
|
sawine@74
|
69 |
click_events["logo"][0]["args"] = new Array("personalwork.html");
|
sawine@72
|
70 |
click_events["logo"][1] = new Object();
|
sawine@75
|
71 |
click_events["logo"][1]["min_x"] = menu_splits[0] + 1;
|
sawine@75
|
72 |
click_events["logo"][1]["max_x"] = menu_splits[1];
|
sawine@72
|
73 |
click_events["logo"][1]["min_y"] = 0;
|
sawine@72
|
74 |
click_events["logo"][1]["max_y"] = menu_height;
|
sawine@72
|
75 |
click_events["logo"][1]["func"] = switch_page;
|
sawine@74
|
76 |
click_events["logo"][1]["args"] = new Array("howiwork.html");
|
sawine@72
|
77 |
click_events["logo"][2] = new Object();
|
sawine@75
|
78 |
click_events["logo"][2]["min_x"] = menu_splits[1] + 1;
|
sawine@75
|
79 |
click_events["logo"][2]["max_x"] = menu_splits[2];
|
sawine@72
|
80 |
click_events["logo"][2]["min_y"] = 0;
|
sawine@72
|
81 |
click_events["logo"][2]["max_y"] = menu_height;
|
sawine@72
|
82 |
click_events["logo"][2]["func"] = switch_page;
|
sawine@74
|
83 |
click_events["logo"][2]["args"] = new Array("books.html");
|
sawine@72
|
84 |
click_events["logo"][3] = new Object();
|
sawine@75
|
85 |
click_events["logo"][3]["min_x"] = menu_splits[2] + 1;
|
sawine@72
|
86 |
click_events["logo"][3]["max_x"] = menu_width - 1;
|
sawine@72
|
87 |
click_events["logo"][3]["min_y"] = 0;
|
sawine@72
|
88 |
click_events["logo"][3]["max_y"] = menu_height;
|
sawine@72
|
89 |
click_events["logo"][3]["func"] = switch_page;
|
sawine@74
|
90 |
click_events["logo"][3]["args"] = new Array("links.html", "linksend.html");
|
sawine@72
|
91 |
|
sawine@78
|
92 |
function mouse_pos(event, id) {
|
sawine@78
|
93 |
var offset = $(id).offset();
|
sawine@77
|
94 |
return new Array(event.pageX - offset.left,
|
sawine@77
|
95 |
event.pageY - offset.top);
|
sawine@77
|
96 |
}
|
sawine@77
|
97 |
|
sawine@77
|
98 |
function handle_click(event) {
|
sawine@78
|
99 |
var xy = mouse_pos(event, "#logo");
|
sawine@77
|
100 |
var x = xy[0];
|
sawine@77
|
101 |
var y = xy[1];
|
sawine@77
|
102 |
for (var i in click_events[event.target.id]) {
|
sawine@77
|
103 |
var ces = click_events[event.target.id][i];
|
sawine@72
|
104 |
if (ces && x >= ces["min_x"] && x <= ces["max_x"]
|
sawine@72
|
105 |
&& y >= ces["min_y"] && y <= ces["max_y"]) {
|
sawine@77
|
106 |
ces["func"](event.target.id, ces);
|
sawine@89
|
107 |
last_colours[0] = black;
|
sawine@72
|
108 |
break;
|
sawine@72
|
109 |
}
|
sawine@72
|
110 |
}
|
sawine@72
|
111 |
}
|
sawine@72
|
112 |
|
sawine@89
|
113 |
function handle_hover(event) {
|
sawine@89
|
114 |
var xy = mouse_pos(event, "#logo");
|
sawine@89
|
115 |
var x = xy[0];
|
sawine@89
|
116 |
var y = xy[1];
|
sawine@89
|
117 |
for (var i in click_events[event.target.id]) {
|
sawine@89
|
118 |
var ces = click_events[event.target.id][i];
|
sawine@89
|
119 |
if (ces && x >= ces["min_x"] && x <= ces["max_x"]
|
sawine@89
|
120 |
&& y >= ces["min_y"] && y <= ces["max_y"]) {
|
sawine@89
|
121 |
highlight_menu(event.target.id, ces);
|
sawine@89
|
122 |
break;
|
sawine@89
|
123 |
}
|
sawine@89
|
124 |
}
|
sawine@89
|
125 |
}
|
sawine@89
|
126 |
|
sawine@89
|
127 |
function handle_mouse_out(event) {
|
sawine@89
|
128 |
highlight_menu(event.target.id, null);
|
sawine@89
|
129 |
}
|
sawine@89
|
130 |
|
sawine@72
|
131 |
function switch_page(id, params) {
|
sawine@74
|
132 |
var page = params["args"][0];
|
sawine@72
|
133 |
$("body").load(page);
|
sawine@72
|
134 |
document.location.href = page;
|
sawine@72
|
135 |
}
|
sawine@92
|
136 |
|
sawine@89
|
137 |
var last_highlight;
|
sawine@89
|
138 |
var last_colours = new Array();
|
sawine@92
|
139 |
|
sawine@89
|
140 |
function highlight_menu(id, p) {
|
sawine@89
|
141 |
if (last_highlight == p) {
|
sawine@89
|
142 |
return;
|
sawine@89
|
143 |
}
|
sawine@89
|
144 |
var canvas = document.getElementById("logo");
|
sawine@89
|
145 |
var context = canvas.getContext("2d");
|
sawine@89
|
146 |
var image = context.getImageData(0, 0, menu_width, menu_height);
|
sawine@89
|
147 |
if (last_highlight && last_colours && last_colours[0] && last_colours[1]) {
|
sawine@89
|
148 |
page = last_highlight["args"][0];
|
sawine@89
|
149 |
min_x = last_highlight["min_x"];
|
sawine@89
|
150 |
max_x = last_highlight["max_x"];
|
sawine@89
|
151 |
min_y = last_highlight["min_y"];
|
sawine@90
|
152 |
max_y = last_highlight["max_y"];
|
sawine@90
|
153 |
colour_area(image, min_x + 10, max_x - 10, 0, 60,
|
sawine@90
|
154 |
last_colours[0]);
|
sawine@90
|
155 |
colour_area(image, min_x + 10, max_x - 10, 60, max_y - 10,
|
sawine@90
|
156 |
last_colours[1]);
|
sawine@89
|
157 |
}
|
sawine@90
|
158 |
if (p) {
|
sawine@90
|
159 |
var page = p["args"][0];
|
sawine@90
|
160 |
var min_x = p["min_x"];
|
sawine@90
|
161 |
var max_x = p["max_x"];
|
sawine@90
|
162 |
var min_y = p["min_y"];
|
sawine@90
|
163 |
var max_y = p["max_y"];
|
sawine@90
|
164 |
last_colours[0] = colour_area(image, min_x + 10, max_x - 10, 0, 60,
|
sawine@90
|
165 |
orange);
|
sawine@90
|
166 |
last_colours[1] = colour_area(image, min_x + 10, max_x - 10, 60, max_y - 10,
|
sawine@92
|
167 |
white);
|
sawine@90
|
168 |
}
|
sawine@90
|
169 |
|
sawine@89
|
170 |
context.putImageData(image, 0, 0);
|
sawine@89
|
171 |
last_highlight = p;
|
sawine@89
|
172 |
}
|
sawine@72
|
173 |
|
sawine@77
|
174 |
function colour_area(image, min_x, max_x, min_y, max_y, colour) {
|
sawine@89
|
175 |
var pixels = image.data;
|
sawine@89
|
176 |
var old_colour;
|
sawine@72
|
177 |
for (var y = min_y; y <= max_y; y += 1) {
|
sawine@72
|
178 |
for (var x = min_x; x <= max_x; x += 1) {
|
sawine@72
|
179 |
var pix_colour = getPixel(image, x, y);
|
sawine@72
|
180 |
if (pix_colour.a > 0) {
|
sawine@89
|
181 |
colour.a = pix_colour.a;
|
sawine@89
|
182 |
setPixel(image, x, y, colour);
|
sawine@89
|
183 |
if (pix_colour.a == 255) {
|
sawine@92
|
184 |
old_colour = pix_colour;
|
sawine@89
|
185 |
}
|
sawine@72
|
186 |
}
|
sawine@72
|
187 |
}
|
sawine@89
|
188 |
}
|
sawine@89
|
189 |
return old_colour;
|
sawine@72
|
190 |
}
|
sawine@72
|
191 |
|
sawine@72
|
192 |
function init_logo(event) {
|
sawine@72
|
193 |
var canvas = document.getElementById("logo");
|
sawine@77
|
194 |
var context = canvas.getContext("2d");
|
sawine@72
|
195 |
canvas.width = menu_width;
|
sawine@72
|
196 |
canvas.height = menu_height;
|
sawine@72
|
197 |
context.drawImage(event.target, 0, 0);
|
sawine@78
|
198 |
var image = context.getImageData(0, 0, menu_width, menu_height);
|
sawine@72
|
199 |
for (var i in click_events["logo"]) {
|
sawine@77
|
200 |
var p = click_events["logo"][i];
|
sawine@77
|
201 |
var min_x = p["min_x"];
|
sawine@77
|
202 |
var max_x = p["max_x"];
|
sawine@77
|
203 |
var min_y = p["min_y"];
|
sawine@77
|
204 |
var max_y = p["max_y"];
|
sawine@74
|
205 |
var pos = document.location.href.lastIndexOf("/") + 1;
|
sawine@77
|
206 |
var page = document.location.href.substr(pos);
|
sawine@74
|
207 |
for (var j in p["args"]) {
|
sawine@74
|
208 |
if (page == p["args"][j]) {
|
sawine@113
|
209 |
colour_area(image, min_x, max_x, 0, 60, blue);
|
sawine@78
|
210 |
colour_area(image, min_x, max_x, 60, max_y, white);
|
sawine@74
|
211 |
break;
|
sawine@74
|
212 |
}
|
sawine@78
|
213 |
else {
|
sawine@78
|
214 |
colour_area(image, min_x, max_x, 0, 60, white);
|
sawine@78
|
215 |
colour_area(image, min_x, max_x, 60, max_y, orange);
|
sawine@78
|
216 |
}
|
sawine@78
|
217 |
}
|
sawine@77
|
218 |
}
|
sawine@78
|
219 |
context.putImageData(image, 0, 0);
|
sawine@77
|
220 |
// context.fillStyle = green.str();
|
sawine@77
|
221 |
// console.log((found["max_x"] - found["min_x"]) / 2 + found["min_x"] - 2);
|
sawine@77
|
222 |
// context.fillRect((found["max_x"]-found["min_x"])/2+found["min_x"]-1, 95, 2, 5);
|
sawine@80
|
223 |
draw_menu_lines();
|
sawine@75
|
224 |
}
|
sawine@75
|
225 |
|
sawine@80
|
226 |
function draw_menu_lines() {
|
sawine@75
|
227 |
var canvas = document.getElementById("logo");
|
sawine@75
|
228 |
var context = canvas.getContext("2d");
|
sawine@75
|
229 |
var image = context.getImageData(0, 0, menu_width, menu_height);
|
sawine@75
|
230 |
var pixels = image.data;
|
sawine@75
|
231 |
context.lineCap = "round";
|
sawine@75
|
232 |
context.lineWidth = 1;
|
sawine@75
|
233 |
var colour1a = new Colour(0, 0, 0, 0.1);
|
sawine@75
|
234 |
context.beginPath();
|
sawine@75
|
235 |
context.moveTo(0, menu_height - 1);
|
sawine@75
|
236 |
context.lineTo(menu_width - 1, menu_height - 1);
|
sawine@75
|
237 |
context.closePath();
|
sawine@75
|
238 |
context.strokeStyle = colour1a.str();
|
sawine@76
|
239 |
context.stroke();
|
sawine@76
|
240 |
var colour1e = new Colour(0, 0, 0, 0.05);
|
sawine@76
|
241 |
context.beginPath();
|
sawine@76
|
242 |
context.moveTo(70, menu_height - 1);
|
sawine@76
|
243 |
context.lineTo(menu_width - 71, menu_height - 1);
|
sawine@76
|
244 |
context.closePath();
|
sawine@76
|
245 |
context.strokeStyle = colour1e.str();
|
sawine@76
|
246 |
context.stroke();
|
sawine@76
|
247 |
var colour1b = new Colour(0, 0, 0, 0.05);
|
sawine@75
|
248 |
context.beginPath();
|
sawine@75
|
249 |
context.moveTo(50, menu_height - 1);
|
sawine@75
|
250 |
context.lineTo(menu_width - 51, menu_height - 1);
|
sawine@75
|
251 |
context.closePath();
|
sawine@75
|
252 |
context.strokeStyle = colour1b.str();
|
sawine@75
|
253 |
context.stroke();
|
sawine@75
|
254 |
var colour1c = new Colour(0, 0, 0, 0.05);
|
sawine@75
|
255 |
context.beginPath();
|
sawine@75
|
256 |
context.moveTo(25, menu_height - 1);
|
sawine@75
|
257 |
context.lineTo(menu_width - 26, menu_height - 1);
|
sawine@75
|
258 |
context.closePath();
|
sawine@75
|
259 |
context.strokeStyle = colour1c.str();
|
sawine@75
|
260 |
context.stroke();
|
sawine@75
|
261 |
var colour1d = new Colour(0, 0, 0, 0.05);
|
sawine@75
|
262 |
context.beginPath();
|
sawine@75
|
263 |
context.moveTo(10, menu_height - 1);
|
sawine@75
|
264 |
context.lineTo(menu_width - 11, menu_height - 1);
|
sawine@75
|
265 |
context.closePath();
|
sawine@75
|
266 |
context.strokeStyle = colour1d.str();
|
sawine@75
|
267 |
context.stroke();
|
sawine@75
|
268 |
|
sawine@75
|
269 |
var colour2 = new Colour(0, 0, 0, 0.2);
|
sawine@75
|
270 |
context.beginPath();
|
sawine@75
|
271 |
context.moveTo(menu_splits[0], 0);
|
sawine@75
|
272 |
context.lineTo(menu_splits[0], menu_height - 1);
|
sawine@75
|
273 |
context.moveTo(menu_splits[1], 0);
|
sawine@75
|
274 |
context.lineTo(menu_splits[1], menu_height - 1);
|
sawine@75
|
275 |
context.moveTo(menu_splits[2], 0);
|
sawine@75
|
276 |
context.lineTo(menu_splits[2], menu_height - 1);
|
sawine@75
|
277 |
context.closePath();
|
sawine@75
|
278 |
context.strokeStyle = colour2.str();
|
sawine@75
|
279 |
context.stroke();
|
sawine@75
|
280 |
|
sawine@75
|
281 |
context.clearRect(menu_splits[0] - 1, menu_height - 1, 2, 2);
|
sawine@75
|
282 |
context.clearRect(menu_splits[1] - 1, menu_height - 1, 2, 2);
|
sawine@75
|
283 |
context.clearRect(menu_splits[2] - 1, menu_height - 1, 2, 2);
|
sawine@76
|
284 |
|
sawine@76
|
285 |
context.clearRect(menu_splits[0] - 1, menu_height - 2, 1, 1);
|
sawine@76
|
286 |
context.clearRect(menu_splits[1] - 1, menu_height - 2, 1, 1);
|
sawine@76
|
287 |
context.clearRect(menu_splits[2] - 1, menu_height - 2, 1, 1);
|
sawine@75
|
288 |
}
|
sawine@75
|
289 |
|
sawine@75
|
290 |
function clearMenuLines() {
|
sawine@75
|
291 |
var canvas = document.getElementById("logo");
|
sawine@75
|
292 |
var context = canvas.getContext("2d");
|
sawine@75
|
293 |
var image = context.getImageData(0, 0, menu_width, menu_height);
|
sawine@75
|
294 |
var pixels = image.data;
|
sawine@75
|
295 |
context.clearRect(0, menu_height - 2, menu_width - 1, 2);
|
sawine@75
|
296 |
context.clearRect(menu_splits[0] - 1, 0, 2, menu_height - 1);
|
sawine@75
|
297 |
context.clearRect(menu_splits[1] - 1, 0, 2, menu_height - 1);
|
sawine@75
|
298 |
context.clearRect(menu_splits[2] - 1, 0, 2, menu_height - 1);
|
sawine@72
|
299 |
}
|
sawine@72
|
300 |
|
sawine@80
|
301 |
function draw_sim_lines() {
|
sawine@80
|
302 |
var w = 670;
|
sawine@80
|
303 |
var h = 50;
|
sawine@80
|
304 |
var canvas = document.getElementById("sim");
|
sawine@80
|
305 |
var context = canvas.getContext("2d");
|
sawine@80
|
306 |
var image = context.getImageData(0, 0, w, h);
|
sawine@80
|
307 |
var pixels = image.data;
|
sawine@80
|
308 |
context.lineCap = "round";
|
sawine@80
|
309 |
context.lineWidth = 1;
|
sawine@80
|
310 |
var colour1a = new Colour(0, 0, 0, 0.1);
|
sawine@80
|
311 |
context.beginPath();
|
sawine@80
|
312 |
context.moveTo(0, h - 1);
|
sawine@80
|
313 |
context.lineTo(w - 1, h - 1);
|
sawine@80
|
314 |
context.closePath();
|
sawine@80
|
315 |
context.strokeStyle = colour1a.str();
|
sawine@80
|
316 |
context.stroke();
|
sawine@82
|
317 |
var colour1e = new Colour(0, 0, 0, 0.05);
|
sawine@82
|
318 |
context.beginPath();
|
sawine@82
|
319 |
context.moveTo(70, h - 1);
|
sawine@82
|
320 |
context.lineTo(w - 71, h - 1);
|
sawine@82
|
321 |
context.closePath();
|
sawine@82
|
322 |
context.strokeStyle = colour1e.str();
|
sawine@82
|
323 |
context.stroke();
|
sawine@80
|
324 |
var colour1b = new Colour(0, 0, 0, 0.05);
|
sawine@80
|
325 |
context.beginPath();
|
sawine@80
|
326 |
context.moveTo(50, h - 1);
|
sawine@80
|
327 |
context.lineTo(w - 51, h - 1);
|
sawine@80
|
328 |
context.closePath();
|
sawine@80
|
329 |
context.strokeStyle = colour1b.str();
|
sawine@80
|
330 |
context.stroke();
|
sawine@82
|
331 |
var colour1c = new Colour(0, 0, 0, 0.05);
|
sawine@82
|
332 |
context.beginPath();
|
sawine@82
|
333 |
context.moveTo(25, h - 1);
|
sawine@82
|
334 |
context.lineTo(w - 26, h - 1);
|
sawine@82
|
335 |
context.closePath();
|
sawine@82
|
336 |
context.strokeStyle = colour1c.str();
|
sawine@82
|
337 |
context.stroke();
|
sawine@80
|
338 |
var colour1d = new Colour(0, 0, 0, 0.05);
|
sawine@80
|
339 |
context.beginPath();
|
sawine@80
|
340 |
context.moveTo(10, h - 1);
|
sawine@80
|
341 |
context.lineTo(w - 11, h - 1);
|
sawine@80
|
342 |
context.closePath();
|
sawine@80
|
343 |
context.strokeStyle = colour1d.str();
|
sawine@80
|
344 |
context.stroke();
|
sawine@80
|
345 |
}
|
sawine@80
|
346 |
|
sawine@72
|
347 |
function update_logo() {
|
sawine@72
|
348 |
var canvas = document.getElementById("logo");
|
sawine@72
|
349 |
var context = canvas.getContext("2d");
|
sawine@72
|
350 |
var image = context.getImageData(0, 0, menu_width, menu_height);
|
sawine@72
|
351 |
var pixels = image.data;
|
sawine@72
|
352 |
var white = new Colour(255, 255, 255);
|
sawine@72
|
353 |
for (var y = 0; y < menu_height; y += 1) {
|
sawine@72
|
354 |
for (var x = 0; x < menu_width; x += 1) {
|
sawine@72
|
355 |
var pix_colour = getPixel(image, x, y);
|
sawine@72
|
356 |
if (pix_colour.a > 0) {
|
sawine@72
|
357 |
setPixel(image, x, y, new Colour(90, 215, 21, pix_colour.a));
|
sawine@72
|
358 |
}
|
sawine@72
|
359 |
}
|
sawine@72
|
360 |
}
|
sawine@72
|
361 |
context.putImageData(image, 0, 0);
|
sawine@72
|
362 |
}
|
sawine@72
|
363 |
|
sawine@84
|
364 |
var char_map = new Array();
|
sawine@84
|
365 |
char_map["A"] = new Array(new Array(0, 4), new Array(1, 3),
|
sawine@84
|
366 |
new Array(2, 2), new Array(3, 1),
|
sawine@84
|
367 |
new Array(4, 0), new Array(5, 1),
|
sawine@84
|
368 |
new Array(6, 2), new Array(7, 3),
|
sawine@84
|
369 |
new Array(8, 4), new Array(2, 3),
|
sawine@84
|
370 |
new Array(3, 3), new Array(4, 3),
|
sawine@84
|
371 |
new Array(5, 3), new Array(6, 3));
|
sawine@84
|
372 |
char_map["M"] = new Array(new Array(0, 4), new Array(0, 3),
|
sawine@84
|
373 |
new Array(0, 2), new Array(0, 1),
|
sawine@84
|
374 |
new Array(0, 0), new Array(0, 5),
|
sawine@84
|
375 |
new Array(5, 4), new Array(5, 3),
|
sawine@84
|
376 |
new Array(5, 2), new Array(5, 1),
|
sawine@84
|
377 |
new Array(5, 0), new Array(5, 5),
|
sawine@84
|
378 |
new Array(1, 1), new Array(2, 2),
|
sawine@84
|
379 |
new Array(4, 2), new Array(5, 1),
|
sawine@84
|
380 |
new Array(3, 3));
|
sawine@84
|
381 |
char_map["E"] = new Array(new Array(0, 4), new Array(0, 3),
|
sawine@84
|
382 |
new Array(0, 2), new Array(0, 1),
|
sawine@84
|
383 |
new Array(0, 0), new Array(0, 5),
|
sawine@84
|
384 |
new Array(1, 0), new Array(2, 0),
|
sawine@84
|
385 |
new Array(3, 0),
|
sawine@84
|
386 |
new Array(1, 3), new Array(2, 3),
|
sawine@84
|
387 |
new Array(1, 5), new Array(2, 5),
|
sawine@84
|
388 |
new Array(3, 5))
|
sawine@84
|
389 |
char_map["7"] = new Array(new Array(0, 0), new Array(1, 0),
|
sawine@84
|
390 |
new Array(2, 0),
|
sawine@84
|
391 |
new Array(0, 5), new Array(0, 4),
|
sawine@84
|
392 |
new Array(1, 3), new Array(2, 2));
|
sawine@84
|
393 |
char_map["3"] = new Array(new Array(2, 4), new Array(2, 3),
|
sawine@84
|
394 |
new Array(2, 2), new Array(2, 1),
|
sawine@84
|
395 |
new Array(0, 0), new Array(0, 5),
|
sawine@84
|
396 |
new Array(1, 0), new Array(2, 0),
|
sawine@84
|
397 |
new Array(1, 3), new Array(2, 3),
|
sawine@84
|
398 |
new Array(1, 5), new Array(2, 5))
|
sawine@84
|
399 |
|
sawine@84
|
400 |
function init_gameoflife(text) {
|
sawine@81
|
401 |
var canvas = document.getElementById("gameoflife");
|
sawine@84
|
402 |
var cell_size = 16;
|
sawine@81
|
403 |
if (canvas) {
|
sawine@84
|
404 |
gameoflife = new Simulation(canvas, 670, 670, cell_size,
|
sawine@82
|
405 |
green, black);
|
sawine@80
|
406 |
$("#gameoflife").mousemove(function(event) {
|
sawine@80
|
407 |
gameoflife.mouse_moved(mouse_pos(event, "#gameoflife"));
|
sawine@87
|
408 |
});
|
sawine@87
|
409 |
var offset = new Array(13, 16);
|
sawine@84
|
410 |
for (var c in text) {
|
sawine@84
|
411 |
var w = 0;
|
sawine@84
|
412 |
for (p in char_map[text[c]]) {
|
sawine@84
|
413 |
var x = char_map[text[c]][p][0];
|
sawine@84
|
414 |
var y = char_map[text[c]][p][1];
|
sawine@84
|
415 |
w = Math.max(w, x);
|
sawine@84
|
416 |
var pos = new Array((x + offset[0]) * cell_size,
|
sawine@84
|
417 |
(y + offset[1]) * cell_size);
|
sawine@84
|
418 |
gameoflife.activate_cell(pos);
|
sawine@84
|
419 |
}
|
sawine@84
|
420 |
offset[0] += w + 2;
|
sawine@84
|
421 |
}
|
sawine@84
|
422 |
}
|
sawine@80
|
423 |
}
|
sawine@80
|
424 |
|
sawine@72
|
425 |
function Colour(r, g, b, a) {
|
sawine@72
|
426 |
this.r = r;
|
sawine@72
|
427 |
this.g = g;
|
sawine@72
|
428 |
this.b = b;
|
sawine@77
|
429 |
this.a = a == undefined ? 255 : a;
|
sawine@72
|
430 |
}
|
sawine@72
|
431 |
Colour.prototype.equals = function(rhs) {
|
sawine@72
|
432 |
for (p in this) {
|
sawine@72
|
433 |
if (typeof(rhs[p]) == undefined
|
sawine@72
|
434 |
|| this[p] != rhs[p]) {
|
sawine@72
|
435 |
return false;
|
sawine@72
|
436 |
}
|
sawine@72
|
437 |
}
|
sawine@72
|
438 |
return true;
|
sawine@72
|
439 |
}
|
sawine@75
|
440 |
Colour.prototype.str = function() {
|
sawine@75
|
441 |
return "rgba(" + this.r + "," + this.g + "," + this.b + "," + this.a + ")";
|
sawine@75
|
442 |
}
|
sawine@72
|
443 |
|
sawine@78
|
444 |
var white = new Colour(255, 255, 255);
|
sawine@89
|
445 |
var black = new Colour(0, 0, 0, 255);
|
sawine@89
|
446 |
var orange = new Colour(201, 87, 35, 255);
|
sawine@89
|
447 |
var green = new Colour(90, 215, 21, 255);
|
sawine@113
|
448 |
var blue = new Colour(85, 170, 221, 255);
|
sawine@89
|
449 |
var background = new Colour(34, 34, 34, 255);
|
sawine@78
|
450 |
|
sawine@77
|
451 |
function setPixel(image, x, y, colour) {
|
sawine@72
|
452 |
var index = 4 * (x + y * image.width);
|
sawine@77
|
453 |
image.data[index] = colour.r;
|
sawine@77
|
454 |
image.data[index + 1] = colour.g;
|
sawine@77
|
455 |
image.data[index + 2] = colour.b;
|
sawine@77
|
456 |
image.data[index + 3] = colour.a;
|
sawine@72
|
457 |
}
|
sawine@72
|
458 |
|
sawine@72
|
459 |
function getPixel(image, x, y) {
|
sawine@72
|
460 |
var index = 4 * (x + y * image.width);
|
sawine@72
|
461 |
var r = image.data[index];
|
sawine@72
|
462 |
var g = image.data[index + 1];
|
sawine@72
|
463 |
var b = image.data[index + 2];
|
sawine@72
|
464 |
var a = image.data[index + 3];
|
sawine@72
|
465 |
return new Colour(r, g, b, a);
|
sawine@72
|
466 |
}
|
sawine@72
|
467 |
|
sawine@72
|
468 |
function load_random_quote() {
|
sawine@72
|
469 |
var file = "/quotes/quote" + Math.floor(Math.random() * QUOTES_NUMBER + 1) + ".html";
|
sawine@72
|
470 |
$.ajax({url: SERVER + file,
|
sawine@74
|
471 |
success: write_quote});
|
sawine@72
|
472 |
}
|
sawine@72
|
473 |
|
sawine@74
|
474 |
function write_quote(data, status, xhr) {
|
sawine@74
|
475 |
$("#random_quote").html(data);
|
sawine@72
|
476 |
}
|
sawine@72
|
477 |
|
sawine@72
|
478 |
function load_footer()
|
sawine@72
|
479 |
{
|
sawine@72
|
480 |
var file = "/footer.html";
|
sawine@72
|
481 |
var currentFile = self.location.hostname + self.location.pathname;
|
sawine@72
|
482 |
var request = http_request_object();
|
sawine@72
|
483 |
var url = "http://" + self.location.hostname + file;
|
sawine@72
|
484 |
request.open("GET", url, false);
|
sawine@72
|
485 |
request.setRequestHeader("User-Agent", navigator.userAgent);
|
sawine@72
|
486 |
request.send(null)
|
sawine@72
|
487 |
// if (oRequest.status == 200) alert(oRequest.responseText);
|
sawine@72
|
488 |
// else alert("Error executing XMLHttpRequest call!");
|
sawine@72
|
489 |
//document.write(url);
|
sawine@72
|
490 |
//document.write(request.responseText);
|
sawine@72
|
491 |
document.getElementById('footer').innerHTML = request.responseText;
|
sawine@72
|
492 |
}
|
sawine@72
|
493 |
|
sawine@72
|
494 |
|
sawine@72
|
495 |
|
sawine@72
|
496 |
// Mandelbrot functions
|
sawine@72
|
497 |
function Complex(real, imag)
|
sawine@72
|
498 |
{
|
sawine@72
|
499 |
this.real = real;
|
sawine@72
|
500 |
this.imag = imag;
|
sawine@72
|
501 |
}
|
sawine@72
|
502 |
|
sawine@72
|
503 |
var MIN_C = new Complex(-2.2, -1.4);
|
sawine@72
|
504 |
var MAX_C = new Complex(1.0, 1.4);
|
sawine@72
|
505 |
var min_c = MIN_C;
|
sawine@72
|
506 |
var max_c = MAX_C;
|
sawine@72
|
507 |
var MIN_ITER = 100;
|
sawine@72
|
508 |
var max_iter = MIN_ITER;
|
sawine@72
|
509 |
var zoom = 1.0;
|
sawine@72
|
510 |
var resolution = 3;
|
sawine@72
|
511 |
var bailout = 4.0;
|
sawine@72
|
512 |
|
sawine@72
|
513 |
function Result(z, iter)
|
sawine@72
|
514 |
{
|
sawine@72
|
515 |
this.z = z;
|
sawine@72
|
516 |
this.iter = iter;
|
sawine@72
|
517 |
}
|
sawine@72
|
518 |
|
sawine@72
|
519 |
function complex_quad(c)
|
sawine@72
|
520 |
{
|
sawine@72
|
521 |
return new Complex(Math.pow(c.real, 2) - Math.pow(c.imag, 2),
|
sawine@72
|
522 |
2.0 * c.real * c.imag);
|
sawine@72
|
523 |
}
|
sawine@72
|
524 |
|
sawine@72
|
525 |
function complex_quad_value(c)
|
sawine@72
|
526 |
{
|
sawine@72
|
527 |
return Math.pow(c.real, 2) + Math.pow(c.imag, 2);
|
sawine@72
|
528 |
}
|
sawine@72
|
529 |
|
sawine@72
|
530 |
function complex_add(c1, c2)
|
sawine@72
|
531 |
{
|
sawine@72
|
532 |
return new Complex(c1.real + c2.real, c1.imag + c2.imag);
|
sawine@72
|
533 |
}
|
sawine@72
|
534 |
|
sawine@72
|
535 |
function complex_equal(c1, c2)
|
sawine@72
|
536 |
{
|
sawine@72
|
537 |
return (c1.real == c2.real) && (c1.imag == c2.imag);
|
sawine@72
|
538 |
}
|
sawine@72
|
539 |
|
sawine@72
|
540 |
function iterate(z, c)
|
sawine@72
|
541 |
{
|
sawine@72
|
542 |
z_quad = complex_quad(z);
|
sawine@72
|
543 |
return new Complex(z_quad.real + c.real, z_quad.imag + c.imag);
|
sawine@72
|
544 |
}
|
sawine@72
|
545 |
|
sawine@72
|
546 |
function test(c, max_iter)
|
sawine@72
|
547 |
{
|
sawine@72
|
548 |
var iter = 0;
|
sawine@72
|
549 |
var z = new Complex(0.0, 0.0);
|
sawine@72
|
550 |
var last_z = new Complex(-1.0, 0.0);
|
sawine@72
|
551 |
var quad_z = complex_quad_value(z);
|
sawine@72
|
552 |
|
sawine@72
|
553 |
while (iter < max_iter
|
sawine@72
|
554 |
&& !complex_equal(z, last_z)
|
sawine@72
|
555 |
&& quad_z <= bailout)
|
sawine@72
|
556 |
{
|
sawine@72
|
557 |
last_z = z;
|
sawine@72
|
558 |
z = iterate(z, c);
|
sawine@72
|
559 |
quad_z = complex_quad_value(z);
|
sawine@72
|
560 |
iter++;
|
sawine@72
|
561 |
}
|
sawine@72
|
562 |
return new Result(quad_z, iter);
|
sawine@72
|
563 |
}
|
sawine@72
|
564 |
|
sawine@72
|
565 |
function draw(diter, dx, dy, dz, dres)
|
sawine@72
|
566 |
{
|
sawine@72
|
567 |
var canvas = document.getElementById('mandelbrot');
|
sawine@72
|
568 |
|
sawine@72
|
569 |
if (canvas.getContext)
|
sawine@72
|
570 |
{
|
sawine@72
|
571 |
zoom += dz;
|
sawine@72
|
572 |
var ctx = canvas.getContext('2d');
|
sawine@72
|
573 |
|
sawine@72
|
574 |
if (dres != 0)
|
sawine@72
|
575 |
{
|
sawine@72
|
576 |
resolution = Math.max(1, resolution + dres);
|
sawine@72
|
577 |
}
|
sawine@72
|
578 |
|
sawine@72
|
579 |
if (diter != 0)
|
sawine@72
|
580 |
{
|
sawine@72
|
581 |
max_iter = Math.max(MIN_ITER, max_iter + diter);
|
sawine@72
|
582 |
}
|
sawine@72
|
583 |
|
sawine@72
|
584 |
var red = "rgb(255, 0, 0)";
|
sawine@72
|
585 |
var white = "rgb(255, 255, 255)";
|
sawine@72
|
586 |
var width = canvas.width;
|
sawine@72
|
587 |
var height = canvas.height;
|
sawine@72
|
588 |
var dim = Math.max(width, height);
|
sawine@72
|
589 |
var dim_ratio = Math.round(width / height);
|
sawine@72
|
590 |
var diff_c = new Complex(max_c.real - min_c.real,
|
sawine@72
|
591 |
max_c.imag - min_c.imag);
|
sawine@72
|
592 |
dx_min = diff_c.real / 100 * (dx + dz);
|
sawine@72
|
593 |
dx_max = diff_c.real / 100 * (dx - dz);
|
sawine@72
|
594 |
|
sawine@72
|
595 |
dy_min = diff_c.imag / 100 * (dy + dz);
|
sawine@72
|
596 |
dy_max = diff_c.imag / 100 * (dy - dz);
|
sawine@72
|
597 |
|
sawine@72
|
598 |
var min_inc = new Complex(dx_min * dim_ratio / 2.0, dy_min);
|
sawine@72
|
599 |
var max_inc = new Complex(dx_max * dim_ratio / 2.0, dy_max);
|
sawine@72
|
600 |
min_c = complex_add(min_c, min_inc);
|
sawine@72
|
601 |
max_c = complex_add(max_c, max_inc);
|
sawine@72
|
602 |
diff_c = new Complex(max_c.real - min_c.real,
|
sawine@72
|
603 |
max_c.imag - min_c.imag);
|
sawine@72
|
604 |
|
sawine@72
|
605 |
for (var y = 0; y < height; y += resolution)
|
sawine@72
|
606 |
{
|
sawine@72
|
607 |
for (var x = 0; x < width; x += resolution)
|
sawine@72
|
608 |
{
|
sawine@72
|
609 |
var c = new Complex(min_c.real + diff_c.real / dim * x,
|
sawine@72
|
610 |
min_c.imag + diff_c.imag / dim * y);
|
sawine@72
|
611 |
var result = test(c, max_iter);
|
sawine@72
|
612 |
var r = Math.min(255, Math.pow(Math.max(0,
|
sawine@72
|
613 |
(result.iter - max_iter / 20.0)), 2));
|
sawine@72
|
614 |
var g = Math.min(255, Math.pow(Math.max(0,
|
sawine@72
|
615 |
(result.iter - max_iter / 25.0)), 2));
|
sawine@72
|
616 |
var b = Math.min(255, Math.pow(Math.max(0,
|
sawine@72
|
617 |
(result.iter - max_iter / 20.0)), 2));
|
sawine@72
|
618 |
var colour = "rgb(" + r + "," + g + "," + b + ")";
|
sawine@72
|
619 |
ctx.fillStyle = colour;
|
sawine@72
|
620 |
ctx.fillRect(x, y, resolution, resolution);
|
sawine@72
|
621 |
}
|
sawine@72
|
622 |
}
|
sawine@72
|
623 |
}
|
sawine@72
|
624 |
}
|
sawine@72
|
625 |
|
sawine@72
|
626 |
function getEventOffsetX(evt)
|
sawine@72
|
627 |
{
|
sawine@72
|
628 |
if (evt.offsetX != null)
|
sawine@72
|
629 |
return evt.offsetX;
|
sawine@72
|
630 |
|
sawine@72
|
631 |
var obj = evt.target || evt.srcElement;
|
sawine@72
|
632 |
setPageTopLeft(obj);
|
sawine@72
|
633 |
return (evt.clientX - obj.pageLeft);
|
sawine@72
|
634 |
}
|
sawine@72
|
635 |
|
sawine@72
|
636 |
function getEventOffsetY(evt)
|
sawine@72
|
637 |
{
|
sawine@72
|
638 |
if (evt.offsetY != null)
|
sawine@72
|
639 |
return evt.offsetY;
|
sawine@72
|
640 |
|
sawine@72
|
641 |
var obj = evt.target || evt.srcElement;
|
sawine@72
|
642 |
setPageTopLeft(obj);
|
sawine@72
|
643 |
return (evt.clientY - obj.pageTop);
|
sawine@72
|
644 |
}
|
sawine@72
|
645 |
|
sawine@72
|
646 |
function setPageTopLeft( o )
|
sawine@72
|
647 |
{
|
sawine@72
|
648 |
var top = 0,
|
sawine@72
|
649 |
left = 0,
|
sawine@72
|
650 |
obj = o;
|
sawine@72
|
651 |
|
sawine@72
|
652 |
while (o.offsetParent)
|
sawine@72
|
653 |
{
|
sawine@72
|
654 |
left += o.offsetLeft ;
|
sawine@72
|
655 |
top += o.offsetTop ;
|
sawine@72
|
656 |
o = o.offsetParent ;
|
sawine@72
|
657 |
};
|
sawine@72
|
658 |
|
sawine@72
|
659 |
obj.pageTop = top;
|
sawine@72
|
660 |
obj.pageLeft = left;
|
sawine@72
|
661 |
}
|
sawine@72
|
662 |
|
sawine@78
|
663 |
function draw2(evt) {
|
sawine@78
|
664 |
var iter = 0;
|
sawine@78
|
665 |
var res = 0;
|
sawine@78
|
666 |
var x = (getEventOffsetX(evt) - 335) / 167.5;
|
sawine@72
|
667 |
var y = (getEventOffsetY(evt) - 140) / 70;
|
sawine@78
|
668 |
var z = 0;
|
sawine@78
|
669 |
draw(iter, x, y, z, res);
|
sawine@72
|
670 |
}
|
sawine@72
|
671 |
|
sawine@78
|
672 |
function update() {
|
sawine@78
|
673 |
simulation.update();
|
sawine@78
|
674 |
simulation.draw();
|
sawine@80
|
675 |
if (gameoflife) {
|
sawine@80
|
676 |
gameoflife.update();
|
sawine@80
|
677 |
gameoflife.draw();
|
sawine@80
|
678 |
}
|
sawine@78
|
679 |
}
|
sawine@72
|
680 |
|
sawine@78
|
681 |
function Grid(width, height, cell_size) {
|
sawine@82
|
682 |
this.width = parseInt(width / cell_size + 0.5);
|
sawine@82
|
683 |
this.height = parseInt(height / cell_size + 0.5);
|
sawine@78
|
684 |
this.canvas_width = width;
|
sawine@78
|
685 |
this.canvas_height = height;
|
sawine@78
|
686 |
this.cell_size = cell_size;
|
sawine@78
|
687 |
this.cells = new Array();
|
sawine@78
|
688 |
for (var y = 0; y < this.height; ++y) {
|
sawine@78
|
689 |
this.cells[y] = new Array();
|
sawine@78
|
690 |
for (var x = 0; x < this.width; ++x) {
|
sawine@78
|
691 |
this.cells[y][x] = new Cell(x, y, 0, this);
|
sawine@78
|
692 |
}
|
sawine@78
|
693 |
}
|
sawine@78
|
694 |
}
|
sawine@78
|
695 |
Grid.prototype.cell = function(x, y) {
|
sawine@78
|
696 |
return this.cells[y][x];
|
sawine@78
|
697 |
}
|
sawine@78
|
698 |
Grid.prototype.pick_cell = function(x, y) {
|
sawine@80
|
699 |
var lx = parseInt(x / this.cell_size - 0.5);
|
sawine@92
|
700 |
var ly = parseInt(y / this.cell_size - 0.5);
|
sawine@78
|
701 |
return this.cells[ly][lx];
|
sawine@78
|
702 |
}
|
sawine@78
|
703 |
|
sawine@78
|
704 |
function Cell(x, y, value, grid) {
|
sawine@78
|
705 |
this.x = x;
|
sawine@78
|
706 |
this.y = y;
|
sawine@78
|
707 |
this.canvas_x = x * grid.cell_size;
|
sawine@78
|
708 |
this.canvas_y = y * grid.cell_size;
|
sawine@78
|
709 |
this.value = value;
|
sawine@78
|
710 |
this.grid = grid;
|
sawine@78
|
711 |
this._neighbours = new Array();
|
sawine@78
|
712 |
this.last_mod = 0;
|
sawine@78
|
713 |
}
|
sawine@78
|
714 |
Cell.prototype.hash = function() {
|
sawine@78
|
715 |
return this.x + ", " + this.y;
|
sawine@78
|
716 |
}
|
sawine@78
|
717 |
Cell.prototype.set_value = function(value) {
|
sawine@78
|
718 |
this.value = value;
|
sawine@78
|
719 |
this.last_mod = $.now();
|
sawine@78
|
720 |
}
|
sawine@78
|
721 |
Cell.prototype.neighbours = function() {
|
sawine@78
|
722 |
if (this._neighbours.length) {
|
sawine@78
|
723 |
return this._neighbours;
|
sawine@78
|
724 |
}
|
sawine@78
|
725 |
if (this.x > 0) {
|
sawine@78
|
726 |
this._neighbours.push(this.grid.cell(this.x-1, this.y));
|
sawine@78
|
727 |
if (this.y > 0) {
|
sawine@78
|
728 |
this._neighbours.push(this.grid.cell(this.x-1, this.y-1));
|
sawine@78
|
729 |
this._neighbours.push(this.grid.cell(this.x, this.y-1));
|
sawine@78
|
730 |
}
|
sawine@78
|
731 |
if (this.y + 1 < this.grid.height) {
|
sawine@78
|
732 |
this._neighbours.push(this.grid.cell(this.x-1, this.y+1));
|
sawine@78
|
733 |
}
|
sawine@82
|
734 |
}
|
sawine@78
|
735 |
if (this.x + 1 < this.grid.width) {
|
sawine@78
|
736 |
this._neighbours.push(this.grid.cell(this.x+1, this.y));
|
sawine@78
|
737 |
if (this.y + 1 < this.grid.height) {
|
sawine@78
|
738 |
this._neighbours.push(this.grid.cell(this.x+1, this.y+1));
|
sawine@78
|
739 |
this._neighbours.push(this.grid.cell(this.x, this.y+1));
|
sawine@78
|
740 |
}
|
sawine@78
|
741 |
if (this.y > 0) {
|
sawine@78
|
742 |
this._neighbours.push(this.grid.cell(this.x+1, this.y-1));
|
sawine@78
|
743 |
}
|
sawine@78
|
744 |
}
|
sawine@78
|
745 |
return this._neighbours;
|
sawine@78
|
746 |
}
|
sawine@78
|
747 |
Cell.prototype.density = function() {
|
sawine@78
|
748 |
var d = 0;
|
sawine@78
|
749 |
var neighbours = this.neighbours();
|
sawine@78
|
750 |
for (var n in neighbours) {
|
sawine@78
|
751 |
d += neighbours[n].value;
|
sawine@78
|
752 |
}
|
sawine@78
|
753 |
return d;
|
sawine@78
|
754 |
}
|
sawine@78
|
755 |
|
sawine@82
|
756 |
function Simulation(canvas, w, h, cell_size, life_colour, dead_colour) {
|
sawine@84
|
757 |
this.last_update = $.now() + 3000;
|
sawine@78
|
758 |
this.last_draw = 0;
|
sawine@78
|
759 |
this.last_mouse_moved = 0;
|
sawine@78
|
760 |
this.redraw = new Array();
|
sawine@78
|
761 |
this.canvas = canvas;
|
sawine@80
|
762 |
this.canvas.width = w;
|
sawine@80
|
763 |
this.canvas.height = h;
|
sawine@78
|
764 |
this.context = canvas.getContext("2d");
|
sawine@78
|
765 |
this.pos_queue = new Array();
|
sawine@78
|
766 |
this.cell_queue = new Array();
|
sawine@81
|
767 |
this.cell_size = cell_size;
|
sawine@82
|
768 |
this.life_colour = life_colour;
|
sawine@82
|
769 |
this.dead_colour = dead_colour;
|
sawine@78
|
770 |
this.grid = new Grid(this.canvas.width, this.canvas.height, cell_size);
|
sawine@80
|
771 |
draw_sim_lines();
|
sawine@78
|
772 |
}
|
sawine@78
|
773 |
Simulation.prototype.draw = function() {
|
sawine@78
|
774 |
var now = $.now();
|
sawine@79
|
775 |
if (this.redraw.length) {
|
sawine@83
|
776 |
var cell = this.redraw[0];
|
sawine@83
|
777 |
this.redraw.shift();
|
sawine@82
|
778 |
this.context.fillStyle = cell.value == 1 ?
|
sawine@82
|
779 |
this.life_colour.str() : this.dead_colour.str();
|
sawine@78
|
780 |
this.context.fillRect(cell.canvas_x, cell.canvas_y,
|
sawine@78
|
781 |
this.grid.cell_size, this.grid.cell_size);
|
sawine@78
|
782 |
this.last_draw = $.now();
|
sawine@78
|
783 |
}
|
sawine@78
|
784 |
}
|
sawine@78
|
785 |
Simulation.prototype.update = function() {
|
sawine@78
|
786 |
var now = $.now();
|
sawine@84
|
787 |
while (this.pos_queue.length) {
|
sawine@83
|
788 |
var pos = this.pos_queue.pop();
|
sawine@78
|
789 |
if (pos[0] < this.canvas.width
|
sawine@78
|
790 |
&& pos[1] < this.canvas.height) {
|
sawine@78
|
791 |
var cell = this.grid.pick_cell(pos[0], pos[1]);
|
sawine@78
|
792 |
cell.set_value(1);
|
sawine@78
|
793 |
this.cell_queue.push(cell);
|
sawine@78
|
794 |
this.cell_queue.concat(cell.neighbours());
|
sawine@83
|
795 |
this.redraw.unshift(cell);
|
sawine@78
|
796 |
}
|
sawine@78
|
797 |
}
|
sawine@79
|
798 |
if (this.last_update + 1000 > now) {
|
sawine@78
|
799 |
return;
|
sawine@78
|
800 |
}
|
sawine@78
|
801 |
var changed = new Array();
|
sawine@79
|
802 |
var next_cell_queue = new Array();
|
sawine@79
|
803 |
while (this.cell_queue.length) {
|
sawine@83
|
804 |
var cell = this.cell_queue.pop();
|
sawine@79
|
805 |
if (changed[cell.hash()]) {
|
sawine@79
|
806 |
continue;
|
sawine@78
|
807 |
}
|
sawine@78
|
808 |
var d = cell.density();
|
sawine@78
|
809 |
if (d == 3 && cell.value == 0) {
|
sawine@79
|
810 |
changed[cell.hash()] = cell;
|
sawine@79
|
811 |
next_cell_queue = next_cell_queue.concat(cell.neighbours());
|
sawine@78
|
812 |
} else if (cell.value == 1) {
|
sawine@78
|
813 |
if (d < 2 || d > 3) {
|
sawine@78
|
814 |
changed[cell.hash()] = cell;
|
sawine@79
|
815 |
next_cell_queue = next_cell_queue.concat(cell.neighbours());
|
sawine@78
|
816 |
}
|
sawine@78
|
817 |
}
|
sawine@78
|
818 |
}
|
sawine@78
|
819 |
for (var pos in changed) {
|
sawine@78
|
820 |
var cell = changed[pos];
|
sawine@78
|
821 |
cell.set_value(1 - cell.value);
|
sawine@78
|
822 |
this.redraw.push(cell);
|
sawine@78
|
823 |
}
|
sawine@83
|
824 |
this.cell_queue = next_cell_queue;
|
sawine@78
|
825 |
this.last_update = now;
|
sawine@78
|
826 |
}
|
sawine@84
|
827 |
Simulation.prototype.activate_cell = function(pos) {
|
sawine@84
|
828 |
this.pos_queue.push(pos);
|
sawine@84
|
829 |
}
|
sawine@78
|
830 |
Simulation.prototype.mouse_moved = function(pos) {
|
sawine@78
|
831 |
var now = $.now();
|
sawine@84
|
832 |
if (this.last_mouse_moved + 50 < now) {
|
sawine@84
|
833 |
this.pos_queue.push(pos);
|
sawine@78
|
834 |
this.last_mouse_moved = now;
|
sawine@78
|
835 |
}
|
sawine@78
|
836 |
}
|
sawine@78
|
837 |
|
sawine@78
|
838 |
|