Delphi-PRAXiS
Seite 2 von 2     12   

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 Liniendiagramm mit verschiedenen Farben (https://www.delphipraxis.net/145624-liniendiagramm-mit-verschiedenen-farben.html)

egal 5. Jan 2010 14:22

Re: Liniendiagramm mit verschiedenen Farben
 
Zitat:

Zitat von Torpedo
Ich habe mal einen Sinus programmiert, der je nach Steigung die Farbe ändert. So soll es sein, oder?
Ich kenne keine fertige Komponente, die die Farbe an die Steigung anpasst...

ja, so soll's sein, Kurven können aber verschieden sein. Für einen Tipp, wie du das gemacht hast, wäre ich dankbar. 8-)

markus5766h 5. Jan 2010 14:39

Re: Liniendiagramm mit verschiedenen Farben
 
Hallo,
... hab' auch mal 'nen bisschen rumprobiert :
Delphi-Quellcode:
var
Steigung : real;
Winkel  : real;

...


 Steigung := (x1 - x0) / (y1 - y0);
 Winkel := RadToDeg(arctan2(y1-y0, x1-x0));
 Winkel := (Trunc(Winkel * 10)) / 10;
Steigung gibt den Steigungswert (dezimal) zwischen zwei Punkten,
-beschrieben durch X0,Y0 und X1,Y1- aus, allerdings sind hier Werte von 0 ... unendlich
möglich, so dass eine Farbzuweisung schwierig wird.

Winkel gibt die Steigung in einem Bereich von -90,0 ... +90,0 grad zurück, wodurch die
Farbzuweisung schon etwas "übersichtlicher" wird.

Die Farben könnten z.B. in einem array gespeichert sein und über eine case-Anweisung
zugewiesen werden.
z.B.

Delphi-Quellcode:
const
 Colors : array[1..9] of TColor = (clBlue .....

...
case Winkel of
 0..10 : pen.Color := Colors[1];
11..20 : pen.Color := Colors[2];
 ...
end;
alternativ kann natürlich auch entsprechend des Winkels
ein Farbanteil (z.B. Rot) verändert werden.


... nur mal so als Denkanstoss

Torpedo 5. Jan 2010 17:25

Re: Liniendiagramm mit verschiedenen Farben
 
Zitat:

Zitat von egal
ja, so soll's sein, Kurven können aber verschieden sein. Für einen Tipp, wie du das gemacht hast, wäre ich dankbar. 8-)

Das funktioniert auch mit allen anderen Kurven, solange man die Steigung berechnen kann. Und wenn man sie zeichnen kann, kann man auch die Steigung berechnen. ;)
Habe es nicht in Delphi gemacht, sondern in Java, deshalb die Funktionsweise erklärt:

Naiv gesehen würde man einen Graphen so zeichnen, dass man einfach für jedes X ein Y berechnet und den Pixel X,Y auf eine bestimmte Farbe setzt. Besser ist es, wenn man die Koordinaten berechnet und sie dann mit den Koordinaten des vorherigen Punktes verbindet (Linie). Das heißt, man hat die Koordinaten vom aktuellen Punkt und die vom letzten Punkt. Aus zwei Punkten kann man ganz einfach die Steigung dazwischen berechnen (siehe unten). Aus dieser Steigung macht man dann noch eine Farbe und verbindet die zwei Punkte mit einer farbigen Linie.

Pseudocode:
Delphi-Quellcode:
      while ...
begin // jedes Teilstück des Graphen zeichnen
         lastX := nextX;
         lastY := nextY;
         
         nextX := neue X-Koordinate berechnen;
         nextY := neue Y-Koordinate berechnen;
         
         steigung := (nextY - lastY)/(nextX - lastX);
         color := 255/MAXIMALE_STEIGUNG * abs(steigung); // auf Datentypen und Rundungen achten
         if steigung >= 0 then
            setColor(Color(col, 0, 0));
         else
            setColor(Color(0, 0, col));
         
         drawLine((lastX, lastY, nextX, nextY );
      end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 Uhr.
Seite 2 von 2     12   

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