AGB  ·  Datenschutz  ·  Impressum  







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

Mausbewegung und Verschiebeung

Ein Thema von mortality · begonnen am 16. Mär 2008
Antwort Antwort
mortality

Registriert seit: 12. Mär 2008
30 Beiträge
 
#1

Mausbewegung und Verschiebeung

  Alt 16. Mär 2008, 23:41
hallo leute,
ich hätte wieder ein paar fragen an euch;
1.Wisst ihr was an der Prozedurt die das Koordinatensystem in der Paintbox verschiebt nich passt?
2.könnte man irgendwie die Zeichenprozedur gering verändern damit die eingabe auch für a,b,c:real funktioniert?
3.wie könnte ich am besten die Einzeichnung der Ableitungen der fkt. durch die Hauptzeichnenprozedur durchführen?
(also bei ableitung klick soll die ableitung durch den algo für die quadr. fkt gezeichnet werden...und könnte man das auf extra
unit separieren?)

Delphi-Quellcode:
unit kurvendisk;


interface

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

type
  TForm1 = class(TForm)
    wert_a: TEdit;
    wert_b: TEdit;
    wert_c: TEdit;
    Intervall: TEdit;
    pixel_scalex: TEdit;
    pixel_scaley: TEdit;
    zgraph: TButton;
    lgraph: TButton;
    graphbox: TPaintBox;
    x0: TButton;
    SP: TButton;
    x01_ausg: TLabel;
    x02_ausg: TLabel;
    SP_ausg: TLabel;
    werteTAB: TStringGrid;
    Ableitung: TButton;
    Abl_ausg: TLabel;
    procedure AbleitungClick(Sender: TObject);
    procedure SPClick(Sender: TObject);
    procedure x0Click(Sender: TObject);
    procedure zgraphClick(Sender: TObject);
    procedure ClearBox();
    procedure lgraphClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure graphboxPaint(Sender: TObject);
    procedure graphboxMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure graphboxMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

    private
       { Private-Deklarationen }
      FHasFunction: Boolean;
      bereich:integer;
      dx, dy: integer; {Pixel pro Einheit auf den Achsen}
      x00, y00: integer;
    public
       a,b,c,new_b,new_c:integer;
       ra,rb,rc:real;
       { Public-Deklarationen }
    end;

var
   Form1: TForm1;


