길찾기 알고리즘에는 여러가지가 있는데 A* (A Star)라는 알고리즘이 많이 사용된다고 합니다.

라이브러리중에 EasyStar.js (https://www.easystarjs.com/) 라는게 있는데 이걸로 길찾기 알고리즘을 직접 구현하지 않고도 사용할 수 있습니다.

window.onload = function() {
  
  var startPoint = {x:0, y:0}
  var endPoint = {x:4, y:0}
  
  // EasyStar.js 선언
  var es = new EasyStar.js();

  var map = [
    [0, 0, 0, 1, 0],
    [0, 0, 0, 1, 0],
    [0, 2, 2, 2, 0],
    [0, 0, 0, 1, 0],
    [0, 0, 0, 0, 0]
  ];



    var canvas = document.getElementById("canvas");
    if (canvas.getContext) {
      var ctx = canvas.getContext("2d");

      var img = new Image(); // Create new img element
      img.src = './img/sprite.png'; // Set source path

      // Draw slice
      // drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)

      
      var drawMap = function(){
        ctx.clearRect(0, 0, 300, 300)
        var dx = 0                     
        var dy = 0
        for(var i in map){ 
          for(var j in map[i]){
            if(map[i][j] == 1){
              // 돌
              ctx.drawImage(img, 50, 0, 50, 50, dx, dy, 50, 50);
              dx += 50
            } else if (map[i][j] == 2){
              // 물
              ctx.drawImage(img, 0, 50, 50, 50, dx, dy, 50, 50);
              dx += 50
            } else if (map[i][j] == 0){
              // 빈 공간
              ctx.drawImage(img, 50, 50, 50, 50, dx, dy, 50, 50);
              dx += 50
            }
          }dx = 0
          dy += 50
        }
        
        // 도착지
        ctx.fillStyle = "rgb(230,220,0)";
        ctx.fillRect (50 * endPoint.x , 50 * endPoint.y, 50, 50);
        
      }

      drawMap()
      

      
      $("#btnRun").on("click", function(){
        
        drawMap();
        
        // 사람
        ctx.drawImage(img, 0, 0, 50, 50, startPoint.x, startPoint.y, 50, 50);
        
        // 지도(배열) 지정
        es.setGrid(map)
        
        if($("#avoidWater").is(":checked")){
          es.setAcceptableTiles([0, 2]); // 건널 수 있는 타일 설정 (0: 풀, 2: 물)
        } else {
          es.setAcceptableTiles([0]);
        }
        
        // 길찾기 부분 작성
        // findPath(startX, startY, endX, endY, callback);
        es.findPath(startPoint.x, startPoint.y, endPoint.x, endPoint.y, function(path) {
          if (path === null) {
            console.log("Path was not found.");
          } else {
            console.log("Path was found. The first Point is " + path[0].x + " " + path[0].y);
            console.log(path)
            var ix = 0
            setInterval(function(){
              if(ix <= path.length - 1) {
                console.log(path[ix].x, path[ix].y)
                drawMap()
                // 사람
                ctx.drawImage(img, 0, 0, 50, 50, path[ix].x * 50, path[ix].y * 50, 50, 50);
                ix++
              }
             
            }, 500)

          }
        });
         // 길찾기 부분 실행(invoke)
         es.calculate()
      })
      
    }
  }
<body>

  <div>
    <canvas id="canvas" width="300" height="300"></canvas>
  </div>
  <input type="checkbox" id="avoidWater">물 건너기
  <button id="btnRun">길찾기</button>

</body>

 

              

문의 | 코멘트 또는 yoonbumtae@gmail.com




0개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다