0

Nehmen Sie ein Bild I der Dimension (2, 2). Grafische Koordinaten C sind gegeben als:Drehen Sie ein Bild um seine Mitte auf einer GPU

C = [[0, 0], [1, 0], 
    [0, 1], [1, 1]] 

Ziel: drehe ich um 90 Grad um die Mitte (den Ursprung).

Transformation Matrix:

TRotate (90) = [[0, 1], [1, 0]]

(Angenommen jedes Koordinatenpaar in Lockstep-transformiert werden kann (dh auf eine GPU))

Methode:.

  1. Conv Geben Sie grafische Koordinaten in mathematische Koordinaten mit dem Ursprung als Bildmitte ein.
  2. Wenden Sie die Transformationsmatrix an.
  3. Zurück in grafische Koordinaten konvertieren.

Eg:

zur graphischen Koordinaten Konvertieren:

tx '= tx - Breite/2

ty' = ty - Breite/2

C' =[[-1, -1], [0, -1], 
    [-1, 0], [0, 0]] 

Wenden Sie die Transformationsmatrix an:

C" = [[-1, 1], [-1, -0], 
     [0, 1], [0, 0]] 

Konvertieren zurück:

C" = [[0, 2], [0, 1], 
     [1, 2], [1, 1]] 

die Umwandlung zurück außerhalb der Grenzen ist ...

Ich bin wirklich eine richtige Rotation zu bekommen über einen ‚Schwerpunkt‘ Arbeits kämpfen. Ich denke, dass meine Konvertierung in 'mathematische Koordinaten falsch ist'.

hatte ich mehr Glück durch eher die Koordinaten in die folgende Umwandlung:

C' =[[-1, -1], [1, -1], 
    [-1, 1], [1, 1]] 

I diese Umwandlung erreicht, indem das Beobachten, ob der Ursprung zwischen den vier Pixeln existiert in mit der + Y-Achse ve nach unten gerichtet , und die + ve x-Achse nach rechts, dann wäre der Punkt (0,0) (-1, -1) usw. für den Rest. (Die resultierende Rotation und Umwandlung ergibt das gewünschte Ergebnis).

Jedoch kann ich nicht finden die richtige Art von Transformation auf die Koordinaten anwenden, um den Ursprung in der Mitte zu platzieren. Ich habe eine Transformationsmatrix mit homogenen Koordinaten ausprobiert, aber das funktioniert nicht.

bearbeiten

Malcolm Rat:

Positionsvektor =

[0 
0 
1] 

Übersetzen von Breite Subtrahieren/2 == 1:

[-1 
-1 
0] 

Drehen durch die Multiplikation Transformationsmatrix:

|-1| | 0 1 0| |-1| 
|-1| X |-1 0 0| = | 1| 
|0 | | 0 0 1| | 0| 

Antwort

1

Sie benötigen eine zusätzliche Zeile in Ihrer Matrix, für die Übersetzung von x und die Übersetzung von y. Sie fügen dann Ihrem Positionsvektor eine zusätzliche Spalte hinzu, nennen Sie sie w, die fest auf 1 codiert ist. Dies ist ein Trick, um sicherzustellen, dass die Übersetzung mit Standard-Matrixmultiplikation durchgeführt werden kann.

Da Sie eine Übersetzung gefolgt von einer Drehung benötigen, müssen Sie die Übersetzungsmatrix einrichten und dann eine Multiplikation mit der Rotationsmatrix durchführen (machen Sie sie 3x3s, wobei die letzte Spalte ignoriert wird, wenn Sie bei Matrixmultiplikation wackelig sind) . So werden die Übersetzungen und Drehungen miteinander verflochten.

+0

Hallo Malcom. Meinst du eine zusätzliche Zeile im Positionsvektor so [x, y, w], mit w = 1? Und meinst du eine zusätzliche Spalte und Zeile zur Transformationsmatrix? – user1658296

+1

Sie können sich Ihren Punkt in Spalten oder Zeilen vorstellen. Wenn Sie ihn also als [x y w] zeichnen, hat er Spalten. Wenn Sie ihn vertikal zeichnen, hat er Zeilen. Es spielt keine Rolle, solange die Matrix das umgekehrte Format verwendet (Zeilen stimmen mit Spalten überein und umgekehrt). Es kann jedoch leichter verständlich machen, ob die Matrix quadratisch ist. –

+0

Danke, Malcolm, das Ergebnis ist jedoch schwer in grafische Koordinaten zu übersetzen. [-1, 1, 0] sollte der Punkt [0, 1] in grafischen Koordinaten sein. – user1658296