Registriert seit: 24. Jun 2008
Ort: Mallersdorf
9 Beiträge
Delphi 7 Professional
|
AW: Orientierungspunkte für die Y-Achse eines Diagramms berechnen
13. Mai 2017, 19:43
Hallo, Harry Stahl,
hier mein Quellcode zum Zeichnen einer Y-Achse aus vorgegebener Wertetabelle.
Teile davon sind zwanzig Jahre alt, Teile davon kann ich auf die Schnelle nicht mehr nachvollziehen, Teile sind durch Ausprobieren entstanden, geschrieben in D7.
Alles andere hab' ich versucht, einigermaßen zu kommentieren.
Für das Format des Postings entschuldige ich mich, besser kann ich's nicht.
Dann hoffe ich nur noch, daß Du was damit anfangen kannst.
Gruß
Sigi
--------------------------------------------------------------------------
Funktionen, hab' ich irgendwo abgeschrieben, was die genau machen, weiß ich nicht mehr
--------------------------------------------------------------------------------------
function Pot(Basis,Exponent : LongInt) : LongInt;
var
P : real;
n : word;
begin
P := 1;
for n := 1 to exponent do
P := P * Basis;
Pot := Trunc(P);
end;
Function Basis(W : LongInt) : LongInt;
var
n : word;
wert : LongInt;
begin
n := 0;
while (W div Pot(10,n)) > 0 do
inc(n);
Basis := Pot(10,n-1);
end;
-------------------------------------------------------------------
Im Hauptformular steht:
-------------------------------------------------------------------
var
CPC : TCanvas;
xL, yO, xR, yU : integer;
CxL, CyO, CxR, CyU : integer;
B, BC, H : integer;
IMin, IMax : Integer; // Kleinster und größter Y-Wert
Interval : Real; // davon das interval
TeilerY : integer; // Y-Achsen-Abschnitt
ARY : Real; // AspektRatio zum Zeichnen
FKx, FKy, FKxL, FKxR, FKyO, FKyU : integer;
PFirstPoint,
PLastPoint : TKurs;
Function GetRelativKoordinate(R : Real) : word;
begin
Result := yU - Trunc((ARY *((Log2(Max(R,1)))-(Log2(Max(Imin,1)))))); // yU = Diagramm Unten
end; // für absolute Darstellung die log2-Funktion weglassen
--------------------------------------------------------------------------
Y-Achse berechnen und zeichnen, der Nullpunkt des Canvas ist LinksOben
--------------------------------------------------------------------------
PLastPoint := TKurs(AktKursliste.Last); // Meine WerteListe
PK := PLastPoint;
K1 := MaxInt;
G1 := 0;
while (PK <> PFirstPoint) do // größten und kleinsten Y-Wert ermitteln
begin
K1 := Min(K1,PK.GetMinimum);
G1 := Max(G1,PK.GetMaximum);
PK := TKurs(AktKursliste.GetPrev(PK));
end;
IMin := trunc(K1/1.02); // IMin verkleinern
IMax := trunc(G1*1.02); // IMax vergrößern
Interval := (IMax-IMin+1); // damit ich nicht bis an die Grenzen zeichne
TeilerY := Basis(Trunc(Interval)); // Y-Achsen-Abschnitt berechnen
while ((Interval/TeilerY) < 4) do teilerY := TeilerY div 2; // ist durch Ausprobieren entstanden
Interval := (log2(IMax)) - (log2(Max(IMin,1))); // Interval berechnen, für absolute Darstellung die log2-Funktion weglassen
ARY := (H/Interval); // AspektRatio berechnen, H = DiagrammHöhe
n := IMin; // Zeichnen
while ((n mod teilerY) <> 0) do inc(n); // durch Ausprobieren entstanden
while (n <= IMax) do
begin
if ((n mod TeilerY) = 0) then Ky := GetRelativKoordinate(n);
R := n;
if (Frac(R/ChF) <> 0)
then S := FloatToStrF(R/ChF,ffFixed,6,2)
else S := FloatToStrF(R/ChF,ffFixed,6,0);
CPC.Pen.Style := PsSolid;
CPC.Font.Color := ClBlack;
CPC.Brush.Style := BsClear;
CPC.TextOut(xL-10-CPC.Textwidth(S),round(ky-CPC.TextHeight(S) div 2),S);
CPC.TextOut(xR+10,round(ky-CPC.TextHeight(S) div 2),S);
CPC.Pen.Style := PsDot;
CPC.Pen.Color := ClGray;
CPC.Pen.Width := 1;
CPC.MoveTo(CxL-20,Round(Max(Ky,CyO))); CPC.LineTo(CxR+20,round(Max(Ky,CyO)));
Inc(n,TeilerY);
end;
|