![]() |
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:
Aufruf erfolg so:
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;
Delphi-Quellcode:
Was muss ich wie abändern, damit der Drehpunkt die Mitte des Quellbild ist
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; und nicht oben links (siehe Anhang). |
AW: SetWorldTransform - Grafik drehen
|
AW: SetWorldTransform - Grafik drehen
Danke, kannte ich noch nicht.
Läuft aber ohne Anpassung auch nicht: Zitat:
[Edit] Lauffähig ist der Code nicht, muss komplett überarbeitet werden. Zu viele Zugriffe auf Private-Symbole. Also nix mit einfache Suche. [/Edit] |
AW: SetWorldTransform - Grafik drehen
Tipps:
Einlesen ins Thema ![]() 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. )) |
AW: SetWorldTransform - Grafik drehen
So, so: Affine Abbildungen
Wird Interessant. Danke. |
AW: SetWorldTransform - Grafik drehen
Zitat:
![]() das erspart einem die Neuerfindung von Rädern :stupid: |
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... ![]() Und Firemonkey kennt solche Dinge ja auch von Haus aus - ohne Wenn und Räder... ;-). |
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. |
AW: SetWorldTransform - Grafik drehen
Image32, sieht gut aus.
Danke. |
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 11:17 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 by Thomas Breitkreuz