【问题标题】:2D rotation of rectangular array in CC中矩形阵列的二维旋转
【发布时间】:2017-11-25 13:35:44
【问题描述】:

我在 c 中试验二维数组操作。特别是二维形状的就地旋转,所以我做了我的研究并想出了:

#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);
}

我期待得到这样的输出:

然而我得到的是:

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

我很困惑,我需要一点帮助。 正如你从我的代码中看到的那样,我对新的旋转尺寸进行了硬编码, 但是,如果有人可以指导我如何动态计算新的旋转尺寸,而不使用“最大角”方法,那就太好了。

【问题讨论】:

  • 您实际上是按角度旋转以获得索引?
  • 是的,我将索引固定为坐标

标签: c rotation 2d transform


【解决方案1】:
  1. 您显示的预期结果看起来像 shape 旋转了 45º,但您将角度设置为 90º。

  2. 您正在使用整数坐标但使用浮点函数。 sincos 例程必须返回近似值,并且当浮点值转换为整数时,它们会被截断。您可能更喜欢四舍五入,可能使用round 函数。

  3. xfyf 似乎使用 nw / 2nh / 2 设置为图像的中心,但它们是整数,因此结果,每种情况下为 2,是一个相当大的距离距离实际中心,2.5。

可能还有其他错误,但您应该修复这些错误并继续工作。此外,请采取措施调试您的代码。在循环内部,打印xfyfnxny 的每个值,以便您可以看到计算的输入和输出。手动检查它们是否正确。如果它们不正确,请检查各个计算以了解它们在做什么。

【讨论】:

  • 而且顺便说一句 sin(90) == 1 和 cos(90) == 0 这大大简化了代码......(实际上(非常)可能会小于 1,因为PI 和 sin 不准确,在如此低的(整数)索引上,结果可能不好!)
猜你喜欢
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多