2017-11-18 9 views
1

私は以下のような配列を持つ2D行列(配列)で長方形の角の位置を探す...Javascriptを:

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

...と私は計算することができる機能を取得したいのですが上記の配列内ののの範囲(4コーナー位置)。

だから私の結果はこのようなものでなければなりません:

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] 
} 
:関数は、以下の例の配列のように回転させた配列で作業することができるはずです。また

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



私は '1'の配列を返すことができる関数を開発しました「-characters-位置(X/Y-位置)ので、私はこのように(my_arrayから)結果配列を取得する:上記のArrayListはまた、それを私の矩形のすべての位置を含むので

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つのコーナーの位置を含める必要があります...しかし、どのように正しい座標を取得するには?


私の考えは、4つのコーナーを取得するためのアレイの最大はxValue、yValue最大、最小はxValueおよび最小yValueをフィルタリングすることでした。良い音が、私のコーナーのために複数の可能性もあります。

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

[OK]を[それをお試しください!]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値を取ることを保証します。 weveは2つの最小限のxの値を得た

x === downRight[0] 

場合は、我々は小さなyは1

y < downRight[1] 

を取ります。

+0

@ ..右に聞こえる...しかし、TBH、私はベクトル形状に行列を変換する方法を見当もつかない(http://jsbin.com/daconumose/edit?console) –

+0

ねえジョナスあなたのソリューションは絶対に素晴らしいと思われます。どうもありがとう。しかし、時計回りに回転した行列を使ってエラーが発生しました。このフィドルをご覧ください:https://jsfiddle.net/ukq6nm91/1/ – Jonas0000

+0

@jonas私はそこの正方形を参照してくださいカント... –

1

これは質問に対するコメントの拡張です。ベクトルに変換し、コーナーに最も近い「ピクセル」を探します。

  1. あなたは、正方形(右へ、上から下へ、左からの変化を検出)と
  2. をすることができます正方形の一辺どの属する人いる「1」の識別境界線「1」を識別することができた場合最小距離を使用して4つのボーダーの各々のベクトルを計算する。

その後、線の交点を計算することができ、コーナーがあります。

最小距離と線の交点は、標準的な幾何学的な操作であり、あなたはグーグルことができます。私は彼らが正しいことを覚えていない。