Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 计算;“边界框”;对于多维数组_Javascript_Arrays_Algorithm_Multidimensional Array_Bounding Box - Fatal编程技术网

Javascript 计算;“边界框”;对于多维数组

Javascript 计算;“边界框”;对于多维数组,javascript,arrays,algorithm,multidimensional-array,bounding-box,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

我们有一个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是最顶部和最左侧的,哪个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 };
                }
            }
        }
    }
}
var bb=
{ 
x1:null,
y1:空,
x2:null,
y2:null
}
var-toppest=null;
var leftest=null;
对于(变量y=0;y

但这看起来已经太复杂了,几乎解决不了一半的问题。

与您的想法差不多,但您只需要边界中的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};
var topmest=Number.MAX\u值;
var leftmost=Number.MAX_值;
最底层的var=-1;
最右边的var=-1;
对于(变量y=0;y=0&&l=0&&r>最右边)最右边=r;
//仅检查是否找到1个
如果(l>=0&&y=0&&y>最底部)最底部=y;
}
bb={x1:最左边的,y1:最上面的,x2:最右边的,y2:最下面的};

与您的想法基本相同,但您只需要在边界中输入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};
var topmest=Number.MAX\u值;
var leftmost=Number.MAX_值;
最底层的var=-1;
最右边的var=-1;
对于(变量y=0;y=0&&l=0&&r>最右边)最右边=r;
//仅检查是否找到1个
如果(l>=0&&y=0&&y>最底部)最底部=y;
}
bb={x1:最左边的,y1:最上面的,x2:最右边的,y2:最下面的};

太棒了!这是完美的工作与我目前拥有的。我完全忘记了indexOf和lastIndexOf,所以这也是一个很好的提醒。太好了!这是完美的工作与我目前拥有的。我完全忘记了indexOf和lastIndexOf,所以这也是一个很好的提醒。@Teemu啊,我忘记了indexOf和lastIndexOf。也谢谢你的提醒@提姆啊,我忘了indexOf和lastIndexOf。也谢谢你的提醒!