2016-03-23 9 views
0

Nehmen wir an, ich habe Bild, das ich um 90 Grad in jede Richtung drehen muss und ich kann einfach nicht verstehen, wie das klar zu machen. Ich muss mit Matrix arbeiten, wo Breite - es ist X, und Höhe - es ist Y. Ich habe bereits ein Bild um 180 Grad gedreht, kann aber nicht 90 Grad herausfinden.Formel der rotierenden Matrix/Bild 90 Grad C++

Hier sind die Beispiele. Nehmen wir an, ich habe ein Bild 3x4 Pixel. Breite = 3, Höhe = 4, die Datenmenge in jeder Zelle - N = Width * Height = 3 * 4 = 12. Lassen Sie uns die Matrix machen:

Here it is

Die Formel leicht durch die Matrix gehen y*Width + x ist. Und die Formel für unsere Dreh 180 Grad ist:

N - Width + x - y * Width 

So haben wir:

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

dieser Formel erhalten wir:

this matrix

Aber ich kann nicht kommen mit der Formel der Drehung um 90 Grad. Kannst du mir bitte helfen?

+0

Sie werden für diese Matrix-Multiplikationen benötigen, z.B. die 90 Grad Rotationsmatrix ist '[[0, -1], [1, 0]]' und die 180 Grad Matrix ist '[[-1, 0], [0, -1]] '. Multiplizieren Sie jeden Punkt mit der Matrix, um die gedrehte Position des Punktes zu erhalten. Für jeden Winkel "a" ist die Rotationsmatrix "[[cos (a), -sin (a)], [sin (a), cos (a)]]". – thebjorn

Antwort

0

Sie können die (x + y * Breite) einfach in eine einfachere (x, y) Darstellung umwandeln.

using P = point_data_type; 
P point(int x, int y){ 
    return DataIn[x + y * width]; // N - ...? 
} 

Jetzt ist eine rechtwinklige Drehung nur ein Koordinatenschalter und möglicherweise eine Vorzeichenkorrektur.

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

Dies ist eine positive Drehung in einem linkshändigen System. Ziehen Sie x von der Breite ab, wenn die Drehung in die falsche Richtung erfolgt.

2

Sie können einfach drehen, um die Matrix durch das:

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

und in 1-D-Array:

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