# Matrix drehen



## Martin (29. Jan 2005)

Kennt jemand einen einfachen Algorithmus um eine Matrix um Vielfache von 90° zu drehen?
Also zum Beispiel:

1 2 3
4 5 6
7 8 9

um 90° nach rechts:

7 4 1
8 5 2
9 6 3.

Oder

1 2 3 4 5
6 7 8 9 0

um 180° gedreht:

0 9 8 7 6
5 4 3 2 1.

mfg, Martin


----------



## Kanoni (29. Jan 2005)

Hi,
nen codeschnippsel hätte ich zwar nicht für dich, aber es sollte wie folgt gehen:

Du gehst deine Matrix / Array von 0 nach $i durch und fügst den $i'ten Datensatz einfach an die Position in der 90°-Matrix.

Ist im eigentlichen nicht schwer, musst nur eine generelle Lösung für alle 3x3 Matritzen finden 

MFG

Kanoni


----------



## stev.glasow (29. Jan 2005)

Schau mal hier http://de.wikipedia.org/wiki/Rotationsmatrix


----------



## kopfsalat (29. Jan 2005)

Wenn man gleichzeitig eine neue Matrix erzeugen darf, ist das doch simpel.
Einfach 2 geschachtelte for-Schleifen entsprechend durchlaufen lassen.
In-Place stelle ich mir das schwieriger vor, da die Vertauschungen ja nicht immer paarweise sind.

@stevg
Bedenke die Wort-Rotation-Ungleichung: "Rotation-Matrix" != "Matrix-Rotation"  :wink:


----------



## stev.glasow (29. Jan 2005)

kopfsalat hat gesagt.:
			
		

> @stevg
> Bedenke die Wort-Rotation-Ungleichung: "Rotation-Matrix" != "Matrix-Rotation"  :wink:



Äh, wat? Hast du dir die Seite mal angeschaut?  Um eine Matrix im Koordinaten in einem bestimmten Winkel zu drehen brauchst du diese einfach nur mit der entsprechenden Rotationsmatrix zu multiplizieren zumindest steht das da so.
Mein Fehler war, dass ich mir seine Beispiele nicht angesehen habe, denn er meint ja eine ganz andere Rotation, als die im Koordinatensystem. Welche der beiden Rotationsarten man nun in der Mathematik als Matrixrotation bezeichnet weiß ich nicht, spielt auch nicht so die Rolle.


----------



## Martin (29. Jan 2005)

thx. Glaub ich habs. Müsste in etwa so ausschauen (z.B. für 90° nach rechts):


```
for i=0, i<width{
   for j=0, j<height{
      matrixNeu(j,width-i)=matrixAlt(i,j)
   }
}
```

Fürs erste ist es kein Problem eine neue Matrix zu bauen, wenn jemand eine bessere Variante kennt (ohne ein neues Objekt zu erzeugen), wärs natürlich super.

mfg, Martin


----------



## Guest (2. Mai 2005)

Rotation um 180° Grad geht ohne Erzeugen eines neuen Objekts durch hintereinander ausführen von flipud() und fliplr(). Quellcode dazu ist in manchen Matrix-Packages enthalten. Ob man das ganze noch soweit vereinfachen kann, dass es in einem Schleifendurchlauf geht, weiß ich aber leider nicht.


----------

