2017-11-25 29 views
0

私は、cで2次元配列操作を実験していました。特に2D形状のインプレース回転ので、私は私の研究を行なったし、思い付いた:私はこのような出力を得るために期待していたCの長方形配列の2D回転

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#define RAD(x) ((x) * 3.14/180) 

char shape[3][3] = {{1, 1, 1}, 
        {1, 0, 1}, 
        {1, 1, 1}}; 

char nf[5][5]= {{0, 0, 0, 0, 0}, 
       {0, 0, 0, 0, 0}, 
       {0, 0, 0, 0, 0}, 
       {0, 0, 0, 0, 0}, 
       {0, 0, 0, 0, 0}}; 

char expa[5][5]= {{0, 0, 1, 0, 0}, 
        {0, 1, 0, 1, 0}, 
        {1, 0, 0, 0, 1}, 
        {0, 1, 0, 1, 0}, 
        {0, 0, 1, 0, 0}}; 

void print(int row, int col, char shapein[][col]) { 
    for (int i = 0; i < row; ++i) { 
    for (int j = 0; j < col; ++j) { 
     printf("%c", ((shapein[i][j]) == 1) ? '#' : ' '); 
    } 
    printf("\n"); 
    } 
} 

void main() { 
    int nw = 5; 
    int nh = 5; 

    int xf = nw/2; 
    int yf = nh/2; 
    float angle = RAD(90); 


    for (int i = 0; i < 3; ++i) { 
    for (int j = 0; j < 3; ++j) { 
     int nx = ((i - xf) * cos(angle) - (j - yf) * sin(angle)) + xf; 
     int ny = ((i - xf) * sin(angle) + (j - yf) * cos(angle)) + yf; 

     nf[nx][ny] = shape[i][j]; 
    } 
    } 

    print(5, 5, nf); 
} 

OK output

をしかし、私は何を得ます次のとおりです。

Wrong output

私は私の研究から理解何をした: - rotati (左上を前提とする) - 元のスケールになるように移動します。 - 出力配列の次元を回転時のスペースとして使用します。

私は困惑しています。少し助けが必要です。 私のコードからわかるように、 新しい回転寸法をハードコード化しましたが、「最大角」法を使用せずに新しい回転寸法を動的に計算する方法を教えてくれればいいと思います。予想

+0

インデックスを取得するために文字通り回転していますか? – coderredoc

+0

はい、私はコード – user3414321

答えて

1
  1. あなたは45°で回転shapeのようなルックスを示した結果としていますが、90°の角度を設定します。

  2. 浮動小数点関数を使用して整数座標を扱っています。 sinおよびcosルーチンは必ず近似値を返し、浮動小数点値が整数に変換されると切り捨てられます。おそらくround関数を使用して、丸めを好むかもしれません。

  3. xfyfnw/2nh/2を用いて画像の中心に設定するように見えるが、それらは整数であり、その結果、それぞれの場合に2は、実際の中心、2.5からかなりの距離です。

さらにエラーが発生する可能性がありますが、修正して作業を続ける必要があります。また、コードをデバッグするための手順を実行します。ループ内で、xfyfnx、およびnyの各値を出力して、計算の入力と出力を確認します。それらが正しいかどうかを手動で確認してください。彼らが正しくない場合は、個々の計算を調べて、彼らが何をしているかを見てください。

+0

とbtw sin(90)== 1とcos(90)== 0としてコードを単純化しています...(実際に(非常に) PIとsinの不正確さのために、そのような低い(整数)インデックスでは、結果は良くないでしょう!) –