旋转矩阵N度

时间:2016-11-01 11:48:04

标签: c++ c++11 math matrix rotation

我有一个矩阵A[M][M],我希望相对于矩阵的中心旋转N度,丢弃其新位置在原始矩阵之外的值,并填充缺失值零。我使用以下公式来获得新职位:

newXPosition = ceil(cos(N*PI/180)*(oldXPosition - M/2) - sin(N*PI/180)*(oldYPosition - M/2) + M/2)
newYPosition = ceil(sin(N*PI/180)*(oldXPosition - M/2) + cos(N*PI/180)*(oldYPosition - M/2) + M/2)

然而,这在某些方面失败了。如果我们为newXPosition查找newYPositionoldXPosition = oldYPosition = 0, M = 32 and N = 90º,我们会获得newXPosition = 32, newYPosition = 0。考虑到维度为[0-31],将{1}}减去一个是不行的,因为在其他情况下,它将是newYPosition必须减去的变量,或者甚至两者都是。

有谁知道我失败的地方?

PS:我已经阅读了关于the 90 degrees rotation的几个答案,但我的目的不是将矩阵旋转90度,而是newXPosition

1 个答案:

答案 0 :(得分:1)

如果你认为每个像素都是一个小方块,你会发现它们的中心位于0.5,1.5等;所以在oldXPosition中添加“0.5” - 并在形成newXPosition时减去它:

newXPosition = ceil(cos(N PI / 180)(oldXPosition + 0.5-M / 2) - sin(N PI / 180)(oldYPosition + 0.5- M / 2)+ M / 2-0.5)

所以,在你的情况下,newXPosition将是31 - 而不是32,而newYPosition是0。

我还建议你颠倒逻辑,所以不是根据旧的x和y找出新的位置,而是从新的矩阵开始,对于每个像素,你找出对应的旧位置(这是比如用您的公式旋转-N度) - 并从该值获取值。

否则,由于旋转,“实心”形状可能会变为零。

而不是“ceil”,你可能会做一些花哨的插值。