Delphi-PRAXiS
Seite 1 von 3  1 23      

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/)
-   -   Delphi Pfeil auf einem Image platzieren (https://www.delphipraxis.net/213895-pfeil-auf-einem-image-platzieren.html)

fisipjm 16. Okt 2023 11:48

Pfeil auf einem Image platzieren
 
Hi,

ich bräuchte mal einen kleinen Denkanstoß.
Was ich versuche zu erreichen:

Ich habe ein TImage, dort ist irgend ein Bild geladen.
Auf diesem Bild möchte ich jetzt einen Pfeil platzieren können.
Das soll so funktionieren, das ich auf einen Punkt im Bild klicke und die Maustaste gedrückt halte. Dann kann ich den Pfeil an die Stelle ziehen, wo er hin zeigen soll. Der Pfeil soll von der Ursprünglichen Stelle an die letzte Position "wachsen". Also Endergebnis soll dann sein, wenn ich Unten rechts auf das Bild klicke und dann die Maus nach oben Links ziehe das ich dann einen Pfeil habe der von unten rechts nach oben links zeigt.

Ich hab das schon versucht mit SVG Grafiken umzusetzen, aber beim ändern der width und height, ändert sich logischerweise nur die Größe des gesamten Pfeils, nicht aber die Ausrichtung. Muss ich mir im MouseMove Event anhand von PressedPosition und X/Y den Winkel errechnen und die Pfeilspitze so bei der Maus halten?

Irgendwie hab ich das gefühlt ich bin in die Flasche Richtung unterwegs, hat das jemand schon mal umgesetzt und kann mir eine kleine Denkhilfe geben?:oops:

Gruß
PJM

itsChris 16. Okt 2023 13:30

AW: Pfeil auf einem Image platzieren
 
Moin,

schonmal im Internet recherchiert? Habe sofort etwas Nützliches gefunden, was einige deiner Kriterien erfüllt. Ist zwar kein schöner Pfeil, aber bei Canvas kann man auch nicht so viel erwarten.

https://www.swissdelphicenter.ch/en/...de.php?id=2426

Wenn sich der Pfeil mit deiner Maus bis zum Loslassen bewegen soll, dann musst du im MouseMove auch zeichnen.

Sinspin 16. Okt 2023 14:30

AW: Pfeil auf einem Image platzieren
 
Ich dachte doch jetzt glatt erst an ausdrucken ... Korkplatte ... Armbrust.

Aber OnMouseMove, OnMouseDown, XOR, lässt sicher genauere Ergebnisse zu.

himitsu 16. Okt 2023 16:04

AW: Pfeil auf einem Image platzieren
 
XOR und so, war, damit man auf ein Bild zeichnen und das gezeichnete durch nochmaliges zeichnen wieder löschen zurücksetzen kann.

* entweder man malt das Bild neu und darauf erneut den neuen Pfeil
* oder man malt eben nicht auf das Bild (Bitmap), sondern nur darüber

Da man nun doch nicht auf ein TImage zeichnen kann, also nur dauf den "sichtbaren" Canvas des TImage, und nicht ins Canvas des Bildes
https://www.delphipraxis.net/213846-...nd-bitmap.html

* entweder ein Cast und sich das "richtige" Canvas besorgen
* oder z.B. eine TPaintBox über das TImage legen
* oder direkt eine TPaintBox benutzen (anstatt TImage) und dann Pfeil und Bild (TBitmap oder so) selbst auf's Canvas zeichnen
* oder
* oder
* oder

fisipjm 17. Okt 2023 08:19

AW: Pfeil auf einem Image platzieren
 
Moin,

vielen Dank für die hilfreichen Tipps. Entschuldigung, wenn ich mich zuvor ungenau ausgedrückt habe. Ich habe jetzt einen Ansatz, der soweit funktioniert. Mein eigentliches Problem bestand darin, dass ich nicht wusste, wie ich die Maus der Bewegung meines Bildes folgen lassen kann. Hier ist, wie ich es gelöst habe:

Ich verwende ein TSkSVG-Objekt aus der Skia4Delphi-Bibliothek für das Overlay auf dem Bild. An dieser Stelle möchte ich ein großes Lob für diese wirklich großartige Bibliothek aussprechen.

Für die Mausverfolgung nutze ich jetzt die ArcTan2-Funktion, um den Winkel zu bestimmen. Hier ist der relevante Code:

Delphi-Quellcode:
procedure OnImageControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
  function CalculateDistance(x1, y1, x2, y2: Double): Double;
  begin
    Result := Sqrt(Sqr(x2 - x1) + Sqr(y2 - y1));
  end;

begin
  if FPointIsOnHold then
  begin
Arrow.Height := CalculateDistance(FImage.PressedPosition.X, FImage.PressedPosition.Y, X, Y);
          Arrow.Width := Arrow.Height;

          Arrow.Position.Y := FImage.PressedPosition.Y - (Arrow.Height / 2);
          Arrow.Position.X := FImage.PressedPosition.X - (Arrow.Width);

          Arrow.RotationAngle := RadToDeg(ArcTan2(FImage.PressedPosition.Y - Y, FImage.PressedPosition.X - X));
  end;
Der ursprüngliche Pfeil, den ich anzeige, zeigt von rechts nach links und ist auf seiner vertikalen Achse zentriert. Die SVG-Größe (Höhe und Breite) ist immer identisch mit dem Radius in meinem "imaginären Kreis", der sich um meinen Ausgangspunkt erstreckt, wenn ich die Maus von der ursprünglichen Klickposition wegbewege. Die ArcTan2-Funktion in Kombination mit der RadtoDeg-Funktion gibt mir den Winkel an, in dem sich die Maus im Vergleich zur ursprünglichen Pfeilrichtung (von rechts nach links) befindet. Die Position des Pfeils wird nach jeder Größenänderung wieder auf "Mittig Rechts" gesetzt. Das RotationCenter ist im OnMouseDown-Event auf Y=0.5 und X=1 definiert.

Bis hierhin funktioniert alles wie gewünscht. Das Problem ist jedoch, dass sich die Strichstärke des Pfeils ändert, wenn ich das Objekt vergrößere. Das ergibt irgendwie Sinn :pale:. Eigentlich möchte ich, dass nur die Länge des Pfeils verlängert wird, während der Kopf und die Strichstärke gleich bleiben. Habe ich vielleicht den falschen Ansatz gewählt?

Edit:
Ich bewege mich ausschließlich im FMX Umfeld.

Sinspin 17. Okt 2023 09:21

AW: Pfeil auf einem Image platzieren
 
Du schießt noch immer mit Kanonen auf Ameisen, Spatzen wären noch immer viel zu groß für diesen Vergleich.
Ein Pfeil sind 3 oder 4 Linien. Nix mit SVG oder sonstwas. Das macht alles nur unnötig umständlich. Und Kreisfunktionen, für was?
Nimm erstmal einfach ein Image, das hat ein Canvas. Das hat eine Procedure Line(Punk1, Punkt2).
Bei Click merkst du dir Punkt1, Solange sich die Maus bewegt bekommst du Punkt2 und rufst Line(Punkt1, Punkt2) auf.
Nächster Click, die Linie ist final. Damit dazwischen nicht das ganze Bild voller Linien ist brauchst du entweder ein ansonsten duchsichtiges Overlay über deinen Bild was du bei jedem neu zeichnen einmal löscht.
Oder der Zeichenmode für deine Linie muss XOR sein und zu zeichnest die alte Linie nochmal an die gleiche Stelle bevor du die geänderte zeichnest.

fisipjm 17. Okt 2023 10:06

AW: Pfeil auf einem Image platzieren
 
Zitat:

Zitat von Sinspin (Beitrag 1528226)
Du schießt noch immer mit Kanonen auf Ameisen, Spatzen wären noch immer viel zu groß für diesen Vergleich.
Ein Pfeil sind 3 oder 4 Linien. Nix mit SVG oder sonstwas. Das macht alles nur unnötig umständlich. Und Kreisfunktionen, für was?
Nimm erstmal einfach ein Image, das hat ein Canvas. Das hat eine Procedure Line(Punk1, Punkt2).
Bei Click merkst du dir Punkt1, Solange sich die Maus bewegt bekommst du Punkt2 und rufst Line(Punkt1, Punkt2) auf.
Nächster Click, die Linie ist final. Damit dazwischen nicht das ganze Bild voller Linien ist brauchst du entweder ein ansonsten duchsichtiges Overlay über deinen Bild was du bei jedem neu zeichnen einmal löscht.
Oder der Zeichenmode für deine Linie muss XOR sein und zu zeichnest die alte Linie nochmal an die gleiche Stelle bevor du die geänderte zeichnest.

Hi Sinspin,

danke für deine Rückmeldung. Ich brauche eine allgemeingültige Lösung, im Nachgang, wenn ich diese dann hab, kommen da noch unterschiedliche geometrische Formen hinzu (Sterne, Kreise, Quadrate, Ameisen :) ).
Das ganze soll auch mobil laufen. Aus diesen Gründen bin ich auf die SVG Variante gegangen.

