Einzelnen Beitrag anzeigen

Looper

Registriert seit: 28. Sep 2007
Ort: Hamburg
131 Beiträge
 
Delphi XE2 Professional
 
#33

Re: Quadratische fkt. Zeichnet nicht

  Alt 13. Mär 2008, 21:15
Funktioniert dieser Quellcode richtig?
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    ed_a: TEdit;
    ed_b: TEdit;
    ed_c: TEdit;
    edbereich: TEdit;
    edscalex: TEdit;
    edscaley: TEdit;
    btsolve: TButton;
    btreset: TButton;
    functionbox: TPaintBox;
    procedure btSolveClick(Sender: TObject);
    procedure ClearBox();
    procedure btResetClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure functionboxPaint(Sender: TObject);
     private
       { Private-Deklarationen } 
      FHasFunction: Boolean;
     public
       { Public-Deklarationen } 
     end;

   var
     Form1: TForm1;

   implementation

   {$R *.DFM} 

   procedure TForm1.btSolveClick(Sender: TObject);
   var i,a,b,c,bereich,goright,goup: Integer;
       y1,y2,scalex,scaley: Real;
   begin
     bereich:= Round(StrToInt(edbereich.Text)/2); //Breite eines Parabelastes
     scalex:= StrToFloat(edscalex.Text); //Zoomfaktor für x-Achse(z.B. wenn man Breite halbieren will ScaleX:= 0,5)
     scaley:= StrToFloat(edscaley.Text); //Zoomfaktor für y-Achse

     goright:= Round(FunctionBox.Width/2); //GoRight schiebt Fkt nachrechts um sie in die Mitte zu bringen
     goup:= Round(FunctionBox.Height/2); //GoUp schiebt Fkt nach oben umsie in die Mitte zu bringen

    ClearBox;
    FHasFunction := true;
     For i:= -(bereich) to (bereich-1) do
     begin
       a:= StrToInt(ed_a.Text);
       b:= StrToInt(ed_b.Text);
       c:= StrToInt(ed_c.Text);
       y1:= (a*(i*i)+b*i+c); //Funktion für x alsAusgangspunkt für die Linie
       y2:= (a*((i+1)*(i+1))+b*(i+1)+c); //Funktion für dennachfolgenden Wert von x für Endpunkt der Linie

       with FunctionBox do
       begin
         Canvas.Pen.Color:= clBlack;
      Canvas.MoveTo(Round((i)*scalex + goright), Height-Round(y1*scaley) -goup);
                                                    //MoveTo läst denCanvaszeiger zum Ausgangspunkt gehen
                                                    //*ScaleY skalliert die Parbel(kann man als einfachen Zoom verstehen)
                                                    //z.B.: Verdoppeln entspricht2; Halbieren entspricht 0,5
      Canvas.LineTo(Round((i+1)*scalex + goright), Height-Round(y2*scaley) -goup);
                                                    //LineTo ziechnet eine Linievon Ausgangspunkt zu Endpunkt
                                                    //also von (x1,y1) zu (x2,y2)wobei x1=i, x2=(i+1), y1,y2 wurden vorher berechnet
         //So wird die ganze Funktion im Bereich durchgerechnet und von jedem Punktzum nächsten eine Linie gezeichnet
    end;
     end;
   end;

   procedure TForm1.ClearBox(); //Prozedur, die ein simples Koordinatensystemzeichnet
   begin
     with FunctionBox do
     begin
       Canvas.Pen.Color:= clGray;
       Canvas.Brush.Color:= clWhite;
    Canvas.Rectangle(0,0,Width,Height); //zeichnet Rahmen
       Canvas.MoveTo(0,round(Height/2));
       Canvas.LineTo(Width,round(Height/2)); //zeichnet x-Achse
       Canvas.MoveTo(round(Width/2),0);
       Canvas.LineTo(round(Width/2),Width); //zeichnet y-Achse
  end;
   end;

   procedure TForm1.FormCreate(Sender: TObject);
begin
  FHasFunction := false;
end;

procedure TForm1.functionboxPaint(Sender: TObject);
begin
  if FHasFunction then
    btSolveClick(self)
  else
    ClearBox;
end;

procedure TForm1.btResetClick(Sender: TObject);
begin
  FHasFunction := false;
  invalidate;
end;

end.
Wenn ja, dann arbeite doch damit weiter.

mfg Looper
  Mit Zitat antworten Zitat