Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Diagramme in Echzeit zeichnen - "Plots" (https://www.delphipraxis.net/34061-diagramme-echzeit-zeichnen-plots.html)

bigg 16. Nov 2004 21:42


Diagramme in Echzeit zeichnen - "Plots"
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich versuche mich momentan daran ein Diagramm in Echtzeit zu zeichnen.
Mein Problem dabei ist, das ist nicht weiß, wie ich die Position setzen soll, wenn
das Daten-Array endet.

Das Daten-Array hat eine bestimmte Länge. (=Diagrammbreite / pro Wert ein Pixel)
Wenn ich das Array auf unendlich laufen lassen, wird alles richtig gezeichnet.
Ich steh da momentan auf dem Schlauch :?
Vieleicht bin ich auch falsch an die Sache ran gegegangen :gruebel:

Hier ist der bisherige Code:

Mystic 16. Nov 2004 23:00

Re: Diagramme in Echzeit zeichnen - "Plots"
 
Ich hab Schwachsinn geschrieben. Bitte löschen. *seufz*

:wall: :wall: :wall:

http://www.delphipraxis.net/images/a...d1581b2738.jpg

bigg 17. Nov 2004 01:00

Re: gelöst! - Diagramme in Echzeit zeichnen - "Plots&am
 
Ich passe jetzt das Array dynamisch an.

Ben1 17. Nov 2004 07:18

Re: gelöst! - Diagramme in Echzeit zeichnen - "Plots&am
 
Ich hab schon ein parr mal ähnliches geschrieben, in C, VB und Pascal. Dabei hatte ich ein festes Array genommen und über zwei Indizes ("erstes","letztes" Feld mit gültigem Wert) den Bereich im Array markiert der meine aktuellen Werte enthielt.

Immer wenn ein neuer Wert kam wurde "letztes" inkrementiert, sollte es dann das selbe sein wie "erstes" dann wurde zusätzlich auch noch "erstes" inkrementiert. Das heißt das alte Werte im Array überschreiben wurden, also eine Art Ringspeicherung.

Der Vorteil dieser Methode ist das man den Maßstab des Diagramms nicht anpassen muss. Die Werte die man überschreibt kann man bei Bedarf in ein anderes Array schreiben und wenn das voll ist ,in ne Datei quetschen.

bigg 17. Nov 2004 10:51

Re: gelöst! - Diagramme in Echzeit zeichnen - "Plots&am
 
ich werde das diagramm mal zu einem späteren Zeitpunkt abändern.
Die Performance ist ja nicht so doll :?

bigg 19. Nov 2004 23:07

Re: Diagramme in Echzeit zeichnen - "Plots"
 
Liste der Anhänge anzeigen (Anzahl: 2)
Für die diejenigen die es interessiert:
Ich habe nun das Flußdiagramm optimiert.

Luckie 20. Nov 2004 00:16

Re: Diagramme in Echzeit zeichnen - "Plots"
 
LOL:
Delphi-Quellcode:
{Länge des Arrays festlegen, Laufzeit ca. einen Monat nonStop
bei einer Aktualisierungs-Zeit von 1000ms}
  SetLength(Data, Month);
Mach dir ein dynamisches Array, das so groß ist, wie das Diagramm Pixel breit. Und dann füllst du es von hinten und zeichnest es von vorne:

Code:
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Code:
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 |
Code:
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 5 |
Code:
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 5 | 2 |
Code:
| 0 | 0 | 0 | 0 | 0 | 0 | 3 | 5 | 2 | 4 |
Und wenn du vorne angekommen bist, fängst du wieder an es von hinten zu füllen.

bigg 20. Nov 2004 00:33

Re: Diagramme in Echzeit zeichnen - "Plots"
 
eigentlich ist der Weg, den ich gewählt habe gar nicht so schlecht, da man die Messdaten ja noch benutzen könnte.
Okay man könnte Sie auch in eine Datei schreiben :wink:

mal sehen wie sich das Ganze entwickeln wird.

Luckie 20. Nov 2004 01:02

Re: Diagramme in Echzeit zeichnen - "Plots"
 
So:
Delphi-Quellcode:
type
  TValueArray = array of Cardinal;

var
  ValueArray: TValueArray;

implementation

{$R *.dfm}


procedure PaintGraph(Bmp: TBitmap; Color: TColor; ValueArray: TValueArray);
var
  rect: TRect;
  i: Integer;
  len: Integer;
begin
  Bmp.Canvas.Brush.Color := clWhite;
  rect.Top := 0;
  rect.Left := 0;
  rect.Right := Bmp.Width;
  rect.Bottom := Bmp.Height;
  Bmp.Canvas.FillRect(rect);
  len := length(ValueArray);
  Bmp.Canvas.Pen.Color := Color;
  for i := 0 to Bmp.Width - 1 do
  begin
    Bmp.Canvas.MoveTo(i, Bmp.Height);
    Bmp.Canvas.LineTo(i, Bmp.Height-ValueArray[len-i-1]);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OffScreenBmp := TBitmap.Create;
  OffScreenBmp.Width := ClientWidth;
  OffScreenBmp.Height := ClientHeight;
  SetLength(ValueArray, ClientWidth);
  Index := length(ValueArray) - 1;
  Randomize;
  Timer1.Interval := 50;
  DoubleBuffered := True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(OffScreenBmp);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  BitBlt(Canvas.Handle, 0, 0, ClientWidth, ClientHeight, OffScreenBmp.Canvas.Handle, 0, 0, SRCCOPY);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
begin
  ValueArray[Index] := random(ClientHeight); //GetCPUUsage * 10;
  Dec(Index);
  if Index = 0 then
  begin
    for i := 0 to length(ValueArray) - 1 do
      ValueArray[i] := 0;
    PaintGraph(OffScreenBmp, clRed, ValueArray);
    Repaint;
    Index := length(ValueArray)-1;
  end;
  PaintGraph(OffScreenBmp, clRed, ValueArray);
  Repaint;
end;
In dem if-Zweig des OnTimer Ereignisses kannst du es ja dann in eine Datei wegspeichern.


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