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.