|
Registriert seit: 12. Mär 2008 30 Beiträge |
#1
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:
ich freue mich über eure anregungen,kritik ^^ und hilfe
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. danke im vorraus |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |