以下のコードは、90 度の倍数による float 配列の回転を示しています。後で float 配列をバイト配列に変換して、結果を検証するためのテスト イメージを生成できるようにしました。私はコードのその部分を含めませんでした。なぜなら、それは要点を混乱させるだけであり、実際にあなたが求めていたものではなかったからです. その部分が必要な場合は、私に知らせてください。
「インプレース」ではなく「アウトオブプレース」でローテーションを行ったことに注意してください。あなたが本当に興味を持っているのは後者だと思いますが、それでも、以下のアプローチはあなたにとって良いスタートになるはずです. インプレース変換に関する追加の議論はここにあります。これは、転置型の操作 (メモリ スワップ) の使用を中心にしていますが、それらの詳細をすべて整理する時間がありませんでした。その部分は残しておきます。 .
n*90 度の反時計回りの回転の場合、変換は次のようになることを思い出してください。
それではもちろん:
ただし、実際のコードでは、配列に負のインデックスを渡さないように、以下のコードに示すように、row' と col' をそれぞれ imageHeight/2 と imageWidth/2 で変換する必要があります。
row_p と col_p を row' and col' と表すと、コードは次のようになります。
// Note: nX = pixels wide, nY = pixels tall
float *dataVector = // some data source, arbitrary
// Setup the array for the out-of-place transformation:
float *dataVector2 = new float[nX*nY];
int n = -2; // Example: set n = -2 to rotate counter-clockwise 180 deg
for (int row = 0; row < nY; row++) {
for (int col = 0; col < nX; col++) {
int row_p = cosf(n*M_PI_2)*(row-nY/2) - sinf(n*M_PI_2)*(col-nX/2) + nY/2;
int col_p = sinf(n*M_PI_2)*(row-nY/2) + cosf(n*M_PI_2)*(col-nX/2) + nX/2;
dataVector2[row*nX + col] = dataVector[row_p*nX + col_p];
}
}
// Later convert float array to image ...
上記のコードでは、回転した座標を使用して元の配列の要素にアクセスし、これらの値を元の行の col 座標にマッピングしていることに注意してください。
dataVector2[row*nX + col] = dataVector[row_p*nX + col_p];
この結果、+n の値は時計回りの回転になります。反時計回りの回転が必要な場合は、上記の例に示すように、単に n の負の値、つまり -n をコードに渡します。この効果は、上記の回転行列の非対角項の符号を変更するだけです。
お役に立てれば。