【问题标题】:Rotate a matrix(2D Array) by 45 degrees in c++在 C++ 中将矩阵(二维数组)旋转 45 度
【发布时间】:2016-12-22 20:20:26
【问题描述】:

我正在尝试将矩阵 (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 度。

【问题讨论】:

  • @Raw N 我应该纠正一个这样做的函数
  • 你应该展示你迄今为止所做的工作。 help section 已为您服务。
  • @RawN std::rotate 给出的结果与 OP 要求的结果不同。
  • @RawN 我没有发布任何工作,因为它不值得发布它只是读取初始矩阵 [m][n] 并创建我将放置旋转矩阵的新矩阵- 矩阵1[m+n-1][m+n-1]
  • @Saizaku 那么你至少应该展示你认为应该如何解决问题,即使没有代码。

标签: c++ math matrix multidimensional-array rotation


【解决方案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) 是整数协调的,那么 (x',y') 由于 sqrt(2) 因子将不是整数。

如果要旋转矩阵中的元素,使点位于矩阵中,则实际上需要将整数坐标旋转到整数坐标(以中心点 h 作为原点)。所以在某种意义上,你在问不可能的事。

有两种方法可以解决这个问题。

1) 取消对整数坐标的要求。如果要将结果放入数组中,则不可能。如果您的数组表示图像中的像素,这就是您要做的。旋转后,您需要通过平均周围像素来计算结果像素值。

2) 将结果乘以 sqrt(2) 的比例因子。这基本上就是你所做的。如果您使用毕达哥拉斯计算旋转网格中的距离,则相邻点的距离将为 sqrt(2)。

如果你再重复两次,你会发现距离会加倍。

一种可能的解决方案是使用您的算法,然后将所有坐标除以 2。

【讨论】:

  • 我得出了同样的结论,我想出的解决方法是我有一个单独的函数可以将它旋转 90 度,所以如果我需要旋转 125 度,我会将它旋转90 和 45 度
【解决方案2】:

试试这个过渡:

mat[x][y] -> mat[x+y][x-y] 或 mat[x-y][x+y] (取决于您要旋转的方向)

像这样的 mat[m+i-j][i+j] = oldmat[i][j] 可以处理负索引

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多