0

因此,我们有一个5x5的二维数组,像这样:计算“边框”的多维数组

gridmodel: 
[ 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0] 
] 

这代表了块状物体的样子,它是如何绘制网格上,所以我们可以有像这样的例子:

gridmodel: 
[ 
    [0, 0, 0, 0, 0], 
    [0, 1, 0, 0, 0], 
    [0, 1, 1, 0, 0], 
    [0, 1, 0, 0, 0], 
    [0, 0, 0, 0, 0] 
] 

这将代表俄罗斯方块,从简单的T-块。如果外形不从左上角开始,形状刚刚移位运行,使其正常工作。

反正就是那种无关紧要的。我需要的是一种在这个5x5网格中计算任何形状的边界框的方法。形状可以具有孔或形状可在阵列中包括只是一个单一的1,基本上5×5可以是1和0的任意组合。

要计算边框我想我只需要找到其中1是最顶级和最左边和1是最右侧和最底部。

我做了这个,这是应该找到左上1:

var bb = 
{ 
    x1: null, 
    y1: null, 
    x2: null, 
    y2: null 
} 

var toppest = null; 
var leftest = null; 

for(var y = 0; y < gridmodel.length; y++) 
{ 
    for(var x = 0; x < gridmodel[y].length; x++) 
    { 
     if(gridmodel[y][x] === 1) 
     { 
      if(toppest === null) 
      { 
       toppest = { x: x, y: y }; 
      } 

      if(leftest === null) 
      { 
       leftest = { x: x, y: y }; 
      } 
      else 
      { 
       if(x < leftest.x) 
       { 
        leftest = { x: x, y: y }; 
       } 
      } 
     } 
    } 
} 

但是,这看起来已经大大超过复杂,它几乎没有解决问题的一半。

+0

@Teemu啊,我忘了indexOf和lastIndexOf。感谢您的提醒! – Piwwoli

回答

2

差不多,你想到了,但你只需要在边界1号。您可以检查默认值(max val,-1)以查看是否找到任何内容。

var topmost = Number.MAX_VALUE; 
var leftmost = Number.MAX_VALUE; 
var bottommost = -1; 
var rightmost = -1; 

for(var y = 0; y < gridmodel.length; y++) 
{ 
    var l = gridmodel[y].indexOf(1); 
    var r = gridmodel[y].lastIndexOf(1); 

    if (l >= 0 && l < leftmost) leftmost = l; 
    if (r >= 0 && r > rightmost) rightmost = r; 

    // only check if some 1 found 
    if (l >= 0 && y < topmost) topmost = y; 
    if (l >= 0 && y > bottommost) bottommost = y; 
} 

bb = {x1: leftmost, y1: topmost, x2: rightmost, y2: bottommost}; 
+1

太棒了!这与我目前拥有的完美结合。我完全忘记了的indexOf和lastIndexOf,所以有很大的提醒有太多。 – Piwwoli