implementation

   {$R *.DFM}

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

     goright:= Round(graphbox.Width/2); //GoRight schiebt Fkt nachrechts um sie in die Mitte zu bringen
     goup:= Round(graphbox.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(wert_a.Text);
             b:= StrToInt(wert_b.Text);
             c:= StrToInt(wert_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 graphbox do
                  begin
                    Canvas.Pen.Color:= clBlue;
                    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 zeichnet 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;

  (*Wertetabelle*)
  werteTAB.visible:=true; //Tabelle erscheint
  werteTAB.cells[0,0]:='x'; //Beschriftung
  werteTAB.cells[0,1]:='y';
  werteTAB.colcount:=bereich*2+2;//Anzahl der Elemente
  x:=-bereich; //damit x aus dem negetativen Bereich beginnt

  for i:=1 to bereich*2+1 do //Schleife zur Ausfüllung der Wertetabelle
    begin
     wertetab.Cells[i,0]:=inttostr(x);
     y:=a*x*x+b*x+c;
     x:=x+1;
     wertetab.cells[i,1]:=floattostr(y);
    end;


end;

procedure TForm1.ClearBox(); //Prozedur, die ein simples Koordinatensystemzeichnet
 const Abst = 10; //10 Pixel Abstand zwischen den Markierungen
 var x,y: integer;
begin
  with graphbox do
    begin
      Canvas.Pen.Color:= clGray;
      Canvas.Brush.Color:= clWhite;
      Canvas.Rectangle(0,0,Width,Height); //zeichnet Rahmen

      y:= round(Height/2); //Markierungen von der Mitte nach unten
        while y < Height do
           begin
             Canvas.MoveTo(round(Width/2) - 5, y);
             Canvas.LineTo(round(Width/2) + 5, y);
             inc(y,Abst);
           end;
      y:= round(Height/2); //Markierungen von der Mitte nach oben
        while y > 0 do
           begin
             Canvas.MoveTo(round(Width/2) - 5, y);
             Canvas.LineTo(round(Width/2) + 5, y);
             dec(y,Abst);
           end;
      x:= round(Width/2);//Markierungen von der Mitte nach rechts
        while x < Width do
           begin
             Canvas.MoveTo(x,round(Height/2) + 5);
             Canvas.LineTo(x,round(Height/2) - 5);
             inc(x,Abst);
           end;
      x:= round(Width/2); //Markierungen von der Mitte nach links
        while x > 0 do
           begin
             Canvas.MoveTo(x,round(Height/2) + 5);
             Canvas.LineTo(x,round(Height/2) - 5);
             dec(x,Abst);
           end;
      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
  x01_ausg.visible:=false;
  x02_ausg.visible:=false;
  SP_ausg.visible:=false;
  Abl_ausg.visible:=false;
  FHasFunction := false; //am anfang keine funktion vorhanden
end;

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

procedure TForm1.lgraphClick(Sender: TObject);
begin
  FHasFunction := false; //graph löschen, box auflösen
  invalidate;
end;


procedure TForm1.x0Click(Sender: TObject);
var anz: integer;
      x1,x2: real;
begin
   if a=0 then
    begin
      x0_linear(b,c,x1);
      showmessage('Lösungen: x0=' + FloatToStr(x1));
      x01_ausg.visible:=true;
      x01_ausg.caption:='( '+floattostr(x1)+' | 0 )';
    end
      else
        begin
         x0_berechnen(a,b,c,anz,x1,x2);
         if anz = 0 then
          begin
            showmessage('Keine Nullstellen');
            x01_ausg.visible:=false;
            x02_ausg.visible:=false;
          end
           else
             if anz = 1 then
              begin
                showmessage('Eine Lösung: x ='+floatToStr(x1));
                x01_ausg.caption:='( '+floattostr(x1)+' | 0 )';
                x01_ausg.Visible:=true;
                x02_ausg.Enabled:=false;
              end
               else
                 begin
                   x01_ausg.visible:=true;
                   x02_ausg.visible:=true;
                   showmessage('Lösungen: x1=' + FloatToStr(x1) + ' x2=' + FloatToStr(x2));
                   x01_ausg.caption:='( '+floattostr(x1)+' | 0 )';
                   x02_ausg.caption:='( '+floattostr(x2)+' | 0 )';
                 end;
         end;
end;



procedure TForm1.SPClick(Sender: TObject);
var x,y: real;
begin
 if a =0 then
   showmessage('a=0, d.h. keine qudratische Fkt. mehr. Eingabe korrigieren.')
  else
  begin
  SP_berechnen(a,b,c,x,y);
  SP_ausg.Visible:=true;
  SP_ausg.caption:='('+floattostrf(x,ffFixed,4,2)+'|'+floattostrf(y,ffFixed,4,2)+')';
 end;
end;


procedure TForm1.AbleitungClick(Sender: TObject);
begin
new_b:=a*2;
new_c:=b;
abl_ausg.Visible:=true;
if new_c=0 then
  Abl_ausg.Caption:='y=f(x)='+floattostr(new_b)+'x'
   else
     Abl_ausg.Caption:='y=f(x)='+floattostr(new_b)+'x'+'+'+floattostr(new_c);
if a=0 then
 begin
  Abl_ausg.Caption:='y=f(x)='+floattostr(new_c)
 end;
end;

procedure TForm1.graphboxMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if abs(x-x00) < 4
    then graphbox.cursor:=crvsplit
    else
      if abs(y-y00) < 4
        then graphbox.cursor:=crhsplit
        else graphbox.cursor:=crdefault;
end;

procedure TForm1.graphboxMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if not graphbox.cursor <> crdefault
    then
      begin
        if Button = mbLeft
          then
            bereich:=2*bereich;
        if (Button =mbRight) and (bereich>=1.0)
          then
            bereich:=round(bereich/2);
        dx:=graphbox.width div (2*bereich);
        dy:=graphbox.height div (2*bereich);
        lgraphclick(Sender);
        clearbox();
        Zgraphclick(sender);
      end;
      end;

end.
ich freue mich über eure anregungen,kritik ^^ und hilfe
danke im vorraus
Angehängte Dateien
Dateityp: zip neu_winrar-zip-archiv_257.zip (296,1 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:43 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