在c ++中将矩阵(2D数组)旋转45度

时间:2016-12-22 20:20:26

标签: c++ math matrix multidimensional-array rotation

我试图将矩阵(MxN)旋转45度。 例如:

|a|b|c|d|e|
|f|g|h|i|j|
|k|l|m|n|o|

将轮流转为:

| | |a| | | | |
| |f| |b| | | |
|k| |g| |c| | |
| |l| |h| |d| |
| | |m| |i| |e|
| | | |n| |j| |
| | | | |o| | |

非常感谢任何帮助! 编辑:我对问题的看法。

我一直在考虑这个,这是我最终得到的公式: f(i,j)=(i + j,m-1-i + j)

但我遇到的问题是,如果我要进行2次旋转,我将无法进行90度旋转。

2 个答案:

答案 0 :(得分:1)

如果您想将点(x,y)旋转45°,则可以使用公式

x' = cos(45°) * x - sin(45°) * y
y' = sin(45°) * x + cos(45°) * y

现在我们知道cos(45°)= sin(45°)= 1 / sqrt(2)。因此,如果(x,y)是整数协调的,那么由于sqrt(2)因子,(x',y')将不是整数。

如果要旋转矩阵中的元素以使点位于矩阵中,则有效地希望将整数坐标旋转为整数坐标(将中心点h作为原点)。所以从某种意义上说,你在问不可能。

有两种解决方法。

1)删除整数坐标的要求。如果要将结果放入数组中,则无法实现。如果数组表示图像中的像素,那么这就是你要做的。旋转后,您需要通过平均周围像素来计算得到的像素值。

2)将结果乘以比例因子sqrt(2)。这基本上就是你所做的。如果使用毕达哥拉斯计算旋转网格中的距离,则相邻点的距离将为sqrt(2)。

如果你再重复两次,你会发现距离会加倍。

一种可能的解决方案是使用您的算法,然后将所有坐标除以2.

答案 1 :(得分:0)

尝试此过渡:

mat [x] [y]-> mat [x + y] [x-y]或mat [x-y] [x + y](取决于您要旋转的方向)

类似mat [m + i-j] [i + j] = oldmat [i] [j]这样的东西可以处理负索引