C语言中矩形阵列的二维旋转

C语言中矩形阵列的二维旋转,c,rotation,2d,transform,C,Rotation,2d,Transform,我在用c语言进行2d数组操作的实验。特别是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

我在用c语言进行2d数组操作的实验。特别是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);
}
我希望得到如下输出:

然而,我得到的是:

我做了我从研究中了解到的事情: -旋转确实发生在原点的左上角 -移动坐标,使其处于原点比例。 -旋转时使用输出数组的维度作为空间

我被难住了,我需要一点帮助。 在这里,你可以从我的代码中看到,我硬编码了新的旋转维度, 但是,如果有人能指导我如何动态计算新的旋转尺寸,而不使用角点最大值方法,那就太好了

显示的预期结果看起来像旋转了45º的形状,但将角度设置为90º

您使用的是整数坐标,但使用的是浮点函数。sin和cos例程必须返回近似值,当浮点值转换为整数时,它们会被截断。您可能更喜欢舍入,也许可以使用round函数

xf和yf似乎使用nw/2和nh/2设置为图像的中心,但它们是整数,因此结果(每种情况下为2)与实际中心(2.5)之间有相当大的距离


可能还有其他错误,但您应该修复这些错误并继续工作。另外,采取步骤调试代码。在循环内部,打印xf、yf、nx和ny的每个值,以便查看计算的输入和输出。手动检查它们是否正确。如果它们不正确,请检查单个计算,看看它们在做什么。

您是按角度进行垂直旋转以获得索引?是的,我将索引固定为坐标,顺便说一句,sin90==1和cos90==0,这大大简化了代码。。。实际上,由于PI和sin的不精确性,很可能给出一个略小于1的值,并且在这样低的整数索引上,结果可能不好!