Einzelnen Beitrag anzeigen

Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Histogramm Einteilungsprobleme

  Alt 25. Mai 2009, 17:28
So hab es ganz gut gelöst bekommen, recht einfach aber ausreichend, solange man nur ganze Zahlen als Y-Wert braucht, hier ist der Quelltext:

Delphi-Quellcode:
procedure Histogramm(Px_werte,Panzahl_werte : TStringList; Py_max : Integer);
var i,z,z2,Py_laenge,y_einteilung,y_beschriftung,Flanke : Integer;
begin
  Py_laenge := 300; //Y-Achsenlänge in px

  //y-Achse einteilen
  while Py_max mod 10 <> 0 do
    Inc(Py_max);

  y_einteilung := 30; //Abstand von einem Y-Wert zum nächsten in px
  y_beschriftung := round(Py_max/10);


  //Y-Achse mit Beschriftung zeichnen
  Form3.image1.Canvas.TextOut(28,350,'0');
  Form3.image1.Canvas.MoveTo(50,350);//y-Achsen Startpunkt
  Form3.image1.Canvas.LineTo(50,350-Py_laenge);//y-Achse
  z2 := 1;
  i := 350;
  repeat
    if i<350 then
      begin
        Form3.image1.Canvas.TextOut(28,i,IntToStr(y_beschriftung*z2));
        Form3.image1.Canvas.MoveTo(50,i);
        Form3.image1.Canvas.Pen.Style := psDot; //Gepunktete Linie
        Form3.image1.Canvas.LineTo(50+(50*Px_werte.Count+100),i);
        Form3.image1.Canvas.Pen.Style := psSolid;
        Inc(z2);
      end;
    dec(i,y_einteilung)
  until i < 350-Py_laenge;


  //X-Achse mit Beschriftung zeichnen
  Form3.image1.Canvas.MoveTo(50,350); //x-Achsen Startpunkt
  i := 100;
  z := 0;
  repeat
    Form3.image1.Canvas.LineTo(i,350); //x-Achse
    if z < Px_werte.Count then
      begin
        Flanke := 350-(round((y_einteilung/y_beschriftung)*(StrToInt(Panzahl_werte[z]))));
        Form3.image1.Canvas.LineTo(i,Flanke); //Histokramm positive Flanke
        Form3.image1.Canvas.LineTo(i+51,Flanke); //Waagerechte verbindung zw Flanken
        Form3.image1.Canvas.LineTo(i+51,350); //Histokramm negative Flanke
        Form3.image1.Canvas.TextOut(i,355,Px_werte[z]);
        // Füllung für Histogrammbalken
        Form3.Image1.Canvas.Brush.Color := clblue;
        Form3.Image1.Canvas.Rectangle(i,Flanke,i+51,350);
        Form3.Image1.Canvas.Brush.Color := clwhite;
      end;
    Form3.image1.Canvas.MoveTo(i,350);
    Inc(i,50);
    inc(z);
  until z = Px_werte.Count+2;
end;
  Mit Zitat antworten Zitat