dijkstra
A simple dijkstra implementation with a table to display the progression.
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
COLS = Math.floor(window.innerWidth / 16);
ROWS = Math.floor(window.innerHeight / 16);
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))
{
this.push(value);
}
}
var walls = [];
for (var i = 0; i < 10; i++)
{
var index = Math.floor(Math.random() * COLS * ROWS);
if (Math.random() < 0.5)
{
var m = Math.min(Math.floor(Math.random() * COLS), COLS - index % COLS);
for (var j = 0; j < m; j++)
{
walls.push(index + j);
setClass(index + j, "wall");
}
}
else
{
var m = Math.min(Math.floor(Math.random() * ROWS), ROWS - Math.floor(index / COLS));
for (var j = 0; j < m; j++)
{
walls.push(index + j * COLS);
setClass(index + j * COLS, "wall");
}
}
}
var graph = [];
for (var i = 0; i < COLS * ROWS; i++)
{
var edges = [];
if (i % COLS > 0) edges.pushIfNotIn(i - 1, walls);
if (i % COLS < COLS - 1)...