2D 配列全体を中心を中心に 90 度回転する方法は知っていますが (私の 2D 配列の長さは常に奇数です)、既知の長さの 2D 配列の特定のインデックスを回転させるアルゴリズムを見つける必要があります。たとえば、2 次元配列が 17 x 17 のグリッドであることがわかっているので、メソッドでインデックス [4][5] を中心を中心に 90 度回転させ、新しいインデックスを 2 つの個別の int(y,x); として返すようにします。私を正しい方向に向けてください。または、あなたが慈善的であると感じている場合は、いくつかのコードをいただければ幸いです-できればJavaで。ありがとう!
3 に答える
デカルト座標 (つまりx
、右を指し、y
上を指す) であり、座標がarray[y][x]
17x17 グリッドの中心 [cx, cy] の形式であると仮定すると、[8, 8] になります。
そこから[4、5]であるポイント[px、py]のオフセット[dx、dy]、つまり[-4、-3]を計算します
時計回りの回転の場合、新しい位置は [cx - dy, cy + dx] になります。
配列が「下向き」を指す Y 軸を使用している場合は、式の符号の一部を逆にする必要があります。
非幾何学的ソリューションの場合、要素 [0][16] を [16][16] にマッピングし、[0][0] を [0][16] にマッピングする必要があることを考慮してください。つまり、最初の行は最後の列にマップされ、2 番目の行は最後から 2 番目の列にマップされます。
n
がグリッドのサイズ (つまり 16) よりも 1 小さい場合、そのポイントがマップされることを意味します[y][x]
。[x][n - y]
理論的には、幾何学的解は同じ答えを提供するはずです - ここに同等性があります:
n = 17 - 1;
c = n / 2;
dx = x - c;
dy = y - c;
nx = c - dy = c - (y - c) = 2 * c - y = n - y
ny = c + dx = c + (x - c) = x
</p>
x,y
反時計回りに 90 度回転したデカルト空間の点は にマッピングされ-y,x
ます。
N 列と M 行の配列は、M 列と N 行の配列にマップされます。新しい "x" インデックスは正ではなく、M を追加することでゼロベースになります。
a[x][y]
にマップしますa[M-y][x]
各行/列に要素を持つ正方配列がある場合N
、90度回転すると反時計回り/反時計回りに送信(x,y)
され(N+1-y,x)
ますね。
つまり、私のように、正方配列の左上の要素が であり(1,1)
、行番号が下に増加し、列番号が右に増加すると思います。0
数える人は、式を多少調整する必要があると思います。