计算多维数组的“边界框”

时间:2016-02-01 15:28:41

标签: javascript arrays algorithm multidimensional-array bounding-box

所以我们有一个5x5 2d阵列,如下所示:

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个,基本上5x5可以是1和0的任意组合。

为了计算一个边界框,我想我只需找到哪一个是最顶部和最左边,哪一个是最右边和最底部。

我做了这个,应该找到左上角的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 };
                }
            }
        }
    }
}

但这看起来已经过于复杂,而且几乎没有解决问题的一半。

1 个答案:

答案 0 :(得分: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};