AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Seltsames Verhalten einer Funktion

Ein Thema von Pytroxis · begonnen am 24. Apr 2019 · letzter Beitrag vom 28. Apr 2019
 
Pytroxis

Registriert seit: 12. Apr 2019
46 Beiträge
 
#1

Seltsames Verhalten einer Funktion

  Alt 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 :/
Angehängte Grafiken
Dateityp: png Fehler_1.PNG (6,8 KB, 78x aufgerufen)
Dateityp: png Fehler_2.PNG (6,6 KB, 66x aufgerufen)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz