C中矩形阵列的2D旋转

问题描述:

我正在用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. 预期的结果告诉你看起来像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不准确,并且在这样的低(整数)索引上,结果可能不好!) –