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] 
] 

Что представляет собой простой Т-блок от тетриса. Если форма не начинается с верхнего левого угла, форма просто сдвигается во время выполнения, так что она работает правильно.

В любом случае, это не имеет никакого значения. Мне нужен способ вычисления ограничивающей рамки для любой формы в этой сетке 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 }; 
       } 
      } 
     } 
    } 
} 

Но это уже выглядит путь более сложным, и это едва ли решение половину проблемы.

+0

@Teemu Ahh, я забыл 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