c++ - 将矩阵旋转 N 度

标签 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)

但是,这在某些时候会失败。如果我们为 oldXPosition = oldYPosition = 0, M = 32 and N = 90º 寻找 newXPositionnewYPosition,我们得到 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/

相关文章:

c++ - 递归模板函数无法分配给具有 const 限定类型 'state' 的变量 'const tt &'

c++ - 这种 nullptr 的使用是否会产生编译器错误?

c++ - 数学 printf 式计算

c++ - 在 C++ 中使用字符指针从字符数组中读取字节

c++ - 什么是 Map 以及如何在 C++ 中使用 Map?

c++ - 栈结构数组

c++ - 如何为不允许修改数据的 shared_ptrs 容器编写 getter

c++ - std::is_default_constructible<T> 错误,如果构造函数是私有(private)的

math - 找到给定任意 20 个点的交易量

ruby - 一个更好的 Ruby 实现,将十进制舍入到最接近的 0.5