bisher nutzte ich eine eigene Anzeige-Komponente für Daten in einem Projekt. Da ich dieses zur Zeit umstelle, will ich versuchen TAChart zu nutzen, da dieses mir mit Zoomen etc. mehr Möglichkeiten bietet.
Folgende Frage konnte ich bei meinen Tests bisher nicht klären: Ist es möglich Daten in diverse LineSeries zu schicken und diese normalisiert (z.B. immer MaxRange/MinRange +1/-1) in einem Chart darzustellen?
Ich kann natürlich die Ausgangsdaten, bevor ich diese der LineSeries übergebe "Normalisieren", aber eventuell gibt es ja eine ganz einfache Lösung (per y-Scale-Property oder so).
Beispiel, wie ich es mir vorstelle (oder als Projekt anbei):
Code: Alles auswählen
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
CreateSomeData;
SetLength(MyLS, Length(MyData));
for i:=0 to High(MyLS) do begin
MyLS[i]:=TLineSeries.Create(Self);
// MyLS[i].AddArray(MyData[i]); // <- So wäre es mir lieber + Setzen eines Properties
AddNormalArray(MyLS[i], MyData[i]); // als so!
MyLS[i].SeriesColor:=$FF0000 SHR (i * 8);
Chart1.AddSeries(MyLS[i]);
end;
end;
procedure TForm1.CreateSomeData;
var
i, j: Integer;
begin
SetLength(MyData, 4);
for j:=0 to High(MyData) do begin
SetLength(MyData[j], 1000);
for i:=0 to High(MyData[j]) do
case j of
0: MyData[j, i]:=Sin(i / 90) * 5;
1: MyData[j, i]:=Sin(i / 83) * Sin(i div 20 mod 5);
2: MyData[j, i]:=i mod 100 * Sin(i / 50);
3: MyData[j, i]:=Sin(i / 120) * 500 + i;
end;
end;
end;
procedure TForm1.AddNormalArray(const LS: TLineSeries;
var aData: TData);
var
i: Integer;
HighData: Double;
begin
HighData:=0;
for i:=0 to High(aData) do
if Abs(aData[i]) > HighData then HighData:=Abs(aData[i]);
for i:=0 to High(aData) do
LS.AddXY(i, aData[i] / HighData);
end;