![]() |
Firemonkey Bitmap Flip bzw. Mirror auf Canvas
Hi,
ich möchte gerne ein Bitmap auf einem Canvas um die eigene Achse spiegeln und um einen bestimmten Winkel drehen, hat jemand eine Idee wie ich folgenden Code anpassen kann?
Delphi-Quellcode:
ARect ist in meinem Fall die Position auf dem Canvas und Angle der Winkel im Grad.
var
cX, cY: Single; M: TMatrix; begin with ARect do begin cX := (Right - Left) / 2 + Left; cY := (Bottom - Top) / 2 + Top; end; M := TMatrix.Identity; M := M * TMatrix.CreateTranslation(-cX, -cY); M := M * TMatrix.CreateRotation(DegToRad(angle)); if Mirror then begin end; if Flip then begin end; M := M * TMatrix.CreateTranslation(cX, cY); |
AW: Firemonkey Bitmap Flip bzw. Mirror auf Canvas
Erst mal vorweg: Ich kenne jetzt nicht den TMatrix-Datentyp von Delphi, vielleicht "macht man das da ja so", aber normalerweise multipliziert man Matrizen in die andere Richtung. So wie du es machst finde ich es eher verwirrend, weil es die Reihenfolge genau entgegengesetzt dazu ist, wie die Transformationen hinterher tatsächlich ausgeführt werden.
Mal ein aus der Luft gegriffenes Beispiel: Du willst erst einen Vektor v um einen Winkel drehen und anschließend verschieben. Wenn jetzt A die Drehmatrix ist und B die Translationsmatrix (Verschiebungsmatrix), dann ist der transformierte Vektor v' = B*A*v (nicht A*B*v!). Solange dein Ergebnis stimmt, ist ja alles in Ordnung, aber es ist trotzdem verwirrend und ich würde den Code so umsortieren, dass die Matrix in die andere Richtung zusammengebaut wird. Zum eigentlichen Thema: Auf dem Delphi-DocWiki steht leider sehr wenig zum TMatrix-Datentyp, es gibt nicht mal eine Auflistung der Methoden. Leider habe ich nicht XE2 und kann daher auch nicht im Source-Code nachschauen, ob es eventuell schon eine Methode für Spiegelungen gibt. Du kannst dir Konstanten deklarieren:
Delphi-Quellcode:
Ah, na toll, die DP zerstört mal wieder die Formatierung...
// Horizontal spiegeln
const MATRIX_FLIP_H = (M: ((X: -1; Y: 0; W: 0), (X: 0; Y: 1; W: 0), (X: 0; Y: 0; W: 1))); // Vertikal spiegeln const MATRIX_FLIP_V = (M: ((X: 1; Y: 0; W: 0), (X: 0; Y: -1; W: 0), (X: 0; Y: 0; W: 1))); // Horizontal und vertikal spiegeln const MATRIX_FLIP_DIAG = (M: ((X: -1; Y: 0; W: 0), (X: 0; Y: -1; W: 0), (X: 0; Y: 0; W: 1))); (Oh Gott, mit den ganzen Klammern sieht das ja fast aus wie LISP-Quellcode :lol:). Eine von diesen Matrizen müsstest du dann in deinem Quellcode an der entsprechenden Stelle dranmultiplizieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz