AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Firemonkey Bitmap Flip bzw. Mirror auf Canvas

Ein Thema von Peter666 · begonnen am 30. Okt 2013 · letzter Beitrag vom 31. Okt 2013
Antwort Antwort
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#1

Firemonkey Bitmap Flip bzw. Mirror auf Canvas

  Alt 30. Okt 2013, 18:05
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.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Firemonkey Bitmap Flip bzw. Mirror auf Canvas

  Alt 31. Okt 2013, 05:59
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 ).

Eine von diesen Matrizen müsstest du dann in deinem Quellcode an der entsprechenden Stelle dranmultiplizieren.

Geändert von Namenloser (31. Okt 2013 um 06:03 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz