2015-07-21 72 views
1

我想弄清楚從二維數組中切出一個二維數組區域的方法。我將如何從另一個二維數組中提取二維數組區域

我正在尋找一種有效的方法來創建從座標位置(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]; 
      } 
     } 
    } 
} 

回答

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]第一次嘗試...現在修好了。

+0

改變了的座標。問題寫得很急。 –

1

我要在這裏使用一些術語,因爲這會幫助您在將來的主題搜索。

你的嵌套循環是不必要的。您應該將左上角視爲您的翻譯點,因此(0, 0)轉換爲(8, 7)在您的源代碼中座標空間。您正在應用的轉換(翻譯)正在從您的源點中減去(8, 7)矢量,即:(8, 7) - (8, 7) = (0, 0)。換句話說,從y值中的每個x值和7中減去8,然後設置。

請記住,您的兩個座標空間不需要任何額外的轉換,這意味着在一個空間右邊的任何一步,意味着在另一個空間右邊的相同步驟。所以,除了翻譯你不需要擺弄數據。

源矩形的大小定義了循環的邊界,而不是它所處的座標空間的大小;這是無關緊要的(數組的大小並不重要,只要它們不小於搜索區域)。

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++; 
     } 
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));

+0

我沒有得到成功的作物。我只是展示了期望的結果會是什麼樣子。 –

0

簡單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] 
] 
*/ 
相關問題