Implementation of the Perlin Noise Algorithm
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

150 lines
2.7 KiB

//implemtantion of dijkstra algorithm
var max = Number.MAX_SAFE_INTEGER-100;
function findNodeWithMinDistAndInQ(list, Q){
var result = "NaN";
var dist = max;
for(var i = 0; i < Q.length; i++){
//console.log(Q[i]);
if(list.get(Q[i]) < dist){
dist = list.get(Q[i]);
result = Q[i];
}
}
//console.log("result: "+result);
return result;
}
function getNeighbours(array, i,j){
var result = [];
if((i-1) > -1 && (i+1) < array.length && (j-1) > -1 && j+1 < array[i].length){
for(var k = -1; k < 2; k++){
for(var l = -1; l < 2; l++){
var row =i+k;
var coloumn=j+l;
if(array[row][coloumn].accessible){
result.push(row+"$"+coloumn);
}
}
}
} else {
for(var k = -1; k < 2; k++){
for(var l = -1; l < 2; l++){
var row =i+k;
var coloumn=j+l;
try{
if(array[row][coloumn].accessible){
result.push(row+"$"+coloumn);
}
} catch(e){
////console.log("zugriff auserhalb des feldes");
}
}
}
}
return result;
}
/**
*
*/
function dijkstra(array, start_i, start_j, end_i,end_j){
var Q = [];
var distance = new Map();
var pre = new Map();
for(var i = 0; i < array.length; i++){
for(var j = 0; j < array[i].length; j++){
var tmp = i+"$"+j;
distance.set(tmp, max);
pre.set(tmp, null);
Q.push(tmp);
}
}
distance.set(start_i+"$"+start_j, 0);
var t = 0;
while (Q.length !== 0){
var node = findNodeWithMinDistAndInQ(distance,Q);
if(node === "NaN"){
console.log(Q);
console.log(distance);
return null;
}
Q.splice(Q.indexOf(node),1);
var indices = node.split("$");
indices[0] = parseInt(10, indices[0]);
indices[1] = parseInt(10, indices[1]);
var neighbours = getNeighbours(array,indices[0],indices[1]);
//console.log(node+" === "+end_i+"$"+end_j);
if(node.localeCompare(end_i+"$"+end_j) === 0){
console.log("YAY");
console.log(t);
console.log(distance);
console.log(pre);
return reverse(end_i+"$"+end_j,start_i+"$"+start_j,pre);
}
for(var i = 0; i < neighbours.length; i++){
var alt = distance.get(node)+1;
if(Q.includes(neighbours[i])){
if(alt < distance.get(neighbours[i])){
distance.set(neighbours[i], alt);
pre.set(neighbours[i], node);
}
}
}
//console.log(t);
t++;
}//
console.log(t);
console.log(distance);
console.log(pre);
return null;
}
function reverse(target, source, pre){
var path = [];
var u = target;
console.log("target: "+target);
console.log("source: "+source);
if(pre.get(u) != null || u === source){
console.log("hallo");
while(u != null){
console.log("hallo");
u = pre.get(u);
path = [u].concat(path);
}
}
path.push(target);
path.shift();
console.log("!!!!")
console.log(path);
return path;
}