2016-08-30 11 views
2

4x4タイルのグリッドがあります。各タイルは5×5ピクセルです。どのように私はこのグリッドの1次元配列を作成し、適切にタイルの座標を設定する(私が指定している座標は2次元配列の行と列とは異なります)?たとえば、1d配列を作成した後、インデックス4のタイルの座標は(0,5)です。xとy座標の2dグリッドの1d配列を作成します(xとyは2dグリッドの行と列を参照しません)

+1

それを上に描画されるべきだと思う、それは を失敗します(×4 6)作品あなたが望むもののアイデアを得ることができます。その後、それは明らかになります。 – Andreas

+0

なぜ1Dアレイを使用するのですか?それぞれの 'Tile'のx座標とy座標が配列インデックスの関数である' Tile'オブジェクトの2D配列を作ることができます。私が何を言っているのか分からない場合は、答えにさらに助けを求めることができるので、説明を求めてください。 –

答えて

2

whのグリッドがあり、各タイルはサイズnの正方形であるとします。最初に考慮する必要があるのは、各タイルの左上隅(または座標系の向きに応じて左下隅)の座標です。最初のタイルが(0,0)で開始し、各タイルが広いn画素とn画素であるので、同じ行の次のタイルが(n,0)(2*n, 0)の座標を有することになる

を(私は(0,0)として左上隅を使用する)··· ((w-1)*n, 0)。これはすべての次の行にも適用されます。次の行のYオフセットはnピクセルなので、開始座標が((w-1)*n, (h-1)*n)の最後のタイルに到達するまで、その座標は(0,n),(n,n),(2*n, n)などの形式になります。

次に、2Dアレイを1Dアレイに変換する方法を知る必要があります。このため 、2Dおよび1D-アレイのインデックスが関連している方法を検討:

2D-Array: 
0: [0,1,2,3] 
1: [0,1,2,3] 
2: [0,1,2,3] 
3: [0,1,2,3] 

を1D-アレイでは、同じことがこのようになります。

1D-Array: 
[(0,0),(1,0),(2,0),(3,0),(0,1),(1,1),(2,1),(3,1),(0,2),(1,2),(2,2),(3,2),(0,3),(1,3),(2,3),(3,3)] 

の最初の行を2D-Arrayはインデックス0-3に、次の行はインデックス4-7に、第3行はインデックス8-11に、第4行はインデックス12-15にそれぞれフィットします。各インデックスは、現在のrowIndexの4 (the size of a row)倍から始まり、現在のcolumnIndexによってオフセットされています。

だから対応する1D-指数(注:これは、各行が要素の同量を有する長方形の2次元アレイ、のためにのみ機能)を計算するために、次の式を適用することができ

oneDIndex = (rowSize * rowIndex) + columnIndex; 

を2D-アレイの(1,1)のためにそれをテストします。

oneDIndex = (1 * 4) + 1 // == 5 

そして、あなたが見ることができるよう、1D-アレイのインデックス5含みません値(1,1)。あなたは次のコードで、1D-アレイに2D-配列を翻訳することができ意味

for(int y = 0; y < twoDArray.length; y++) { 
    for(int x = 0; x < twoDArray[y].length; x++) { 
     int oneDIndex = (twoDArray[y].length * y) + x; 
     oneDArray[oneDIndex] = twoDArray[y][x]; 
    } 
} 

すべてのことが残っていますが、これらの二つのアイデアを組み合わせることです。そのためには、各グリッドタイルの左上隅を対応する2Dインデックスにマップし、上記のコードスニペットを使用して1D配列に挿入する必要があります。

マッピングは次のコードで行うことができます:

gridCoordinate.x = tileCoordinate.x/tileSize; 
gridCoordinate.y = tileCoordinate.y/tileSize; 

グリッドサイズ4*4とタイルサイズ5*5を使用して特定の問題を考慮すると、座標(5,5)でタイルを取ります。これを上記のコードスニペットに挿入すると、グリッド座標は(1,1)になります。 5ピクセル右と5ピクセル下に行くことができ、そのグリッドインデックスでタイルの内側にいるので、これは正しいです。

一緒にすべてを置く:

  • マッピングタイルは、グリッドに座標は
  • 使用グリッドにおける1D-アレイにそのタイルのオブジェクトを入れて1次元アレイ
  • のインデックスを計算する座標座標あなたは1D-インデックスを持っていて、対応する2D-インデックスをしたい場合、あなたは次の操作を行うことができ、

逆に指数計算:

twoDYIndex = oneDIndex/gridSize; 
twoDXIndex = oneDIndex % gridSize; 

1D配列のインデックス4の要素を(質問に記載されているように)欲しいとしましょう。

twoDYIndex = 4/4 // == 1 
twoDXIndex = 4 % 4 // == 0 

だからあなたの2次元配列では、これは、所望のよう(0,5)座標にある、グリッドの要素(0,1)あろう。

-1

私はプログラミングでアマチュアなので、私が間違っている場合は私を許してください。 QBruteが上記の答えに誤りがあると思います。 8月30日'16 長方形配列が関与している場合、それは唯一の4×4 すなわち正方形アレイを考慮するので、それは私がラインoneDIndex = (rowSize * rowIndex) + columnIndexoneDIndex = (columnSize * rowIndex) + columnIndex

関連する問題