查找图像的宽度,高度以及起点和终点

时间:2018-10-30 20:08:34

标签: javascript swift

有一个给定的2d图像阵列,如下所示。 我需要找到0'z的开始和结束索引以及宽度和高度。

我已经按照以下方式实现了我的方法,但是我想知道如何才能更有效地实现这种方法,或者只需很少的行代码。 Javascript或快速解决方案都可以。

零总是形成一个矩形或正方形。

var image: [[Int]] = 
    [
        [1, 1, 1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1, 1, 1],
        [1, 1, 1, 0, 0, 0, 1],
        [1, 1, 1, 0, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 1]
    ]

func findZeros (input : [[Int]]) -> (x : Int, y: Int, width:Int, height:Int)
{
  var x = 0;
  var y =  0;
  var width = 0;
  var total = 0;
  var isWidthSet = false;

  for row in 0...input.count-1
  {
    if width != 0
    {
       isWidthSet = true
    }
    for column in 0...input[row].count-1
    {
      if input[row][column] == 0
      {
        if (x == 0 && y == 0)
        {
          x = row
          y = column
        }
        total += 1
        if isWidthSet == false
        {
            width += 1
        }
      }
    }
  }    

  return (x,y,width,total/width)
}

print(findZeros(input:image))

1 个答案:

答案 0 :(得分:0)

我用indexOflastIndexOf避免了嵌套循环的50美分:

function findProps(image) {
  var p = {x1: -1, y1: -1, x2: -1, y2: -1};
  
  for (var t = 0; t <= image.length >> 1;) {
    p.x1 = image[t].indexOf(0);
    p.x2 = image[t].lastIndexOf(0);
    if (!~p.y1 && ~p.x1) p.y1 = t;
    var r = image.length - ++t;
    if (!~p.y2 && ~image[r].indexOf(0)) p.y2 = r;
    if (~p.y1 && ~p.y2) break;
  }
  p.exists = !!(~p.x1 && ~p.y1 && ~p.x2 && ~p.y2);
  p.width = p.exists + p.x2 - p.x1, 
  p.height = p.exists + p.y2 - p.y1;

  return p;
}

var img = [
  [1, 1, 1, 1, 1, 1, 1],
  [1, 1, 1, 1, 1, 1, 1],
  [1, 1, 1, 0, 0, 0, 1],
  [1, 1, 1, 0, 0, 0, 1],
  [1, 1, 1, 1, 1, 1, 1]
];

console.log(findProps(img))