![]() |
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? |
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. |
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. |
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.)
|
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! |
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:
s deines Gerätekontexts abfragen:
Windows.tagPOINT
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:
kannst du ignorieren, wenn du keine Bézierkurven zeichnest.
Types
|
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.
|
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 22:50 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-2025 by Thomas Breitkreuz