Hallo Leute,
wollte erst keinen Thread extra aufmachen, weil es doch sehr banal ist, aber bekomme es einfach nicht gelöst. Ich habe eine Matrix beliebiger Größe, sagen wir mal 2x2, diese möchte ich drehen mittels einer Rotationsmatrix (da es später auch für größere Matrizen funktionieren soll und mit belieben Winkeln, keine 90°-270° Rotationsmatrizen sondern mit Sinus- und Cosinus-Funktion). Habe also diese hier:
und daraus ergibt sich ja:
Und damit man die Matrix um einen Punkt (Mitte) drehen kann habe ich folgendes als Code:
Bei den zwei Zeile für x und y habe ich zwei Varianten versucht, eine 3D-Roll, eine 2D-Rotate und beide geben ein "kaputtes" Ergebnis, denn aus:
wird nicht bei 90°:
sondern:
Also offensichtlich nach rechts verschoben. Habe das gelöst mit -1 in der Formel aber bei anderen Winkeln bringt das nichts, bei 180° ist die Verschiebung zB in Y-Richtung um 1. Bei geraden Matrizen also 2x2 4x4 ist es immer um 1.0 verschoben, bei ungeraden, wie 3x3 um 0.5
Bei 1000x1000 Matrizen für Bilder ist das irrelevant aber bei so kleinen Matrizen nicht ganz.
Hoffentlich kann mir da wer weiter helfen :x
LG Frank
wollte erst keinen Thread extra aufmachen, weil es doch sehr banal ist, aber bekomme es einfach nicht gelöst. Ich habe eine Matrix beliebiger Größe, sagen wir mal 2x2, diese möchte ich drehen mittels einer Rotationsmatrix (da es später auch für größere Matrizen funktionieren soll und mit belieben Winkeln, keine 90°-270° Rotationsmatrizen sondern mit Sinus- und Cosinus-Funktion). Habe also diese hier:
und daraus ergibt sich ja:
Und damit man die Matrix um einen Punkt (Mitte) drehen kann habe ich folgendes als Code:
C-Quellcode
- std::vector<T> mat(mat_.size());
- for(int Y = 0; Y < m_; Y++) {
- int row = Y * n_;
- for (int X = 0; X < n_; X++)
- {
- float xt = X - center[0];
- float yt = Y - center[1];
- int x = (cos * X) + (-sin * Y) + (center[0] - cos * center[0] - (-sin * center[1]));
- int y = (sin * X) + (cos * Y) + (center[1] - sin * center[0] - cos * center[1]);
- //int x = (int)(center[0] + xt * cos - yt * sin);
- //float y = (int)(center[1] + xt * sin + yt * cos);
- if(x >= 0 && x < n_ && y >= 0 && y < m_) mat[row + X] = get(y, x);
- }
- }
Bei den zwei Zeile für x und y habe ich zwei Varianten versucht, eine 3D-Roll, eine 2D-Rotate und beide geben ein "kaputtes" Ergebnis, denn aus:
1 | 2 |
3 | 4 |
wird nicht bei 90°:
3 | 1 |
4 | 2 |
sondern:
0 | 3 |
0 | 4 |
Also offensichtlich nach rechts verschoben. Habe das gelöst mit -1 in der Formel aber bei anderen Winkeln bringt das nichts, bei 180° ist die Verschiebung zB in Y-Richtung um 1. Bei geraden Matrizen also 2x2 4x4 ist es immer um 1.0 verschoben, bei ungeraden, wie 3x3 um 0.5
Bei 1000x1000 Matrizen für Bilder ist das irrelevant aber bei so kleinen Matrizen nicht ganz.
Hoffentlich kann mir da wer weiter helfen :x
LG Frank
Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „xd-franky-5“ ()