2017-11-18 245 views
1

我有類似下面的數組矩形的角落位置...的Javascript:查找二維矩陣(陣列)

var my_array = [ 
    '00000000000000000000000', 
    '00000011111111000000000', 
    '00000011111111000000000', 
    '00000011111111000000000', 
    '00000011111111000000000', 
    '00000011111111000000000', 
    '00000000000000000000000', 
] 

...我想獲得一個功能就是能夠計算(4個角位置)的1個字符在上面的數組中。

所以我的結果應該是這樣的:

var result= { 
    'top-left' : [6,1], 
    'bottom-left' : [6,5], 
    'top-right' : [13,1], 
    'bottom-right' : [13,5] 
} 



而且功能應該能夠在旋轉陣列的工作如下面的例子數組:

var rotated_array = [ 
    "00000000000000000000000", 
    "00000000001100000000000", 
    "00000000111110000000000", 
    "00000001111111000000000", 
    "00000111111111100000000", 
    "00000111111111000000000", 
    "00000011111100000000000", 
    "00000001110000000000000", 
    "00000000100000000000000", 
    "00000000000000000000000", 
    "00000000000000000000000" 
] 

// array ----> result should be something like this: 

var result= { 
    'top-left' : [5,5], 
    'bottom-left' : [8,8], 
    'top-right' : [11,1], 
    'bottom-right' : [14,4] 
} 

我開發了一個函數,能夠返回'1 「-characters位(X/Y位上),所以我將得到一個結果陣列(從my_array)所示:

var positions = [[7,2],[7,1],[6,1],[6,2],[6,3],[6,4],[6,5],[7,5],[7,4],[7,3],[8,3],[8,2],[8,1],[9,1],[9,2],[9,3],[9,4],[9,5],[8,5],[8,4],[10,5],[10,4],[10,3],[10,2],[10,1],[11,1],[11,2],[11,3],[11,4],[11,5],[12,5],[12,4],[12,3],[12,2],[12,1],[13,1],[13,2],[13,3],[13,4],[13,5]] 


由於上面的數組列表包括我的矩形它還的所有位置應該包括4個角落位置......但如何獲得正確的座標?


我的想法是過濾陣列最大的x值,最大的y值,最小的x值和最小的y值,以獲得4個角。聽起來不錯,但也有我的角落多種可能性:

var positions = [[7,2],[7,1],[6,1],[6,2],[6,3],[6,4],[6,5],[7,5],[7,4],[7,3],[8,3],[8,2],[8,1],[9,1],[9,2],[9,3],[9,4],[9,5],[8,5],[8,4],[10,5],[10,4],[10,3],[10,2],[10,1],[11,1],[11,2],[11,3],[11,4],[11,5],[12,5],[12,4],[12,3],[12,2],[12,1],[13,1],[13,2],[13,3],[13,4],[13,5]] 
 

 

 
var corners = { 
 
    'maxX': positions.filter(e => e[0] === Math.max(...positions.map(e => e[0]))), 
 
    'minX': positions.filter(e => e[0] === Math.min(...positions.map(e => e[0]))), 
 
    'maxY': positions.filter(e => e[1] === Math.max(...positions.map(e => e[1]))), 
 
    'minY': positions.filter(e => e[1] === Math.min(...positions.map(e => e[1]))) 
 
    } 
 
    
 
console.log(JSON.stringify(corners))

所以上面的代碼返回是這樣的:

{ 
"maxX":[[13,1],[13,2],[13,3],[13,4],[13,5]], // x values are all 13 (max) 
"minX":[[6,1],[6,2],[6,3],[6,4],[6,5]], // x values are all 6 (min) 
"maxY":[[6,5],[7,5],[9,5],[8,5],[10,5],[11,5],[12,5],[13,5]], // y values are all 5 (max) 
"minY":[[7,1],[6,1],[8,1],[9,1],[10,1],[11,1],[12,1],[13,1]] // y values are all 1 (min) 
} 

但如何得到正確的座標從上面的結果每個角落? 我絕對無能如何計算是正確的,所以我希望有人能幫助我與我的功能..提前

謝謝,喬納斯

+0

也許正確的一個不存在:-)。當您旋轉正方形時,角將位於第1行和第2行之間(或0和1)。如果將光柵圖像轉換爲矢量幾何圖形,則可以計算確切的位置轉角,然後查找最接近的「網格」。 –

+0

好的聲音正確...但tbh我不知道如何將矩陣轉換爲矢量幾何.. @AndersFinnJørgensen – Jonas0000

回答

-1
function findExtremes(array){ 
    let upRight = array[0], 
     downRight = array[0], 
     downLeft = array[0], 
     upLeft = array[0]; 

    for(const [x,y] of array){ 
    if(x < downRight[0] || x === downRight[0] && y < downRight[1]) downRight = [x,y]; 
    if(x > upRight[0] || x === upRight[0] && y > upRight[1]) upRight = [x,y]; 

    if(y > upLeft[1] || y === upLeft[1] && x < upLeft[0]) upLeft = [x,y]; 
    if(y < downLeft[1] || y === downLeft[1] && x > downLeft[0]) downLeft = [x,y]; 
    } 
    return {downRight, downLeft, upRight, upLeft}; 
} 

的代碼是這樣的:

x < downRight[0] 

第一部分確保我們取最小的x值。或者如果

x === downRight[0] 

我們促成有兩個最小的x值,我們採取

y < downRight[1] 

了一個與y越小。

+0

[試試看!](http://jsbin.com/daconumose/edit?console) –

+0

嘿喬納斯,你的解決方案看起來非常好。非常感謝。但我得到一個錯誤,使用順時針旋轉的矩陣。請看這個小提琴:https://jsfiddle.net/ukq6nm91/1/ – Jonas0000

+0

@jonas我不能看到一個廣場那裏... –

1

這是對該問題的評論的延伸。轉換爲矢量並找到離角落最近的「像素」。

  1. 如果你能確定的是毗鄰廣場的「1」(檢測變化,從左至右,從上至下)和
  2. 標識「1」誰屬於哪個廣場,你可以邊使用「最小距離」計算每個邊界的矢量。

之後,您可以計算線條之間的交叉點,並且您有角點。

線的最小距離和交點是標準的幾何操作,你可以谷歌。我不記得他們知道。