Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi funktion zeichen (https://www.delphipraxis.net/126807-funktion-zeichen.html)

freaky-girl 2. Jan 2009 21:04


funktion zeichen
 
ich möchte eine funktion anzeigen lassen. aber ich komm einfach nicht weiter. bei y=x und y=3x etc klappt es, auch bei x*x aber sobald ich zB x+5 versuche, wird der graph total schief. von anderen möglichen funktionen mal abgesehen (probleme mit y-achse)

hier mein code:
----------------------------------------------------------------
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var i,xn,yn, fx, fy:integer;                  //i=x,
begin
xn:=image1.Canvas.PenPos.X;                   // Koordinatenursrung bei (100,100)
yn:=image1.Canvas.PenPos.Y;
image1.Canvas.Pen.Color:=clRed;

begin                                         // f(i)=y
for i:=-100 to 150 do
fx:=i;                                        // x wert setzen
fy:=round(i*5);                                 // y wert setzen (funktion i*5, zum testen andere funktion eintragen)

image1.Canvas.moveTo(xn,yn);                  // mitte auf koord. ursprung setzen
Image1.Canvas.LineTo(xn+fx,yn-fy);           // linie zeichnen
----------------------------------------------------------------

ich bin mit sicher, es lässt sich ganz einfach lösen


[edit=Matze][delphi]-Tags eingefügt. Zukünftig bitte selbst daran denken. MfG, Matze[/edit]

Namenloser 2. Jan 2009 21:10

Re: funktion zeichen
 
Deine Formatierung ist durcheinander.
Delphi-Quellcode:
for i:=-100 to 150 do
fx:=i;                                        // x wert setzen
fy:=round(i*5);                                 // y wert setzen (funktion i*5, zum testen andere funktion eintragen)

image1.Canvas.moveTo(xn,yn);                  // mitte auf koord. ursprung setzen
Image1.Canvas.LineTo(xn+fx,yn-fy);           // linie zeichnen
Da gehörert ein Begin...End drum. Aber was macht das begin mitten im Quelltext?
Auf andere Fehler hab ichs jetzt nicht überprüft.

Du solltest deine Quelltexte ordnetlich einrücken und formatieren.

Valle 2. Jan 2009 21:10

Re: funktion zeichen
 
Irgendwie hast du begin und end falsch gesetzt. Müsste das nicht eher so aussehen?


Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var i,xn,yn, fx, fy:integer;                  //i=x,
begin
xn:=image1.Canvas.PenPos.X;                   // Koordinatenursrung bei (100,100)
yn:=image1.Canvas.PenPos.Y;
image1.Canvas.Pen.Color:=clRed;

                                          // f(i)=y
for i:=-100 to 150 do begin
  fx:=i;                                        // x wert setzen
  fy:=round(i*5);                                 // y wert setzen (funktion i*5, zum testen andere funktion eintragen)

  image1.Canvas.moveTo(xn,yn);                  // mitte auf koord. ursprung setzen
  Image1.Canvas.LineTo(xn+fx,yn-fy);           // linie zeichnen
end;

Valle 2. Jan 2009 22:01

Re: funktion zeichen
 
Also du hast da generell ein bisschen was mit den Variablen durcheinander gebracht. Ich habe mal aus reiner Langeweile die Funktion ein wenig verbessert und meinem Geschmack angepasst. :mrgreen:

Delphi-Quellcode:
function f(i: Integer): Integer;
begin
  result := 2*i+100;
end;

procedure TForm1.Image1Click(Sender: TObject);
var i, xn, yn, fx, fy: integer;
    LastPoint: TPoint;
    Buffer: TBitmap;
begin
  Buffer := TBitmap.Create;
  Buffer.Width := Image1.Width;
  Buffer.Height := Image1.Height;
  xn := Buffer.Canvas.ClipRect.Right div 2;
  yn := Buffer.Canvas.ClipRect.Bottom div 2;

  Buffer.Canvas.TextOut(10, 10, IntToStr(-xn));
  Buffer.Canvas.Pen.Color := clBlue;
  Buffer.Canvas.moveTo(0, yn);
  Buffer.Canvas.LineTo(Image1.Canvas.ClipRect.Right, yn);
  Buffer.Canvas.moveTo(xn, 0);
  Buffer.Canvas.LineTo(xn, Image1.Canvas.ClipRect.Bottom);

  Buffer.Canvas.Pen.Color := clRed;
  for i := -xn to 2*xn do begin
    fx := i;
    fy := round(f(fx));

    // Ist einfacherer als die naechsten Zeilen bis zum "end;",
    // sieht aber etwas komischer (verpixelt / nicht durchgehend) aus:
    //   Buffer.Canvas.Pixels[xn+fx, yn-fy] := clRed;

    if i = -xn then // erster Durchlauf
      LastPoint := Point(xn+fx, yn-fy);

    Buffer.Canvas.MoveTo(xn+fx, yn-fy);
    Buffer.Canvas.LineTo(LastPoint.x, LastPoint.y);
    LastPoint := Point(xn+fx, yn-fy);
  end;
  Image1.Picture.Assign(Buffer);
end;
Mit freundlichen Grüßen,

Valle


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz