AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi SetWorldTransform - Grafik drehen

SetWorldTransform - Grafik drehen

Ein Thema von Alter Mann · begonnen am 5. Nov 2021 · letzter Beitrag vom 11. Nov 2021
Antwort Antwort
Seite 1 von 2  1 2   
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
903 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

SetWorldTransform - Grafik drehen

  Alt 5. Nov 2021, 14:49
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).
Miniaturansicht angehängter Grafiken
demo.png  
Angehängte Dateien
Dateityp: zip DemoTransform.zip (4,8 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
venice2

Registriert seit: 5. Dez 2019
Ort: Köln
829 Beiträge
 
Delphi 2010 Architect
 
#2

AW: SetWorldTransform - Grafik drehen

  Alt 5. Nov 2021, 14:55
Einfache suche.
https://stackoverflow.com/questions/...-by-real-angle
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
903 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: SetWorldTransform - Grafik drehen

  Alt 5. Nov 2021, 16:56
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]

Geändert von Alter Mann ( 5. Nov 2021 um 17:09 Uhr) Grund: Zusatz
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
611 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: SetWorldTransform - Grafik drehen

  Alt 5. Nov 2021, 17:54
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. ))
Michael Gasser

Geändert von Michael II ( 5. Nov 2021 um 18:13 Uhr)
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
903 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: SetWorldTransform - Grafik drehen

  Alt 5. Nov 2021, 18:32
So, so: Affine Abbildungen

Wird Interessant. Danke.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.347 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: SetWorldTransform - Grafik drehen

  Alt 5. Nov 2021, 18:39
So, so: Affine Abbildungen
Oder man nimmt gleich was von [RatioPh...], ... ähem ... Angus Johnson,

das erspart einem die Neuerfindung von Rädern
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
611 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: SetWorldTransform - Grafik drehen

  Alt 5. Nov 2021, 21:53
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... .
Michael Gasser

Geändert von Michael II ( 6. Nov 2021 um 08:55 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.347 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: SetWorldTransform - Grafik drehen

  Alt 6. Nov 2021, 12:12
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.
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
903 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: SetWorldTransform - Grafik drehen

  Alt 6. Nov 2021, 13:57
Image32, sieht gut aus.

Danke.
  Mit Zitat antworten Zitat
venice2

Registriert seit: 5. Dez 2019
Ort: Köln
829 Beiträge
 
Delphi 2010 Architect
 
#10

AW: SetWorldTransform - Grafik drehen

  Alt 10. Nov 2021, 13:33
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!

Geändert von venice2 (25. Nov 2021 um 20:24 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf