Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Firemonkey Bitmap Flip bzw. Mirror auf Canvas (https://www.delphipraxis.net/177311-firemonkey-bitmap-flip-bzw-mirror-auf-canvas.html)

Peter666 30. Okt 2013 18:05

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:
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);
ARect ist in meinem Fall die Position auf dem Canvas und Angle der Winkel im Grad.

Namenloser 31. Okt 2013 05:59

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:
// 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)));
Ah, na toll, die DP zerstört mal wieder die Formatierung...
(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