Advertisement
Guest User

sketch.js

a guest
Aug 25th, 2017
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var cols, rows;
  2. var w = 20;
  3.  
  4. var grid = [];
  5.  
  6. var currentCell;
  7.  
  8. var stack = [];
  9.  
  10. var openSet = [];
  11. var closedSet = [];
  12.  
  13. var start;
  14. var end;
  15. var path = [];
  16.  
  17. var solving = false;
  18.  
  19. var frameNbr = 0;
  20.  
  21. // Get cell(i,j) index
  22. function index(i, j) {
  23.   if (i < 0 || j < 0 || i > cols - 1 || j > rows - 1) {
  24.     return -1;
  25.   }
  26.   return i + j * cols;
  27. }
  28.  
  29. // Remove cell walls
  30. function removeWalls(a, b) {
  31.  
  32.   var x = a.i - b.i;
  33.   var y = a.j - b.j;
  34.  
  35.   if (x === 1) {
  36.     a.walls[3] = false;
  37.     b.walls[1] = false;
  38.   } else if (x === -1) {
  39.     a.walls[1] = false;
  40.     b.walls[3] = false;
  41.   } else if (y === 1) {
  42.     a.walls[0] = false;
  43.     b.walls[2] = false;
  44.   } else if (y === -1) {
  45.     a.walls[2] = false;
  46.     b.walls[0] = false;
  47.   }
  48. }
  49.  
  50. // Remove object from array
  51. function removeFromArray(arr, elt) {
  52.   for (var i = arr.length - 1; i >= 0; i--) {
  53.     if (arr[i] == elt) {
  54.       arr.splice(i, 1);
  55.     }
  56.   }
  57. }
  58.  
  59. // Calculate heuristic between a and b object
  60. function heuristic(a, b) {
  61.   // var d = dist(a.i, a.j, b.i, b.j);
  62.   var d = abs(a.i - b.i) + abs(a.j - b.j);
  63.   return d;
  64. }
  65.  
  66.  
  67. function setup() {
  68.   createCanvas(600, 600);
  69.  
  70.   cols = floor(width / w);
  71.   rows = floor(height / w);
  72.  
  73.   for (var j = 0; j < rows; j++) {
  74.     for (var i = 0; i < cols; i++) {
  75.       var cell = new Cell(i, j);
  76.       grid.push(cell);
  77.     }
  78.   }
  79.   currentCell = grid[0];
  80.  
  81.   console.log(currentCell);
  82. }
  83.  
  84.  
  85. function draw() {
  86.   background(51);
  87.  
  88.   for (var i = 0; i < grid.length; i++) {
  89.     grid[i].show();
  90.   }
  91.  
  92.   frameNbr++;
  93.   console.log(frameNbr);
  94.   console.log(solving);
  95.   console.log(currentCell);
  96.  
  97.   if (solving) {
  98.     if(openSet.length > 0) {
  99.  
  100.       var winner = 0;
  101.       for (var i = 0; i < openSet.length; i++) {
  102.         if(openSet[i].f < openSet[winner].f){
  103.           winner = i;
  104.         }
  105.       }
  106.  
  107.       var currentCell = openSet[winner];
  108.  
  109.       if(currentCell === end) {
  110.         noLoop();
  111.         console.log("DONE");
  112.       }
  113.  
  114.       removeFromArray(openSet, currentCell);
  115.       closedSet.push(currentCell);
  116.  
  117.       var neighbors = currentCell.getNeighbors();
  118.  
  119.       for (var i = 0; i < neighbors.length; i++) {
  120.         var neighbor = neighbors[i];
  121.         if (!closedSet.includes(neighbor)) {
  122.           var tempG = currentCell.g + 1;
  123.           if(openSet.includes(neighbor)) {
  124.             if (tempG < neighbor.g) {
  125.               neighbor.g = tempG;
  126.               neighbor.previous = currentCell;
  127.             }
  128.           } else {
  129.             neighbor.g = tempG;
  130.             neighbor.previous = currentCell;
  131.             openSet.push(neighbor);
  132.           }
  133.  
  134.           neighbor.h = heuristic(neighbor, end);
  135.           neighbor.f = neighbor.g + neighbor.h;
  136.  
  137.         }
  138.       }
  139.  
  140.     } else {
  141.       console.log('No solution');
  142.       noLoop();
  143.       return;
  144.     }
  145.  
  146.     noFill();
  147.     stroke(color(0,0,255));
  148.     strokeWeight(w/2);
  149.     beginShape();
  150.     for (var i = 0; i < path.length; i++) {
  151.       vertex((path[i].x+0.5)*w, (path[i].y+0.5)*h);
  152.     }
  153.     endShape();
  154.  
  155.   } else {
  156.     // 1
  157.     currentCell.visited = true;
  158.     currentCell.highlight();
  159.     var next = currentCell.checkNeighbors();
  160.     if (next) {
  161.       next.visited = true;
  162.       // 2
  163.       stack.push(currentCell);
  164.       // 3
  165.       removeWalls(currentCell, next);
  166.       // 4
  167.       currentCell = next;
  168.     } else if (stack.length > 0) {
  169.       currentCell = stack.pop();
  170.     } else if(currentCell.visited) {
  171.       solving = true;
  172.  
  173.       start = grid[0];
  174.       end = grid[grid.length - 1];
  175.  
  176.       openSet.push(start);
  177.     }
  178.   }
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement