Javascript 如何从另一个二维阵列中提取二维阵列区域
我正试图找出一种方法,从2d数组中分割出2d数组部分 我正在寻找一种从坐标位置(4,5)到(7,10)创建另一个二维阵列的有效方法。阵列中显示为1s的区域Javascript 如何从另一个二维阵列中提取二维阵列区域,javascript,multidimensional-array,Javascript,Multidimensional Array,我正试图找出一种方法,从2d数组中分割出2d数组部分 我正在寻找一种从坐标位置(4,5)到(7,10)创建另一个二维阵列的有效方法。阵列中显示为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,
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];
}
}
}
}
var slicedMap=Create2DArray(visibleMap);
var topLeftCorner={
x:4,
y:5
};
var bottomRightCorner={
x:10,
y:7
};
对于(var left=topLeftCorner.x;leftbottomRightCorner.y;top--){
对于(var slicedX=0;slicedX,我不确定我是否理解坐标(4,5)到(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]);
例如:
编辑:在第一次尝试时,我意外地将其实现为[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++;
}
var numberForArray1=0;
var numberForArray2=0;
对于(变量i=4;i<8;i++)
{
对于(var j=5;j<8;j++)
{
成功的cropofarray[numberForArray1,numberForArray2]=arr[i,j];
numberForArray1++;
}
numberForArray2++;
}
我不知道你是如何从坐标中得到结果的,但是使用你提到的概念,我会使用切片
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]
]
*/
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(上左角.y,下右角.y);
对于(i=0;iSimplefor
withArray.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]
]
*/
函数切片2D(arr、顶部、左侧、底部、右侧){
var a=新数组(底部-顶部),i;
对于(i=顶部;i<底部;++i)
a[i-top]=arr[i]。切片(左、右);
返回a;
}
切片2D(arr,4,5,7,10);
/*
[
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1]
]
*/
我没有获得成功的收成。我只是展示了期望的结果。改变了坐标。问题写得很匆忙。