2017-11-25 265 views
0

我正在用c中的2d數組操作進行實驗。就地尤其是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

你是literallly角度旋轉得到指數? – coderredoc

+0

是的,我將這些索引作爲座標 – user3414321

回答

1
  1. 預期的結果告訴你看起來像shape通過旋轉45º,但你設置角度爲90度。

  2. 您正在使用整數座標,但使用浮點函數。 sincos例程必然返回近似值,並且當浮點值轉換爲整數時,它們將被截斷。您可能更喜歡四捨五入,也許使用round函數。

  3. xfyf出現被設置爲使用nw/2nh/2的圖像的中心,但它們都是整數,所以其結果,2個在每種情況下,是從實際中心,2.5相當的距離。

可能還有其他錯誤,但您應該修復這些錯誤並繼續工作。另外,請採取措施調試您的代碼。在循環內部,打印每個值xf,yf, nxny,以便您可以看到計算的輸入和輸出。手動檢查它們是否正確。如果他們不正確,請檢查個人計算結果,看看他們在做什麼。

+0

並將btw sin(90)== 1和cos(90)== 0這樣簡化了代碼......(實際上(非常)可能會給出一個小於1的值,由於PI和sin不準確,並且在這樣的低(整數)索引上,結果可能不好!) –