Einzelnen Beitrag anzeigen

SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#2

Re: Funktion wird nicht gezeichnet

  Alt 29. Mär 2009, 14:24
irgendwie haut das ganze net wirklich hin: was ist x0? diese variable wird nirgends belegt, ist also 0, sprich du zeichnest ein rechteck von -1 bis 0?

Hier mal Code aus meinem Plotter:

Delphi-Quellcode:
function Graph2D : ErrorCode;
var ImageHeight : integer;
    ImageLength : integer;
    YAchse : integer;
    XAchse : integer;
    XGitterabstand : extended;
    YGitterabstand : extended;
    u : integer;
    x : extended;
    xmin,xmax,ymin,ymax : extended;
begin
  xmin := Graph_xmin;
  xmax := Graph_xmax;
  ymin := Graph_ymin;
  ymax := Graph_ymax;

  ImageLength := graph_image_2D.Width;
  ImageHeight := graph_image_2D.Height;

   // Berechen der y_Achse und X_Achse
  YAchse := Round(ImageLength - ImageLength / abs(xmax - xmin) * xmax) ;
  XAchse := Round(ImageHeight + ImageHeight / abs(ymax - ymin) * ymin) ;

  XGitterabstand := ImageLength / abs(xmax - xmin);
  YGitterabstand := ImageHeight / abs(ymax - ymin);

  // Gitterabstände anpassen
  if XGitterabstand < 25 then
    XGitterabstand := 25;

  if XGitterabstand > 250 then
    XGitterabstand := 250;

  if YGitterabstand < 20 then
    YGitterabstand := 20;

  if YGitterabstand > 150 then
    YGitterabstand := 150;

  with graph_image_2D.canvas do
    begin
    brush.color := clwhite;
    rectangle(0,0,ImageLength + 1,ImageHeight + 1);

    // Gitternetz zeichnen
    pen.Color := $00E0E0E0;
    pen.width := 1;

    u := 1;
    repeat
      moveto(YAchse - round(u * XGitterabstand),0);
      lineto(YAchse - round(u * XGitterabstand),ImageHeight);
      inc(u);
    until YAchse - round(u * XGitterabstand) < 0;



    u := 1;
    repeat
      moveto(YAchse + round(u * XGitterabstand),0);
      lineto(YAchse + round(u * XGitterabstand),ImageHeight);
      inc(u);
    until YAchse + round(u * XGitterabstand) > ImageLength;



    u := 1;
    repeat
      moveto(0,XAchse - round(u * YGitterabstand));
      lineto(ImageLength,XAchse - round(u * YGitterabstand));
      inc(u);
    until XAchse - round(u * YGitterabstand) < 0;



   u := 1;
    repeat
      moveto(0,XAchse + round(u * YGitterabstand));
      lineto(ImageLength,XAchse + round(u * YGitterabstand));
      inc(u);
    until XAchse + round(u * YGitterabstand) > ImageHeight;



    pen.Color := clblack;

    // Striche für Zahlen zeichnen

    u := 1;
    repeat
      moveto(YAchse - round(u * XGitterabstand),XAchse - 5);
      lineto(YAchse - round(u * XGitterabstand),XAchse + 5);
      inc(u);
    until YAchse - round(u * XGitterabstand) < 0;



    u := 1;
    repeat
      moveto(YAchse + round(u * XGitterabstand),XAchse - 5);
      lineto(YAchse + round(u * XGitterabstand),XAchse + 5);
      inc(u);
    until YAchse + round(u * XGitterabstand) > ImageLength;



    u := 1;
    repeat
      moveto(YAchse - 5,XAchse - round(u * YGitterabstand));
      lineto(YAchse + 5,XAchse - round(u * YGitterabstand));
      inc(u);
    until XAchse - round(u * YGitterabstand) < 0;


    u := 1;
    repeat
      moveto(YAchse - 5,XAchse + round(u * YGitterabstand));
      lineto(YAchse + 5,XAchse + round(u * YGitterabstand));
      inc(u);
    until XAchse + round(u * YGitterabstand) > ImageHeight;



    // X-Achse + Y-Achse zeichnen
    pen.Color := clblack;
    pen.Width := 2;
    moveto(0,XAchse);
    lineto(ImageLength + 1,XAchse);
    moveto(YAchse,0);
    lineto(YAchse,ImageHeight + 1);

    brush.Color := clblack;
    polygon([point(YAchse - 4,12),point(YAchse + 4,12),point(YAchse,0),point(YAchse - 4,12)]);
    polygon([point(ImageLength - 12,XAchse - 4),point(ImageLength - 12,XAchse + 4),point(ImageLength,XAchse),point(ImageLength - 12,XAchse - 4)]);

    // Beschriftung

    font.Height := 10;
    font.Color := clblack;
    brush.Color := clwhite;
    font.Name := 'MS Sans Serif';

    u := 1;
    repeat
      if XGitterabstand = 25 then
        textout(YAchse - round(u * XGitterabstand) + 4,XAchse + 10, floattostr(round(x_wert(xmin,xmax,YAchse - u * XGitterabstand,ImageHeight,ImageLength))))
          else
            if XGitterabstand = 250 then
              textout(YAchse - round(u * XGitterabstand) + 4,XAchse + 10, floattostr(roundto(x_wert(xmin,xmax,YAchse - u * XGitterabstand,ImageHeight,ImageLength),-3)))
                else
                  textout(YAchse - round(u * XGitterabstand) + 4,XAchse + 10, floattostr(- u));

      inc(u);
    until YAchse - round(u * XGitterabstand) < 0;


    u := 1;
    repeat
      if XGitterabstand = 25 then
        textout(YAchse + round(u * XGitterabstand) + 4,XAchse + 10, floattostr(round(x_wert(xmin,xmax,YAchse + u * XGitterabstand,ImageHeight,ImageLength))))
          else
            if XGitterabstand = 250 then
              textout(YAchse + round(u * XGitterabstand) + 4,XAchse + 10, floattostr(roundto(x_wert(xmin,xmax,YAchse + u * XGitterabstand,ImageHeight,ImageLength),-3)))
                else
                  textout(YAchse + round(u * XGitterabstand) + 4,XAchse + 10, floattostr( u));

      inc(u);
    until YAchse + round(u * XGitterabstand) > ImageLength;


    u := 1;
    repeat
      if YGitterabstand = 20 then
        textout(YAchse - 17,XAchse - round(u * YGitterabstand) - 15, floattostr(round(y_wert(ymin,ymax,XAchse - round(u * YGitterabstand),ImageHeight,ImageLength))))
          else
            if YGitterabstand = 150 then
              textout(YAchse - 17,XAchse - round(u * YGitterabstand) - 15, floattostr(roundto(y_wert(ymin,ymax,XAchse - round(u * YGitterabstand),ImageHeight,ImageLength),-3)))
                else
                  textout(YAchse - 17,XAchse - round(u * YGitterabstand) - 15, floattostr( u));

      inc(u);
    until XAchse - round(u * YGitterabstand) < 0;


    u := 1;
    repeat
      if YGitterabstand = 20 then
        textout(YAchse - 17,XAchse + round(u * YGitterabstand) - 15, floattostr(round(y_wert(ymin,ymax,XAchse + round(u * YGitterabstand),ImageHeight,ImageLength))))
          else
            if YGitterabstand = 150 then
              textout(YAchse - 17,XAchse + round(u * YGitterabstand) - 15, floattostr(roundto(y_wert(ymin,ymax,XAchse + round(u * YGitterabstand),ImageHeight,ImageLength),-3)))
                else
                  textout(YAchse - 17,XAchse + round(u * YGitterabstand) - 15, floattostr(- u));

      inc(u);
    until XAchse + round(u * YGitterabstand) > ImageHeight;

    end;
