我有一个矩阵 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)
但是,这在某些时候会失败。如果我们为 oldXPosition = oldYPosition = 0, M = 32 and N = 90º
寻找 newXPosition
和 newYPosition
,我们得到 newXPosition = 32、newYPosition = 0
。考虑到尺寸是 [0-31],仅将 newXPosition
减去 1 是行不通的,因为在其他情况下,必须减去的变量是 newYPosition,甚至两者都减去.
有谁知道我在哪里失败了?
PS:我已经阅读了几个关于 the 90 degrees rotation 的答案。 ,但我的意图不是将矩阵旋转 90 度,而是 N
。
最佳答案
如果您将每个像素视为一个小正方形,您会看到它们的中心位于 0.5、1.5 等;所以将“0.5”添加到 oldXPosition - 并在形成 newXPosition 时减去它:
newXPosition = ceil(cos(NPI/180)(oldXPosition+0.5- M/2) - sin(NPI/180)(oldYPosition+0.5- M/2)+M/2-0.5)
因此,在您的情况下,newXPosition 为 31 - 而不是 32,newYPosition 为 0。
我还建议您反转逻辑,而不是根据旧的 x 和 y 计算新位置,而是从新矩阵开始,对于每个像素,您找到对应的旧位置(这是比如用你的公式旋转 -N 度)- 并从中获取值。
否则“实心”形状可能会由于旋转而变成零。
您可以做一些奇特的插值,而不是“ceil”。
关于c++ - 将矩阵旋转 N 度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40359452/