我试图想出一种从二维数组中切出一个二维数组部分的方法。
我正在寻找一种从坐标位置(4,5)到(7,10)创建另一个2d数组的有效方法。您在阵列中看到1s的区域。
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];
}
}
}
}
答案 0 :(得分:1)
我不确定我理解坐标(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]
...现在已修复。
答案 1 :(得分:1)
我将在这里使用一些术语,因为这将有助于您将来搜索该主题。
您的嵌套循环是不必要的。您应该将左上角视为转换点,因此(0, 0)
将转换为源坐标空间中的(8, 7)
。您正在应用的转换(翻译)是从源点减去(8, 7)
向量,即:(8, 7)
- (8, 7)
= (0, 0)
。换句话说,从每个8
值中减去x
,从每个7
值中减去y
,然后设置。
请记住,您的两个坐标空间不需要任何额外的转换,这意味着在一个空间中的任何步骤,意味着在另一个空间中的相同步骤。因此,除了翻译之外,您不需要摆弄数据。
源矩形的大小定义了循环的边界,而不是它所在的坐标空间的大小;这是无关紧要的(只要它们不小于您正在搜索的区域,数组的大小并不重要。)
答案 2 :(得分:0)
在我的头顶,你可以做这样的事情:
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++;
}
答案 3 :(得分:0)
我不知道你是如何从你的坐标得到你的结果的,使用你提到的概念,我会用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));
答案 4 :(得分:0)
简单for
Array.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]
]
*/