end;



function Tfrm2D.Graph2D_Funktion(Funktion : string ;Farbe : TColor; Breite : integer; ClearGraph : boolean): ErrorCode ;
var ImageHeight : integer;
    ImageLength : integer;
    YAchse : integer;
    XAchse : integer;
    tmp_x : extended;
    u : integer;
    x, y : extended;
    Variable : char;
     xmin,xmax,ymin,ymax : extended;
begin
  xmin := Graph_xmin;
  xmax := Graph_xmax;
  ymin := Graph_ymin;
  ymax := Graph_ymax;

  Variable := Funktionsvariable;
  Funktion := SyntaxPruefung(Funktion,Variable);

  ImageLength := graph_image_2D.Width;
  ImageHeight := graph_image_2D.Height;

   // Berechen der y_Achse und X_Achse
  YAchse := Round(ImageLength - ImageLength / abs(xmax - xmin) * xmax) ;
  XAchse := Round(ImageHeight + ImageHeight / abs(ymax - ymin) * ymin) ;

  if ClearGraph then Graph2D();

  graph_image_2D.Canvas.Pen.Color := Farbe;
  graph_image_2D.Canvas.Pen.Width := Breite;


  tmp_x := abs(xmax - xmin) / ImageLength;

  x := xmin - tmp_x ;
  if Funktion = 'then exit;
  y := EF32_Funktionswert(Funktion,Variable,x);
  graph_image_2D.Canvas.MoveTo(x_pixel(xmin,xmax,x,ImageHeight,ImageLength),y_Pixel(ymin,ymax,y,ImageHeight,ImageLength));
  x := xmin;
  for u := - 1 to ImageLength do
    begin
    y := EF32_Funktionswert(Funktion,Variable,x);
    graph_image_2D.Canvas.LineTo(x_pixel(xmin,xmax,x,ImageHeight,ImageLength),y_Pixel(ymin,ymax,y,ImageHeight,ImageLength));
    x := x + tmp_x;
    end;
end;
dies ist code aus meinem Funktionsplotter!


der Plotter hängt auch mit an!
Angehängte Dateien
Dateityp: rar easy_funktionsplotter_v.3_offizielle_beta_testversion_472.rar (1,11 MB, 7x aufgerufen)
  Mit Zitat antworten Zitat