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