0 Daumen
331 Aufrufe

Aufgabe:

Kann man aus einer 2x2-Transformationsmatrix die Anteile für Skalierung, Rotation und Scherung extrahieren?

Avatar vor von

Ja.

Hast Du eine konkrete Aufgabe?

Hallo,

ja, ich möchte aus der angezeigten Transformationsmatrix eines Grafikobjekts die Skalierung, die Rotation und die Scherung ermitteln können. Bisher habe ich keine Methode gefunden, mit der das wirklich funktioniert.

Gruß

Wkoncz

Ich habe die in der Quelle angegebene Reihenfolge probiert, aber leider keine sinnvollen Ergebnisse erhalten.

Eine Ausgangsmatrix kann auf verschiedene Arten zerlegt werden, die Zerlegung ist somit nicht eindeutig. Das Produkt in der richtigen Reihenfolge ergibt die Ausgangsmatrix, aber mit verschiedenen Anteilen von Rotation, Scherung und Skalierung.

Also,

A = R * S * H oder

A = H´ * S´ * R´

ja, ich möchte aus der angezeigten Transformationsmatrix eines Grafikobjekts die Skalierung, die Rotation und die Scherung ermitteln können. Bisher habe ich keine Methode gefunden, mit der das wirklich funktioniert.

Stell doch einfach mal die Matrix zur Verfügung. Am besten auch mit eigenen Ansätzen und Rechnungen und auch Informationen zur angezeigten Matrix. Kennst du die Reihenfolge in der Rotation, Skalierung und Scherung enthalten sind. Bzw. das klang so als könntest du es vorgeben. Bei bekannter Reihenfolge kommt man natürlich genau auf eine Umkehrung.

Bei bekannter Reihenfolge kommt man natürlich genau auf eine Umkehrung

Ja, ich kann die Reihenfolge selbst vorgeben. Folgende Transformationen habe ich nacheinander auf ein Rechteck angewendet (Da ich nicht weiß, wie man hier Matrizen am besten darstellt, schreibe ich einfach (a11, a12, a21, a22)):

1. Skalierung: (a11=2, a12=0, a21= 0, a22=0,5)

2. Rotation (15°): (a11=0,9659, a12=-0,2588, a21=0,2588, a22=0,9659)

3. Scherung sx=10°,sy=10°: (a11=1, a12=0,1763, a21=0,1763, a22=1)

Scherung * Rotation * Skalierung = Transformationsmatrix = (2,023   -0,0443   0,8582   0,4601)

Auf die Umkehrungsrechnung bin ich sehr gespannt :-).

Ich komme auf eine andere Transformationsmatrix:

\( \begin{pmatrix} 2.023 & 0.2145 \\ 0.8582 & 0.5058 \end{pmatrix} \)

Ich hab's nochmal geprüft und kann keine Schreib- oder Rechenfehler erkennen.

Stell Deine Zwischenergebnisse ein

Sk = \( \begin{pmatrix} 2 & 0 \\ 0 & 0.5 \end{pmatrix} \)

R = \( \begin{pmatrix} 0.9659 & 0.2588 \\ 0.2588 & 0.9659 \end{pmatrix} \)

S = \( \begin{pmatrix} 1 & 0.1763 \\ 0.1763 & 1 \end{pmatrix} \)

A = S*R*Sk =  \( \begin{pmatrix} 1 & 0.1763 \\ 0.1763 & 1 \end{pmatrix} \) * \( \begin{pmatrix} 1.9318 & 0.1294 \\ 0.5176 & 0.4830 \end{pmatrix} \) = \( \begin{pmatrix} 2.023 & 0.2145 \\ 0.8582 & 0.5058 \end{pmatrix} \)

Oder

A = S*R*Sk =  \( \begin{pmatrix} 1.0115 & 0.4291 \\ 0.4291 & 1.0115 \end{pmatrix} \) * \( \begin{pmatrix} 2 & 0 \\ 0 & 0.5 \end{pmatrix} \) = \( \begin{pmatrix} 2.023 & 0.2145 \\ 0.8582 & 0.5058 \end{pmatrix} \)

Ah jetzt sehe ich das Minus bei der Rotation, sorry, ist mir bei der unübersichtlichen Schreibweise entgangen,

Jetzt komme ich auf dieselben Werte bei A.

@Mathhilf - ja gerade auch gemerkt, die Augen werden wohl alt ;-)

Schon erledigt

In der von mir verlinkten Quelle hat die Scherungsmatrix eine andere Form und die Reihenfolge ist anders als bei Dir.

Wenn Du also mit Deinem A wie in der Quelle vorgehst, kommen natürlich andere Matrizen raus. Das haben wir aber schon vor einiger Zeit festgestellt.

In der Quelle ist nur eine Scherung in x-Richtung enthalten. Ich habe dazu noch eine Scherung in y-Richtung.

