2016-10-17 16 views
0

2D配列に格納されたイメージを扱っていますが、イメージは上下が逆です。私がしようとしているのは、それを垂直に反転させることです。最初の行と最後の行、2番目の行と2番目と最後の行を交換する必要があります。私が試したものは次のとおりです。(2D配列に格納された)イメージを垂直方向に反転させます

public void mirror() { 
    for (int i = 0; i < height; i++) { 
     int[] firstRow = imageData[i]; 
     int[] secondRow = imageData[height - 1 - i]; 
     int[] tempRow = firstRow; 
     firstRow = secondRow; 
     secondRow = tempRow; 
     imageData[i] = secondRow; 
     imageData[height - 1 - i] = firstRow; 

これはエラーなしで実行されますが、画像はまったく変更されません。

height変数は、画像が格納されている2D配列であるimageData [] []の高さです。

答えて

0

を2回交換します。です。 i一度

for (int i = 0; i < height; i++) 

は​​より大きい値は、あなたがすでに交換されている行にアクセスし、元の位置に戻ってそれらを交換するために開始達します。これを防ぐには、ループが途中で停止する必要があります。つまり、iが​​に達したときです。

アルゴリズムにもわずかなロジックエラーがあります。 secondRowの値をすでにfirstRowに割り当てておき、その逆の場合は、それぞれの値がimageData[i]imageData[height - 1 - i]の要素である必要があります。

imageData[i] = firstRow; 
imageData[height - 1 - i] = secondRow; 
0

"スワップ"はノーオペレーションです。分secondRowを無視:

int[] firstRow = imageData[i]; 
int[] tempRow = firstRow; 
secondRow = tempRow; // == firstRow 
imageData[i] = secondRow; // == tempRow == firstRow ! 

とその上に

は、あなたが(ない)を2回以上のスワップをやっています。

代わり

、これを試してみてください。

for (int i = 0; i < height/2; ++i) { 
    int[] tempRow = imageData[i]; 
    imageData[i] = imageData[height - i - 1]; 
    imageData[height - i - 1] = tempRow; 
} 
関連する問題