Программа строит график функции, при значениях , например, xmin=-12 xmax=6 пропадают координаты. И еще нужно посчитать и вывести нули функции. Как это сделать? Надо использовать Batton2? Добавить процедуру? Спасибо. Пишу 1-й раз, если нарушила какие-то правила исправлю
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button3: TButton;
Label1: TLabel;
Label2: TLabel;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
Function Fu(x:real):real;
begin
Fu:=X*X-3*X+2;
end;
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
var
x1,x2: real;
y1,y2: real;
k,b: real;
x,y: real;
d1,d2: real;
Begin
x1:=StrToFloat(Edit1.Text);
y1:=Fu(x1);
repeat
x2:=x1+1/10;
y2:=Fu(x2);
if y1*y2<0 Then
Begin
repeat
y1:=Fu(x1);
y2:=Fu(x2);
k:=(y1-y2)/(x1-x2);
b:=y1-k*x1;
x:=-b/k;
y:=k*x+b;
d1:=sqr(x1-x)+sqr(y1-y);
d2:=sqr(x2-x)+sqr(y2-y);
If d1>d2 Then
Begin
d1:=d2;
x1:=x;
End
Else x2 := x;
until d1<1E-2;
End;
x1:=x2;
y1:=y2;
until x2>StrToFloat(Edit2.Text);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
minY, maxY : real;
x : real;
mastabY, mastabX : real;
i, j, m : integer;
p : array of Tpoint;
begin
Image1.Picture:=nil;
x:=StrToFloat(edit1.Text);
minY:=Fu(x);
maxY:=Fu(x);
repeat
if Fu(x)>maxY then
maxY:=Fu(x);
x:=x+1/100;
until x>StrToFloat(Edit2.Text);
x:=StrToFloat(edit1.Text);
repeat
if Fu(x)<minY then
minY:=Fu(x);
x:=x+1/100;
until x>StrToFloat(Edit2.Text);
mastabY:=(Image1.height-40)/(maxY-minY);
mastabX:=(Image1.Width-40)/(StrToFloat(Edit2.Text)-StrToFloat(Edit1.Text));
m:=20;
x:=StrToFloat(edit1.Text);
for i:=0 to Image1.Width-40 do
begin
SetLength(p,i+1);
p[i].x:=i+20;
p[i].y:=round(mastabY*(-Fu(x)+minY)+Image1.Width-20);
// строим ось х
if round(-Fu(x)*mastabY*(maxY-minY))=0 then
begin
Image1.canvas.MoveTo(0,round(mastabY*(-Fu(x)+minY)+Image1.Width-20));
Image1.canvas.LineTo(Image1.height,round(mastabY*(-Fu(x)+minY)+Image1.Width-20));
for j:=1 to round(StrToFloat(Edit2.Text)-StrToFloat(Edit1.Text))+1 do
begin
Image1.Canvas.TextOut(round((j-1)*(mastabX))+20+2,round(mastabY*(-Fu(x)+minY)+Image1.Width-20)+2,IntToStr(StrToInt(Edit1.Text)+j-1));
Image1.Canvas.Pixels[(j-1)*round(mastabX)+20,round(mastabY*(-Fu(x)+minY)+Image1.Width-20)]:=clblack;
end;
end;
//строим ось у
if round(x*mastabX*2)=0 then
begin
Image1.canvas.MoveTo(p[i].x,0);
Image1.canvas.LineTo(p[i].x,Image1.Width);
// подписи по оси у
for j:=1 to round((maxY-minY))+1 do begin
if m>=20 then
begin
If Image1.height-20-round((j)*(mastabY))+3<round(mastabY*(-Fu(x)+minY)+Image1.Width-20)-10 then
begin
Image1.Canvas.TextOut(p[i].x+3,Image1.height-20-round((j)*(mastabY))+3,floatToStr(round((minY+j)*100)/100));
m:=0;
End
else begin
If Image1.height-20-round((j)*(mastabY))+3>round(mastabY*(-Fu(x)+minY)+Image1.Width-20)+20 then
begin
Image1.Canvas.TextOut(p[i].x+3,Image1.height-20-round((j)*(mastabY))+3,floatToStr(round((minY+j)*100)/100));
m:=0;
end;
end
end
else begin
m:=m+(Image1.height-round((j)*(mastabY)))-(Image1.height-round((j+1)*(mastabY))) ;
end;
end;
end;
x:=x+(StrToFloat(Edit2.Text)-StrToFloat(Edit1.Text))/(Image1.Width-40);
end;
Image1.Canvas.Polyline(p);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
clouse;
end;
end.