我有一个矩阵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
查找newYPosition
和oldXPosition = oldYPosition = 0, M = 32 and N = 90º
,我们会获得newXPosition = 32, newYPosition = 0
。考虑到维度为[0-31],将{1}}减去一个是不行的,因为在其他情况下,它将是newYPosition必须减去的变量,或者甚至两者都是。
有谁知道我失败的地方?
PS:我已经阅读了关于the 90 degrees rotation的几个答案,但我的目的不是将矩阵旋转90度,而是newXPosition
。
答案 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”,你可能会做一些花哨的插值。