0 Daumen
430 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.

In meinem Vektorgrafikprogramm kann ich erzeugte Grafikobjekte wie z.B. ein Rechteck mit der Maus "anfassen" und um ihre Mittelpunkte drehen. Das Rechteck hält dabei seine Transformationsmatrix aktuell und zeigt sie mir an. Jetzt wäre es (z.B. für Konstruktionszeichnungen) nützlich, den momentanen Drehwinkel zu erfahren. Auch die Scherungswinkel wären wohl interessant dabei. Die Transformationsmatrix steckt in einer Instanzvariablen des Objekts. Das Objekt "weiß" also stets, wie sich zu zeichnen hat, also auch, welchen Winkel es einzustellen hat. In meiner mathematischen Naivität habe ich gefolgert, dass dieser Winkel aus der Matrix berechenbar ist.

Das ist der Hintergrund für meine Anfrage hier.:-)

Das hast Du jetzt schon mehrmals gesagt, steht ja auch in Deiner Frage ganz oben. Ist von Anfang an durch meine Antwort mit der verlinkten Quelle unten geklärt. Was ist denn jetzt noch offen?

Du willst aus einer T-Matrix die enthaltenen Operationen wissen. Das ist lange geklärt. In Deinen Beispielen fängst Du aber gar nicht mit einer T-Matrix an. Was willst Du denn nun?

Der Winkel ist berechenbar, leider weißt Du nicht, welche Art der Berechnung Dein Grafikprogramm dazu nutzt.

Ich denke, Du mußt daher herausfinden, welcher Algorithmus in Deinem Grafikprogramm implementiert ist. Dazu würde ich verschiedene triviale Objekte und simple Transformationen probieren, um diesen mit Reverse Engineering zu ermitteln.

Also angefangen mit nur einer Transformation (da sollte es wohl keine Probleme geben), dann zwei Transformationen, z.B. Drehung und Streckung, möglichst einfach. Dann die resultierende Transformationsmatrix selber zerlegen (wie machst Du das eigentlich?) und vergleichen, bis Du weißt, wie Dein Grafikprogramm rechnet. (Oder in den Unterlagen suchen/Hersteller fragen).

Wenn Du Dir Operationen ausdenkst, die zu einer bestimmten T-Matrix führen, gibt Dir die verlinkte Formel eine Möglichkeit der Zerlegung. Wegen der schon mehrfach erwähnten Nicht-Eindeutigkeit kannst Du nicht erwarten eine Formel zu finden, die gerade die von Dir ausgedachte Variante findet.

Oder anders gesagt:

Du manipulierst ein Objekt. Das Grafikprogramm ermittelt mit seinem Algorithmus (den Du nicht kennst) die Abbildungsmatrix A und die drei einzelnen Matrizen.

Du willst nun aus gegebenem A auch die Einzelmatrizen berechnen und nutzt dazu Deinen Algorithmus (wie berechnest Du die drei denn genau?).

Wegen der Nicht-Eindeutigkeit der Zerlegung stimmen Deine gefundenen Matrizen nur dann mit denen überein, die das Grafikprogramm nutzt, wenn exakt derselbe Algorithmus genutzt wird (trotz gleicher Abbildungsmatrix).

Danke für eure Geduld!:)

Die Nichteindeutigkeit der Zerlegung habe ich verstanden.

Bei weiterem Experimentieren ist mir Folgendes aufgefallen: Die 6 möglichen Permutation der Reihenfolge teilen sich in 2 Gruppen auf. Jede Permutation einer Gruppe führt zur selben Transformationsmatrix, die sich aber von der anderen Gruppe unterscheidet. Und nur eins von beiden Ergebnissen zeigt den richtigen (sichtbaren) Rotationswinkel an.

Es bleibt mir also nichts anderes übrig, als in den Quellcode einzusteigen...

Vielen Dank für Hilfen und Anregungen!

Wkoncz

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