2016-03-23 593 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]; 
    } 
}