Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi SetWorldTransform - Grafik drehen (https://www.delphipraxis.net/209176-setworldtransform-grafik-drehen.html)

Alter Mann 5. Nov 2021 13:49

SetWorldTransform - Grafik drehen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,

zu Feinabgleich eines Kamerabildes soll/muss dieses sowohl in X/Y Richtung, als auch
im Winkel ausgerichtet werden.
Die Nutzung der hier viel empfohlenden Routine mit SetWorldTransform bringt es
aber nicht, da der Drehpunkt nicht die Mitte des Quellbildes ist, sondern die des Zieles.
Delphi-Quellcode:
procedure SetCanvasZoomAndRotation(ACanvas: TCanvas; Zoom: Double;
  Angle: Double; CenterpointX, CenterpointY: Double);
var
  form: tagXFORM;
  rAngle: Double;
begin
  rAngle := Angle/ 360 * PI *2;
  SetGraphicsMode(ACanvas.Handle, GM_ADVANCED);
  SetMapMode(ACanvas.Handle, MM_ANISOTROPIC);
  form.eM11 := Zoom * Cos(rAngle);
  form.eM12 := Zoom * Sin(rAngle);
  form.eM21 := Zoom * (-Sin(rAngle));
  form.eM22 := Zoom * Cos(rAngle);
  form.eDx := CenterpointX;
  form.eDy := CenterpointY;
  SetWorldTransform(ACanvas.Handle, form);
end;
Aufruf erfolg so:
Delphi-Quellcode:
procedure TForm1.btnDClick(Sender: TObject);
var
  i, w, h: Integer;
  C: TCanvas;
begin
  C := pbBase.Canvas;  // dort will ich hinzeichnen
  SetCanvasZoomAndRotation(C, trckbrZ.Position, trckbrA.Position, trckbrX.Position, trckbrY.Position);
  C.Draw(0, 0, imgTarget.Picture.Graphic); // imgTarget ist die Quelle
end;
Was muss ich wie abändern, damit der Drehpunkt die Mitte des Quellbild ist
und nicht oben links (siehe Anhang).

venice2 5. Nov 2021 13:55

AW: SetWorldTransform - Grafik drehen
 
Einfache suche.
https://stackoverflow.com/questions/...-by-real-angle

Alter Mann 5. Nov 2021 15:56

AW: SetWorldTransform - Grafik drehen
 
Danke, kannte ich noch nicht.

Läuft aber ohne Anpassung auch nicht:
Zitat:

Auf private-Symbol TGPMatrix.RotateAt kann nicht zugegriffen werden
Mal schauen was da noch so kommt.

[Edit]
Lauffähig ist der Code nicht, muss komplett überarbeitet werden.
Zu viele Zugriffe auf Private-Symbole.

Also nix mit einfache Suche.
[/Edit]

Michael II 5. Nov 2021 16:54

AW: SetWorldTransform - Grafik drehen
 
Tipps:
Einlesen ins Thema Affine Abbildungen

Allgemein: Du solltest den Drehpunkt in den Ursprung zurück ziehen, danach die lineare Abbildung "drehen und skalieren" ausführen und zuletzt den Drehpunkt ins Ziel schieben. Dann hast du M und e ermittelt.

Es geht auch anders:
Speziell bei deiner Anwendung könntest du die Matrix M und den Translationsvektor e auch ermitteln, indem du drei Punkte A,B,C in Quelle wählst und für diese Punkte definierst, wo diese im Ziel liegen sollen.

Es gilt:

(G)
x' = x * eM11 + y * eM21 + eDx
y' = x * eM12 + y * eM22 + eDy

Setze in diesem Gleichungssystem nacheinander die Quell- und Ziel-Koordinaten der drei Punkte ein.

Dies führt zu insgesamt sechs Gleichungen mit den sechs Unbekannten M11, M12, M21, M22 und eDx, eDy.

Löse nach den Unbekannten auf. Damit hast du die Werte für deine Variable form ermittelt.

Bei Mathe Anwendungen wählt man oft A(0,0), B(1,0) und C(0,1). Wenn wir A und A' in (G) einsetzen erhalten direkt eDx, eDy. Wenn wir danach B, B' einsetzen M11, M12. Und M21, M22 ergeben sich durch einsetzen von C, C'. Bei deiner Anwendung wirst du eher drei spezielle Punkte im Bild wählen wollen.

Mit diesem Ansatz berücksichtigst du neben "Skalieren und Drehen um P auch zum Beispiel Scherungen.

(( Nebenbei. Je nachdem wie perfekt du die Aufgabe erledigen musst, wirst du mit affinen Abbildungen eventuell nicht glücklich, da du bei Objektiven immer auch nichtlineare Verzerrungen hast, welche du vielleicht auch eliminieren willst. ))

Alter Mann 5. Nov 2021 17:32

AW: SetWorldTransform - Grafik drehen
 
So, so: Affine Abbildungen

Wird Interessant. Danke.

Rollo62 5. Nov 2021 17:39

AW: SetWorldTransform - Grafik drehen
 
Zitat:

Zitat von Alter Mann (Beitrag 1497170)
So, so: Affine Abbildungen

Oder man nimmt gleich was von [RatioPh...], ... ähem ... Angus Johnson,

das erspart einem die Neuerfindung von Rädern :stupid:

Michael II 5. Nov 2021 20:53

AW: SetWorldTransform - Grafik drehen
 
Ich glaube nicht, das man durch Einsetzen der Parameter der affinen Abbildung in SetWorldTransform() gleich das Rad neu erfindet.

Das ist so ähnlich wie das Einsetzen eines Strings in ShowMessage() - nur hier halt mit Zahlen.

Wenn wir bei Lösungen Dritter sind... Graphics32 ist auch bestens geeignet für solche Aufgaben (verschiedene Filter); und extrem schnell ist's auch.

Und Firemonkey kennt solche Dinge ja auch von Haus aus - ohne Wenn und Räder... ;-).

Rollo62 6. Nov 2021 11:12

AW: SetWorldTransform - Grafik drehen
 
Ja sicher, ich meine ja nur wenn man nicht so tief drinsteckt,
dann gibt es dafür auch einfach anzuwendende Lösungen.

G32 ist super, Image32 ist aber so eine Art Nachfolger, auch FMX geeignet.

Muss am Ende jeder selbst entscheiden.

Alter Mann 6. Nov 2021 12:57

AW: SetWorldTransform - Grafik drehen
 
Image32, sieht gut aus.

Danke.

venice2 10. Nov 2021 12:33

AW: SetWorldTransform - Grafik drehen
 
Nochmal eine Frage muß es unbedingt SetWorldTransform sein?
Oder reicht dir sowas wie im Anhang zu sehen.

Wenn es nur darum geht ein Image zentriert zu drehen.
Sag bescheid ich sende dir einen Link über PN!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 Uhr.
Seite 1 von 2  1 2      

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