Wert zurückrechnen
-
Hi,
aus der folgenden Funktion will ich den Parameter a zurückrechnen m11, m12, m21 und m22 sind mir dabei bekannt(zwei Nachkommastellen reichen).
QMatrix &QMatrix::rotate(qreal a) { qreal sina = 0; qreal cosa = 0; if (a == 90. || a == -270.) sina = 1.; else if (a == 270. || a == -90.) sina = -1.; else if (a == 180.) cosa = -1.; else{ qreal b = deg2rad*a; // convert to radians sina = sin(b); // fast and convenient cosa = cos(b); } qreal tm11 = cosa*_m11 + sina*_m21; qreal tm12 = cosa*_m12 + sina*_m22; qreal tm21 = -sina*_m11 + cosa*_m21; qreal tm22 = -sina*_m12 + cosa*_m22; _m11 = tm11; _m12 = tm12; _m21 = tm21; _m22 = tm22; return *this; }
ich bekomm da auf keine richtige Lösung.
MFG
flux05
-
Hier das ganze mal sauber angeschrieben:
\left( \begin{array}{*{2}{c}} m_{11} & m_{12} \\ m_{21} & m_{22} \\ \end{array} \right) * \left( \begin{array}{*{2}{c}} cos(a) & sin(a) \\ -sin(a) & cos(a) \\ \end{array} \right) = \left( \begin{array}{*{2}{c}} tm_{11} & tm_{12} \\ tm_{21} & tm_{22} \\ \end{array} \right)Fals m und tm bekannt sind dann dürfte es leicht sein sich zwei Gleichungen mit sin(a) und cos(a) drin zu bauen und dann mit atan2 einen Wert für a zu ermitteln.
Falls nur tm oder m bekannt ist dann ist a nicht eindeutig bestimmt würde ich sagen.
-
mir ist nur m bekannt die lokalen variablen tm nicht. Hilft es weiter wenn ich die initialisierungswerte von m weiss?
MFG
flux05
-
die tm werden doch zurueckgegeben, oder?
-
nein die _m Werte werden zurückgegeben
-
Aufn ersten Blick würd ich sagen des geht nicht eindeutig, wegen z.B.
if (a == 90. || a == -270.) sina = 1.; else if (a == 270. || a == -90.) sina = -1.;
Du hast keinen eindeutige Zuordnung durch diese Auswahl drin.
-
@Zwergli
Das ist das allgemeine Problem bei den Winkeln. Wenn man nur cos und sin kennt dann gibt unendlich viele Winkel die alle um 2pi verschieden sind.Der ganze Block
qreal sina = 0; qreal cosa = 0; if (a == 90. || a == -270.) sina = 1.; else if (a == 270. || a == -90.) sina = -1.; else if (a == 180.) cosa = -1.; else{ qreal b = deg2rad*a; // convert to radians sina = sin(b); // fast and convenient cosa = cos(b); }
ist zu folgendem Äquivalent
qreal sina = sin(deg2rad*a); qreal cosa = cos(deg2rad*a);
Was bis auf 2pi genau zurückgerechnet werden kann.
mir ist nur m bekannt die lokalen variablen tm nicht.
Dann ist es nicht möglich zurück zu rechnen. Und selbst wenn m und tm bekannt sein sollten dann muss m noch umkehrbar sein.
\left( \begin{array}{*{2}{c}} m_{11} & m_{12} \\ m_{21} & m_{22} \\ \end{array} \right) * \left( \begin{array}{*{2}{c}} cos(a) & sin(a) \\ -sin(a) & cos(a) \\ \end{array} \right) = \left( \begin{array}{*{2}{c}} tm_{11} & tm_{12} \\ tm_{21} & tm_{22} \\ \end{array} \right) \left( \begin{array}{*{2}{c}} cos(a) & sin(a) \\ -sin(a) & cos(a) \\ \end{array} \right) = \frac{1}{det(m)}* \left( \begin{array}{*{2}{c}} m_{22} & -m_{12} \\ -m_{21} & m_{11} \\ \end{array} \right)* \left( \begin{array}{*{2}{c}} tm_{11} & tm_{12} \\ tm_{21} & tm_{22} \\ \end{array} \right)
-
Ok danke euch dann muss ich den Parameter irgendwie speichern im Programm
MFG
flux05