【问题标题】:Calculate "bounding box" for multidimensional array计算多维数组的“边界框”
【发布时间】:2016-02-01 15:28:40
【问题描述】:

所以我们有一个像这样的 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,基本上 5x5 可以是 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 };
                }
            }
        }
    }
}

但这看起来已经过于复杂了,而且只能解决一半的问题。

【问题讨论】:

  • @Teemu 啊,我忘记了 indexOf 和 lastIndexOf。也谢谢你的提醒!

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


【解决方案1】:

和你想的差不多,但你只需要 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};

【讨论】:

  • 太棒了!这与我目前拥有的完美配合。我完全忘记了 indexOf 和 lastIndexOf,所以这里也是一个很好的提醒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 2011-04-10
  • 2019-07-05
相关资源
最近更新 更多