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);
}
我期待得到的输出是这样的:
但我得到什么是:
我做了我从我的研究理解: - rotati确实发生在原点(假设左上角) - 移动的坐标,以便它在原点范围内。 - 旋转时使用输出数组的维度作为空间。
我很难过,我需要一点帮助。 虽然在它上面,但是从我的代码中可以看到,我硬编码了新的旋转尺寸,但是,如果有人能够指导我如何动态计算新的旋转尺寸,而不使用“最大角点”方法。
预期的结果告诉你看起来像
shape
通过旋转45º,但你设置角度为90度。您正在使用整数坐标,但使用浮点函数。
sin
和cos
例程必然返回近似值,并且当浮点值转换为整数时,它们将被截断。您可能更喜欢四舍五入,也许使用round
函数。xf
和yf
出现被设置为使用nw/2
和nh/2
的图像的中心,但它们都是整数,所以其结果,2个在每种情况下,是从实际中心,2.5相当的距离。
可能还有其他错误,但您应该修复这些错误并继续工作。另外,请采取措施调试您的代码。在循环内部,打印每个值xf
,yf
, nx
和ny
,以便您可以看到计算的输入和输出。手动检查它们是否正确。如果他们不正确,请检查个人计算结果,看看他们在做什么。
并将btw sin(90)== 1和cos(90)== 0这样简化了代码......(实际上(非常)可能会给出一个小于1的值,由于PI和sin不准确,并且在这样的低(整数)索引上,结果可能不好!) –
你是literallly角度旋转得到指数? – coderredoc
是的,我将这些索引作为坐标 – user3414321