dijkstra with setImmediate
A simple dijkstra implementation with a table to display the progression.
by francisfortier
CSS
body { margin: 0px; }
table { border-collpase: collapse; border: solid 1px #000; }
td { width: 6px; height: 6px; border: solid 1px #000; }
td.source { background-color: #f00; }
td.target { background-color: #00f; }
td.path { background-color: #0f0; }
td.close { background-color: #ccc; }
td.wall { background-color: #000; }
JavaScript
if (!window.setImmediate)
{
window.setImmediate = (function() {
var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
var URL = window.URL || window.webkitURL;
var bb = new BlobBuilder();
bb.append('self.onmessage = function(e) { ' +
' for (var i = 0; i < e.data; i++) { ' +
' self.postMessage(i); ' +
' } ' +
'}');
var worker = new Worker(URL.createObjectURL(bb.getBlob("text/javascript")));
var callback;
worker.addEventListener("message", function(event) {
callback();
}, false);
return function(cb) {
callback = cb;
worker.postMessage(1);
}
})();
}
COLS = Math.floor(window.innerWidth / 8);
ROWS = Math.floor(window.innerHeight / 8);
INFINITY = 0x7FFFFFFF;
var table = document.createElement("table");
var tbody = document.createElement("tbody");
for (var i = 0; i < ROWS; i++)
{
var row = document.createElement("tr");
for (var j = 0; j < COLS; j++)
{
row.appendChild(document.createElement("td"));
}
tbody.appendChild(row);
}
table.appendChild(tbody);
document.body.appendChild(table);
function setClass(index, className) {
var cellIndex = index % COLS;
var rowIndex = Math.floor(index / COLS);
if (tbody.rows[rowIndex].cells[cellIndex].className == ""
|| tbody.rows[rowIndex].cells[cellIndex].className === "close")
{
tbody.rows[rowIndex].cells[cellIndex].className = className;
}
}
Array.prototype.contains = function(value) {
for (var i = 0; i < this.length; i++)
{
if (this[i] === value)
{
return true;
}
}
return false;
}
Array.prototype.pushIfNotIn = function(value, arr) {
if (!arr.contains(value))
{
...