如何从另一个二维数组中提取一个二维数组区域

How would I extract a 2d array area out of another 2d array

本文关键字:二维数组 区域 一个 提取 另一个      更新时间:2023-09-26

我正试图找出一种方法,从2d数组切片出2d数组部分。

我正在寻找一种有效的方法来从坐标位置(4,5)到(7,10)创建另一个2d数组。您在数组中看到的区域为1。

var arr = [
    [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,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,1,1,1,1,1,0],
    [0,0,0,0,0,1,1,1,1,1,0],
    [0,0,0,0,0,1,1,1,1,1,0],
    [0,0,0,0,0,0,0,0,0,0,0],
];
var successfulCropOfArray = [
    [1,1,1,1,1],
    [1,1,1,1,1],
    [1,1,1,1,1]
];

有谁有伪代码可以让我完成这个吗?以下是我尝试过的方法,几乎没有成功:

var slicedMap = Create2DArray(visibleMap);
var topLeftCorner = {
    x: 4,
    y: 5
};
var bottomRightCorner = {
    x: 10,
    y: 7
};
for(var left = topLeftCorner.x;left<bottomRightCorner.x;left++) {   //from left to right scan
    for(var top = bottomRightCorner.y-visibleMap;top>bottomRightCorner.y;top--) {
        for(var slicedX = 0;slicedX<slicedMap.length;slicedX++) {
            for(var slicedY = 0;slicedY<slicedMap.length;slicedY++) {
                slicedMap[slicedY][slicedX] = rooms[newroom].map[bottom][left];
            }
        }
    }
}

我不确定我理解坐标(4,5) to (8,7)将如何给你那个结果,但这里有一个使用[x1, y1], [x2, y2]语法的例子:

function getSlice(upper, lower) {
    // grab all the rows within our bounds
    return arr.slice(upper[1], lower[1])
        // and then map each row to the columns in our bounds
        .map(function(row) {
           return row.slice(upper[0], lower[0]); 
        });
}
// usage: getSlice([x1, y1], [x2, y2]);
getSlice([5,4], [10,7]);

示例:http://jsfiddle.net/cvxs05qo/1/


编辑:我不小心实现了这作为[y1, x1], [y2, x2]在第一次尝试…现在固定。

我将在这里使用一些术语,因为这将有助于您在以后的搜索主题。

嵌套循环是不必要的。您应该将左上角视为您的转换点,因此(0, 0) 转换为源坐标空间中的(8, 7)。您正在应用的转换(翻译)是从源点减去(8, 7) 向量,即:(8, 7) - (8, 7) = (0, 0)。换句话说,从每个x值中减去8,从每个y值中减去7,就可以设置了。

记住你的两个坐标空间不需要任何额外的变换,这意味着在一个空间中的任何右移都意味着在另一个空间中的相同右移。因此,除了翻译之外,您不需要摆弄数据。

源矩形的大小定义了循环的边界,而不是它所在的坐标空间的大小;这是不相关的(数组有多大并不重要,只要它们不小于你正在搜索的区域)。

我马上想到你可以这样做:

    var numberForArray1 = 0;
    var numberForArray2 = 0;
     for (var i = 4; i < 8;i ++)
     {
         for (var j = 5; j < 8; j++)
        {
         successfulCropOfArray[numberForArray1,numberForArray2] = arr[i,j];
         numberForArray1++;

        }
        numberForArray2++; 
        }

我不知道你是如何从你的坐标中得到你的结果的,使用你提到的概念,我会使用slice

var arr = [
    [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,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,1,1,1,1,1,0],
    [0,0,0,0,0,1,1,1,1,1,0],
    [0,0,0,0,0,1,1,1,1,1,0],
    [0,0,0,0,0,0,0,0,0,0,0],
];
var successfulCropOfArray = [
    [1,1,1,1,1],
    [1,1,1,1,1],
    [1,1,1,1,1]
];
var topLeftCorner = {
    x: 5,
    y: 4
};
var bottomRightCorner = {
    x: 10,
    y: 7
};
var temp=arr.slice(topLeftCorner.y,bottomRightCorner.y);
for(i=0;i<temp.length;i++){
  temp[i]=temp[i].slice(topLeftCorner.x,bottomRightCorner.x);
}
console.log(JSON.stringify(temp));
console.log(JSON.stringify(successfulCropOfArray));

简单的forArray.prototype.slice

function slice2d(arr, top, left, bottom, right) {
    var a = new Array(bottom - top), i;
    for (i = top; i < bottom; ++i)
        a[i - top] = arr[i].slice(left, right);
    return a;
}
slice2d(arr, 4, 5, 7, 10);
/*
[
    [1,1,1,1,1],
    [1,1,1,1,1],
    [1,1,1,1,1]
]
*/