web-dev-qa-db-ja.com

1Dデータ構造を2Dグリッドとして扱う

2D画像を1D配列として表すネイティブクラスを使用しています。たとえば、1つのピクセルを変更する場合は、x,y座標からインデックスを取得する方法が必要です。

したがって、次のような1D配列array1dがあるとします。

array1d = [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y ]

プログラムのコンテキストでは、array1dは2Dグリッドを表します。

a b c d e
f g h i j
k l m n o
p q r s t
u v w x y

また、array1dに対して次のような操作を実行したいとします。

  • x,y座標の値を取得します(この例では、1,2lを返します)
  • x,y,width,heightを使用してサブグリッドを取得します(1,2,2,2[l, m, q, r]を提供します)
  • 任意のx,y座標に値を設定します(など)

これらをどのように行うのですか?

47
GladstoneKeep

2D/1D-マッピングは非常に簡単です。 xとy、および2D配列サイズwidth(x方向の場合)およびheight(y方向の場合)を指定すると、1D空間で対応するインデックスiを計算できます(ゼロベース)

i = x + width*y;

そして逆の操作は

x = i % width;    // % is the "modulo operator", the remainder of i / width;
y = i / width;    // where "/" is an integer division

これを3次元以上に簡単に拡張できます。たとえば、寸法が「幅」、「高さ」、「深さ」の3Dマトリックスの場合:

i = x + width*y + width*height*z;

そして逆:

x = i % width;
y = (i / width)%height;
z = i / (width*height);
90
Doc Brown