Gruß
PJM

Sinspin 17. Okt 2023 11:35

AW: Pfeil auf einem Image platzieren
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hm, Ich finde Blumen besser als Kanonen. Bekommt man auch Spatzen und Ameisen darunter versteckt. Trotzdem war ich jetzt zu Faul eine zu malen. Selbst für einen Pfeil war ich jetzt zu Faul.
Aber man sieht trotzdem dass es geht. Siehe Anhang!

fisipjm 17. Okt 2023 13:35

AW: Pfeil auf einem Image platzieren
 
Zitat:

Zitat von Sinspin (Beitrag 1528243)
Hm, Ich finde Blumen besser als Kanonen. Bekommt man auch Spatzen und Ameisen darunter versteckt. Trotzdem war ich jetzt zu Faul eine zu malen. Selbst für einen Pfeil war ich jetzt zu Faul.
Aber man sieht trotzdem dass es geht. Siehe Anhang!

Hi Sinspin,

vielen Dank, dass du ein Beispielprojekt gemacht hast. Ich werde es mir anschauen und schau mal ob ich es adaptieren kann.:thumb:

Grüße
PJM

Jens01 17. Okt 2023 14:07

AW: Pfeil auf einem Image platzieren
 
Für den nächsten Schritt kannst ja mal hier gucken.
Ich glaube, da gibt es auch Layer, die Du verschieben kannst.
https://angusj.com/image32/Docs/Examples.htm


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr.
Seite 1 von 3  1 23      

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