Registriert seit: 12. Apr 2019
46 Beiträge
|
Seltsames Verhalten einer Funktion
24. Apr 2019, 12:34
Delphi-Version: 10.2 Tokyo
Hey,
ich bin es mal wieder, langsam verzweifle ich an Delphi
Bei meinem Programm werden Boxplots dargestellt/gezeichnet, prinzipiell funktioniert das auch.
Nun habe ich mich daran versucht 2 unterschiedliche Boxplots darzustellen und bin auf ein sehr großes Problem gestoßen:
Wenn beide Boxplots den gleichen Datensatz haben werden sie Normal dargestellt, sofern aber einer der Boxplots einen anderen Datensatz besitzt wird der erste nicht mehr korrekt dargestellt (siehe Anhang).
Ich habe bereits einiges getestet und bin zu folgendem Entschluss gekommen: - Es liegt nicht an dem sortieren /einlesen. Datensatz wird korrekt abgespeichert bzw. eingelesen und sortiert (-> Mehrfach überprüft).
- Es muss an der Funktion für das zeichnen liegen
Ich habe die Funktion nun mehrfach neu geschrieben und auf Fehler überprüft aber ich finde einfach keinen (-> Bestimmt ein ganz simpler Fehler, den ich einfach nicht finde).
Dementsprechend hier die Funktion (bitte schlagt mich nicht für den schlechten Stil):
Delphi-Quellcode:
var
zahlen : array of array of Double;
namen : TStrings;
quartils : array[0..1] of Double;
median : Double;
bereiche: array[0..3] of array of Double;
...
procedure drawLine(PaintBox:TPaintBox; color: TColor; minX, minY, maxX, maxY:integer);
begin
PaintBox.Canvas.Pen.Color := color;
PaintBox.Canvas.MoveTo(minX, minY);
PaintBox.Canvas.LineTo(maxX, maxY);
end;
procedure zeichnen(PaintBox : TPaintBox; Boxplot : real; FHeight, FWidth: Integer);
var i, xWert, Height, index: integer;
eineLaengeneinheit : Double;
getHeight : array[0..9] of integer;
begin
if Length(zahlen) > 0 then begin
xWert := 40;
Height := round(FHeight * 0.4);
index := Round(Boxplot);
eineLaengeneinheit := (FWidth-120) / round(zahlen[index][Length(zahlen[index])-1] - zahlen[index][0]);
getHeight[0] := round(FHeight * 0.31919 + Height * Boxplot);
getHeight[1] := round(FHeight * 0.13214 + Height * Boxplot);
getHeight[2] := round(FHeight * 0.18379 + Height * Boxplot);
getHeight[3] := round(FHeight * 0.04839 + Height * Boxplot);
getHeight[4] := round(FHeight * 0.09839 + Height * Boxplot);
getHeight[5] := round(FHeight * 0.21839 + Height * Boxplot);
getHeight[6] := round(FHeight * 0.15839 + Height * Boxplot);
getHeight[7] := round(FHeight * 0.26839 + Height * Boxplot);
getHeight[8] := round(FHeight * 0.28839 + Height * Boxplot);
getHeight[9] := round(FHeight * 0.27839 + Height * Boxplot);
// Name des Boxplots
PaintBox.Canvas.TextOut(xWert-30, getHeight[3]-20, namen[index] + ':');
// Einteilung/Markierung
// Minimum
PaintBox.Canvas.TextOut(xWert-3, getHeight[0], FloatToStr(zahlen[index][0]));
drawLine(PaintBox, clRed, xWert, getHeight[1], xWert, getHeight[2]);
// Maximum
PaintBox.Canvas.TextOut(FWidth - 80, getHeight[0], FloatToStr(zahlen[index][Length(zahlen[index]) - 1]));
drawLine(PaintBox, clRed, FWidth-80, getHeight[1], FWidth-80, getHeight[2]);
// unteres Quartil
PaintBox.Canvas.TextOut(round(xWert - 3 + (quartils[0] - zahlen[index][0]) * eineLaengenEinheit), getHeight[3], FloatToStr(quartils[0]));
drawLine(PaintBox, clRed, round(xWert + (quartils[0] - zahlen[index][0])*eineLaengenEinheit), getHeight[4], round(xWert +
(quartils[0] - zahlen[index][0])*eineLaengenEinheit), getHeight[5]);
// median
PaintBox.Canvas.TextOut(round(xWert - 3 + (median - zahlen[index][0]) * eineLaengenEinheit), getHeight[3], FloatToStr(median));
drawLine(PaintBox, clRed, round(xWert + (median - zahlen[index][0])*eineLaengenEinheit), getHeight[4], round(xWert +
(median - zahlen[index][0])*eineLaengenEinheit), getHeight[5]);
// oberes Quartil
PaintBox.Canvas.TextOut(round(xWert - 3 + (quartils[1] - zahlen[index][0]) * eineLaengenEinheit), getHeight[3], FloatToStr(quartils[1]));
drawLine(PaintBox, clRed, round(xWert + (quartils[1] - zahlen[index][0]) * eineLaengenEinheit), getHeight[4], round(xWert +
(quartils[1] - zahlen[index][0]) * eineLaengenEinheit), getHeight[5]);
//Boxplot an sich
drawLine(PaintBox, clBlack, xWert, getHeight[6], round(xWert + (quartils[0] - zahlen[index][0]) * eineLaengenEinheit), getHeight[6]);
drawLine(PaintBox, clBlack, round(xWert + (quartils[0] - zahlen[index][0]) * eineLaengenEinheit), getHeight[4], round(xWert +
(quartils[1] - zahlen[index][0]) * eineLaengenEinheit), getHeight[4]);
drawLine(PaintBox, clBlack, round(xWert + (quartils[0] - zahlen[index][0]) * eineLaengenEinheit), getHeight[5], round(xWert +
(quartils[1] - zahlen[index][0]) * eineLaengenEinheit), getHeight[5]);
drawLine(PaintBox, clBlack, round(xWert + (quartils[1] - zahlen[index][0]) * eineLaengenEinheit), getHeight[6], FWidth - 80, getHeight[6]);
//Skala
for i := 0 to round(zahlen[index][Length(zahlen[index])-1]-zahlen[index][0]) do
drawLine(PaintBox, clBlack, round(xWert + i * eineLaengenEinheit), getHeight[7], round(xWert + i * eineLaengenEinheit), getHeight[8]);
drawLine(PaintBox, clBlack, xWert, getHeight[9], FWidth-80, getHeight[9]);
end;
end;
Findet ihr einen Fehler? Langsam verzweifle ich daran und kann mir nicht erklären woran es liegen kann :/
|