我试图将矩阵(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度旋转。
答案 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]这样的东西可以处理负索引