2017-07-25 37 views
1

我有一个程序检查数组数组中的坐标,并搜索附近的坐标以找到与“事件”最近的5个坐标。然而,在网格的边缘,在这个例子中(0,0),我面临同一个事件被多次返回但距离不同的距离(这个距离是曼哈顿距离)的问题。用边界条件检查二维数组中的附近点

我认为这是因为我有参数设置,如果它想检查的坐标是在网格之外(小于0)它的值被改变以匹配边界(0)。

let check = (x, y, d) => { 
     if (x > 20) { 
      x = 20; 
     } 
     if (x < 0) { 
      x = 0; 
     } 
     if (y > 20) { 
      y = 20; 
     } 
     if (y < 0) { 
      y = 0; 
     } 

     if (Main[x][y].event) { 
      let info = { 
       x: x - (xRange/2), 
       y: y - (xRange/2), 
       event: Main[x][y].event, 
       distance: d, 
       ticket: Main[x][y].tickets[0], 
      } 
      return info; 
     } else { 
      return false; 
     } 
    } 

let findEvents = (x, y) => { 
     let nearby = []; 
     let info; 

     // Check point x, y 
     if (Main[x][y].event) { 
      info = { 
        x: x - (xRange/2), 
        y: y - (xRange/2), 
        event: Main[x][y].event, 
        distance: 0, 
        tickets: Main[x][y].tickets, 
      } 
      nearby.push(info); 
     } 

     for (let d = 1; d <= 40; d++) { 
      for (let i = 0; i < d + 1; i++) { 

       info = check(x - d + i, y - i, d); 

       if (info) { 
        nearby.push(info); 
       } 
       if ((nearby.length > 5) && 
        (nearby[(nearby.length-1)].distance != 
         nearby[(nearby.length-2)].distance)) { 
        return nearby.slice(0,-1); 
       } 

       info = check(x + d - i, y + i, d); 

       if (info) { 
        nearby.push(info); 
       } 
       if ((nearby.length > 5) && 
        (nearby[(nearby.length-1)].distance != 
         nearby[(nearby.length-2)].distance)) { 
        return nearby.slice(0,-1); 
       } 
      } 

      for (let i = 1; i < d; i++) { 

       info = check(x - i, y + d - i, d); 

       if (info) { 
        nearby.push(info); 
       } 
       if ((nearby.length > 5) && 
        (nearby[(nearby.length-1)].distance != 
         nearby[(nearby.length-2)].distance)) { 
         return nearby.slice(0,-1); 
       } 

       info = check(x + d - i, y - i, d); 

       if (info) { 
        nearby.push(info); 
       } 
       if ((nearby.length > 5) && 
        (nearby[(nearby.length-1)].distance != 
         nearby[(nearby.length-2)].distance)) { 
         return nearby.slice(0,-1); 
       } 
      } 
     } 
     return nearby; 
    } 

有关如何避免这种情况的任何提示? (或清理我的代码一般:D)

回答

1

我还没有完全理解你的find_events方法,但它似乎要避免你描述的问题,你应该返回false从check只要点在外面格。因此:

let check = (x, y, d) => { 
    if (x > 20 || x < 0 || y > 20 ||y < 0) { 
    return false; 
    } 
... 
+0

是的工作:D我有点太集中在值超出范围,似乎忽略它仍然会尝试其他值在相同的距离。 我基于我的方法在https://stackoverflow.com/questions/3330181/algorithm-for-finding-nearest-object-on-2d-grid如果你想尝试和更好地理解:)谢谢 –