2016-03-23 592 views
0

假设我有图像,我需要在任何方向旋转90度,而我无法理解如何做到这一点。我需要使用矩阵,其中宽度 - 它是X,高度 - 是Y.我已经完成180度旋转图像,但无法计算出90度。旋转矩阵/图像的公式90度C++

下面是例子。假设我有一个3x4像素的图像。宽度= 3,高度= 4,每个单元中的数据量 - N = Width * Height = 3 * 4 = 12。让我们把矩阵:

Here it is

的公式可以轻松地去通过矩阵是y*Width + x。而对于我们的180度旋转的计算公式为:

N - Width + x - y * Width 

因此,我们有:

DataOut [y * Width + x] = DataIn [N - Width + x - y * Width] 

使用这个公式,我们得到:

this matrix

但我不能想出与旋转90度的公式。你能帮我吗?

+0

你需要为此,例如矩阵乘法90度旋转矩阵为[[0,-1],[1,0]],180度矩阵为[[-1,0],[0,-1]]'。将每个点与矩阵相乘以得到点的旋转位置。对于任何角度'a',旋转矩阵为[[cos(a), - sin(a)],[sin(a),cos(a)]]'。 – thebjorn

回答

0

您可以轻松地将(x + y * width)转换为更简单的(x,y)表示形式。

​​

现在,一个直角旋转只是一个坐标开关,也许是一个符号修正。

P rotate90(int x, int y){ 
    return point(y, x); 
} 

这是左手系统的正向旋转。 如果旋转方向错误,则从宽度减去x。

2

,你可以简单地通过这个旋转矩阵:

for(int i=0; i<cols; i++) 
{ 
    for(int j=1; j<=rows; j++) 
    { 
     datOut[i][j]= datIn[rows-j][i]; 
    } 
} 

和1-d数组:

for(int i=0; i<cols; i++) 
{ 
    for(int j=1; j<=rows; j++) 
    { 
     datOut[i * rows + j]= datIn[(rows-j) * cols + i]; 
    } 
}