1

我已将 JavaScript spritesheet 转换为 2D 整数数组,现在我正在尝试将 2D 整数数组拆分为多个 2D 数组,使用 1 作为“分隔符”数字。

精灵表 有没有办法使用分隔符将如下所示的 2D JavaScript 数组分隔为多个数组,如下所示?

function separate2DArray(arrToSeparate, separator){
    //separate the 2D array into multiple 2D arrays, using a
    //specific number as the separator
}

//array to separate:
[
[5, 5, 5, 1, 5, 4, 5],
[5, 5, 4, 1, 4, 3, 4],
[1, 1, 1, 1, 1, 1, 1], //1 is the "separator number", which splits the array
[9, 2, 1, 4, 2, 4, 5],       //horizontally and vertically
]
//The array above would produce the following 2D arrays:

5 5 5
5 5 4

5 4 5
4 3 4

9 2

4 2 4 5

我想到的这个算法的主要应用是 spritesheet 图像分离。

4

2 回答 2

1

鉴于分隔区域是矩形的,这将起作用:

function separate2DArray(array, sep){
    //separate the 2D array into multiple 2D arrays, using a
    //specific number as the separator
    var result = [],
        currentSubs = {}; // using x coordinate as key

    for (var y=0; y<array.length; y++) {
        var line = array[y],
            subBegin = 0;
        for (var x=0; x<=line.length; x++) {
            if (x == line.length || line[x] == sep) {
                if (subBegin < x) {
                    var sub = line.slice(subBegin, x);
                    if (subBegin in currentSubs)
                        currentSubs[subBegin].push(sub);
                    else
                        currentSubs[subBegin] = [sub];
                } else { // a line of separators, subBegin == x
                    if (subBegin in currentSubs) {
                        result.push(currentSubs[subBegin]);
                        delete currentSubs[subBegin];
                    }
                }
                subBegin = x+1;
            }
        }
    }
    for (var begin in currentSubs)
        result.push(currentSubs[begin]);
    return result;
}

这里的结果只是一个非常简单的子区域数组,没有关于它们在原始区域中的位置的任何信息。改良版:

function separate2DArray(array, sep){
    var result = [],
        currentSubs = {};
    for (var y=0; y<array.length; y++) {
        var line = array[y],
            subBegin = 0;
        for (var x=0; x<=line.length; x++) {
            if (x == line.length || line[x] == sep) {
                if (subBegin < x) {
                    var subline = line.slice(subBegin, x);
                    if (! (subBegin in currentSubs)) {
                        var subarea = [];
                        result.push({x:x, y:y, area:subarea});
                        currentSubs[subBegin] = subarea;
                    }
                    currentSubs[subBegin].push(subline);
                } else {
                    if (subBegin in currentSubs)
                        delete currentSubs[subBegin];
                }
                subBegin = x+1;
            }
        }
    }
    return result;
}
于 2013-01-24T18:51:58.450 回答
0

您必须遍历数组,只要找到 1 就将预览条目捕获到子数组中

http://jsfiddle.net/cWYpr/10/

 var arr = [[5, 5, 5, 1, 5, 4, 5], [5, 5, 4, 1, 4, 3, 4], [1, 1, 1, 1, 1, 1, 1], [9, 2, 1, 4, 2, 4, 5]];
  var twoD = [];
  for (var x = 0; x < arr.length; x++) {
    var row = arr[x];
    var subArray = [], subArrays=[];
    for (var y = 0; y < row.length; y++) {
      if (row[y] == 1) {
        if (subArray.length) subArrays.push(subArray.slice(0));
        subArray = [];
      }
      else {
        subArray.push(row[y]);
      }
    }
    if (subArray.length) subArrays.push(subArray);
    if(subArrays.length) twoD.push(subArrays);
  }
  console.log(twoD);
  document.write(JSON.stringify(twoD));
于 2013-01-24T17:55:08.880 回答