Beachte meinen Kommentar vollständig.

Die Zerlegung ist, wie wir schon sagten, nicht eindeutig.

Neben Deiner funktionieren auch z. B.:

Rotation \( R \) :
\( R=\left(\begin{array}{cc} 0.93986 & -0.34156 \\ 0.34156 & 0.93986 \end{array}\right) \)

Skalierung Sk:
\( S k=\left(\begin{array}{cc} 0.66330 & 0 \\ 0 & 1.48395 \end{array}\right) \)

Scherung \( S \) :
\( S=\left(\begin{array}{ll} 2.23187 & 0.03627 \\ 0.08114 & 0.44937 \end{array}\right) \)

was die übliche SVD Zerlegung wäre.

Oder auch so:

Scherung \( S \) :
\( S=\left(\begin{array}{cc} 1 & 0.4198 \\ 0 & 1 \end{array}\right) \)

Rotation \( R \) :
\( R=\left(\begin{array}{cc} 0.8887 & -0.4585 \\ 0.4585 & 0.8887 \end{array}\right) \)

Skalierung Sk:
\( S k=\left(\begin{array}{cc} 1.871 & 0 \\ 0 & 0.5178 \end{array}\right) \)

Wie @Nudger schon sagte: Deine symmetrische Schermatrix S weicht von der üblichen unteren/oberen Dreiecksform ab. Daher ergeben die üblichen Zerlegungen ein anderes Ergebnis.

Das geht leider über meine Kenntnisse hinaus. In meinem Grafikprogramm verändere ich die Scherung in x/y-Richtung über eine Einstellung von a12/a21.

Aber wo ist denn das Problem?

Jede dieser möglichen Zerlegungen liefert ausmultipliziert wieder die Transformationsmatrix A.

Ein richtig oder falsch für die einzelnen Matrizen gibt es nicht (solange das Produkt wieder A liefert).

Also würde ich mich an Deiner Stelle einfach auf die Art Zerlegung festlegen, welche mein benutzter Algorithmus verwendet. Und dabei würde ich dann bleiben, dann bist Du konsistent in Deinem Programm. Das gilt, wenn Du nur das fertige A kennst und die Zerlegung suchst.

Wenn Du dagegen mit einzelnen Matrizen startest, die Matrix A berechnest und jetzt gerne exakt die Bestandteile aus A wiedergewinnen würdest (warum auch immer und ohne das die Bestandteile irgendwo gespeichert wurden), dann müßtest Du wohl die einzelnen Matrizen an Anfang immer genau so definieren (Reihenfolge und Form) wie sie Dein Algorithmus erwartet um später aus dem gegebenen A die enzelnen Bestandteile genauso zurück zu rechnen, wie Du sie definiert hattest.

1 Antwort

0 Daumen
Avatar vor von 10 k

Danke für deine Mühe!

Hintergrund meiner Anfrage: Ich habe ein Grafik-Programm, in dem ich Grafikobjekte beliebig transformieren kann. Nach jeder Skalierung, Rotation und/oder Scherung kann ich mir die Transformationsmatrix anzeigen lassen. Mein Ziel ist es, dass mir ein angeklicktes Objekt seine Skalierungsfaktoren, seinen Drehwinkel und die Scherungswinkel anzeigt. Diese Daten sollen aus der Transformationsmatrix zurückgewonnen werden.

Nun habe ich bei festen Vorgaben (Skalierung Sx=2 und Sy=0,5, Rotationswinkel 15°, Scherungswinkel shx=10° und shy=-10°) festgestellt, dass die Transformationsmatrix je nach Reihenfolge der Transformatinen verschieden (2 Möglichkeiten) ausfällt. Kann das Zurückrechnen dann überhaupt eindeutig die Vorgaben ergeben?

Ich habe den Punkt 6.3 aus der von dir gefundenen Quelle studiert und die angegebenen Formeln an meiner Transformationsmatrix ausprobiert. Die Ergebnisse weichen von meinen Vorgaben derart stark ab, dass man es nicht mit Rechenungenauigkeiten abtun kann.

Mach ich irgendwas falsch?

Gruß

Wkoncz

Matrizenmultiplikation ist bekanntlich nicht kommutativ. Es kommt also genau auf die richtige Reihenfolge an.

Wie schon gesagt wurde, kommt es auf die Reihenfolge an. Bei den Transformationen, und damit auch bei der Matrizenmultiplikation. Lade mal Dein konkretes Beispiel/konkrete Rechnung hoch. Mit allgemeinen verbalen Beschreibungen lässt sich das Problem nicht klären.

Deine Frage oben (Titelzeile) ist ja beantwortet, Du scheinst aber etwas anderes zu wollen, das reicht Dir anscheinend so nicht. Formuliere dann präzise das, was Du willst. Dann kann man (vermutlich) helfen.

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Mathelounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community