Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Canvas pixelkoordinaten parallel in Array zeichnen (https://www.delphipraxis.net/203949-canvas-pixelkoordinaten-parallel-array-zeichnen.html)

Vadda 9. Apr 2020 10:24

Canvas pixelkoordinaten parallel in Array zeichnen
 
Hallo,

die benötigte Funktion ist folgende:
- aus einem Prozes heraus wird in einem Diagramm ein Canvas Polynom gezeichnet, Anzahl der Punkte 15 - 20
- der Nutzer soll mittels Mausklick auf die Kurve dieses Polynom aufrufen können
- im Hintergrund soll dieses Event die Basisdaten für das Polynom aufrufen
- Meine Idee nun:
- während dem Canvas Zeichenvorgang die ID der jeweiligen Basisdaten für jedes Pixel in einem Array mit der gleichen Grösse wie die des Diagramms speichern
Die Alternative wäre die Erstellung der Kurve mit kleinen Schritten pixelweise anstelle der Benutzung der Canvas Polynomfunktion, aber ich denke, das ist viel zu langsam.
Hat hier jemand eine Idee?

Medium 9. Apr 2020 11:52

AW: Canvas pixelkoordinaten parallel in Array zeichnen
 
Du könntest auch nur die errechneten Stützpunkte des Polygons in ein Array/Liste packen, und dann OnMouseMove die Abstände der Maus zu den jeweiligen Strecken berechnen. (Bedenke dabei das Offset, das durch Fenster/Bitmap/Canvas Position dazu kommt.) Dann kann man nämlich sogar frei entscheiden, ab welcher Distanz das Polygon als "ausgewählt" gelten soll, sodass man nachher nicht auf einen Pixel genau klicken muss. Zu Abstand zwischen Punkt und Strecke finden sich viele Dinge online.
Und falls es dir reicht, dass man zum Auswählen nur nah an einen Stützpunkt sein muss, und die Linien zwischen diesen sind egal, dann wird's noch viel einfacher. Weil dann brauchst du ja nur die Abstände von Maus zu Punkten, und die sind wirklich flott errechnet.

Vadda 9. Apr 2020 13:27

AW: Canvas pixelkoordinaten parallel in Array zeichnen
 
Danke für die Antwort.
Das probiere ich mal aus, da ich nur schlecht abschätzen kann, wie gross der Auswahlbereich dann sein muß. Die Schwierigkeit dahinter ist, daß die Basispunkte sehr ungleich verteilt sind, und die Kurven zum Teil sehr nah beeinander sind.
Aber durch eine Interpolation vor der Darstellung kann dies deutlich reduziert werden. Interessant wäre dennoch gewesen, ob die Funktion von Delphi Canvas "umgeleitet" und in ein Array geschrieben werden kann.

Medium 9. Apr 2020 13:49

AW: Canvas pixelkoordinaten parallel in Array zeichnen
 
Nicht, dass ich wüsste. Da müsstest du dann selbst einen Algo schreiben, der "Linien im Array zeichnet". (Im einfachsten Fall könntest du natürlich erst auf den Canvas malen, und dann Pixel für Pixel durchgehen, und anhand der Farbwerte das dann ins Array übertragen. Spart ne Menge Arbeit.)

Vadda 9. Apr 2020 14:24

AW: Canvas pixelkoordinaten parallel in Array zeichnen
 
Warum kompliziert, wenn es auch einfach geht! Die Idee ist super: Eine ganz bestimmte Farbe nehmen, die Kurve in einer definierten Farbe zeichnen, ausgelesen, und dann in der gewünschten Farbe neu zeichnen. Die Rechenzeit ist hier unkritisch, und da der Zeichnungsbereich bekannt ist, muß nicht das ganze Bild durchsucht werden.
Danke nochmals!

Redeemer 9. Apr 2020 21:29

AW: Canvas pixelkoordinaten parallel in Array zeichnen
 
Ich bin mir nicht sicher, was du meinst. Willst du die Pixel eines Bildes in ein Array schreiben? Das ergibt wenig Sinn. Oder willst du die Eckpunkte eines Vielecks in einem Gerätekontext in ein Array laden?

Letztes geht recht einfach, indem du BeginPath(DeineCanvas.Handle) aufrufst, bevor das Zeichnen beginnt.
Nachdem gezeichnet wurde, kannst du so die
Delphi-Quellcode:
Windows.tagPOINT
s deines Gerätekontexts abfragen:
Delphi-Quellcode:
type
  TPoints = packed array of tagPOINT;
var
  Points: TPoints;
  Types: TBytes;
  Count: Integer;
begin
  Count := GetPath(DeineCanvas.Handle, Points[0], Types[0], 0); // Länge 0 vorgeben = zukünftige Länge abfragen
  SetLength(Points, Count);
  SetLength(Types, Count);
  GetPath(DeineCanvas.Handle, Points[0], Types[0], Count);
  // TuWas
  EndPath(DeineCanvas.Handle);
end;
Delphi-Quellcode:
Types
kannst du ignorieren, wenn du keine Bézierkurven zeichnest.

Vadda 10. Apr 2020 05:43

AW: Canvas pixelkoordinaten parallel in Array zeichnen
 
Da war ich nicht ganz eindeutig: aus einer Menge von Datensätzen werden einzelne Kurven erzeugt und zusammen angezeigt. Dafür gibt es zwei Möglichkeiten: direkte Anzeige unter Anwendung der Delphi Canvas Polygon Funktion oder das Polygon vorher berechnen und die einzelnen Kurvenpunkte dann zeichnen. Wenn nun eine Kurve aus der Kurvenschar angewählt wird, dann soll diese anders gezeichnet und die Kurvenzusatzdaten (das sind nicht die Kurvenpunkte!) in einem anderen Fenster angezeigt werden. Dafür brauche ich die Verbindung zwischen der Kennlinie auf dem Bildschirm und den Basisdaten. Dies würde über eine Rückrechnung auch funktionieren, aber ich habe eine Möglichkeit gesucht, welche parallel zu oder vor dem Zeichnen der Kurve die entsprechende Kurven ID in Array Zellen schreibt, so daß die Rückmeldung eines Mausklicks auf die gezeichnete Kennlinie mittels des Arrays direkt auf die KurvenID zeigt. Die Arraystruktur entspricht immer exakt der Pixelstruktur im Diagramfenster. Da die Kurven weder stetig noch weit auseinander liegen, ist die vereinfachte Form mittels gerader Hilfslinien zwischen den Kurvenpunkten zu ungenau.

Redeemer 10. Apr 2020 08:26

AW: Canvas pixelkoordinaten parallel in Array zeichnen
 
Kurven in (ggf. falls unerwünscht nur marginal) verschiedenen Farben zeichnen und dann anhand der angeklickten Farbe die Kurve bestimmen? Braucht man nur eine Zuordnung Farbe zur Kurvennummer, das geht am einfachsten mit TDictionary.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 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