Нужно построить график таблично-заданной функции без использования компонента TChart! Также в программе должны быть использованы следующие возможности:
1) Произвольный интервал исследования (числовым или графическим способом);
2) Изменение размеров окна вывода графика функции;
3) Задание шага изменения аргумента
Есть некоторые задумки..вот код:
Код:
procedure TForm1.FormPaint(Sender: TObject);
begin
StringGrid1.Cells[0,0]:='x';
StringGrid1.Cells[0,1]:='y';
end;
// Описали функцию
Function f(x: real): real;
begin
Result := x*(sin(x)/cos(x))-1/3;
end;
procedure TForm1.FormResize(Sender: TObject);
var from,togo:real;
begin
if StringGrid1.Cells[1,0] = '' then
begin
if Edit1.Text='' then from:=-1
else from := StrToFloat(Edit1.Text);
if Edit2.Text='' then togo:=1
else togo := StrToFloat(Edit2.Text);
DrawGraph (f, from, togo, Form1.Canvas);
end
else
DrawGraph2 (f, StrToFloat(StringGrid1.Cells[1,0]), StrToFloat(StringGrid1.Cells[3,0]), Form1.Canvas);
end;
// Производим ввод и расчет координат
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: string);
var x:real;
begin
if Value <> '' then
begin
x:=f(StrToFloat(Value));
StringGrid1.Cells[ACol, ARow+1]:=FloatToStr(x);
end
else
StringGrid1.Cells[ACol, ARow+1]:='';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
DrawGraph (f, StrToFloat(Edit1.Text), StrToFloat(Edit2.Text), Form1.Canvas);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DrawGraph2 (f, StrToFloat(StringGrid1.Cells[1,0]), StrToFloat(StringGrid1.Cells[3,0]), Form1.Canvas);
end;
procedure TForm1.DrawGraph (f: TFunc; a: real; b: real; C: TCanvas);
var x, y, h: real;
max, min: real;
sx, sy: real;
xmid, ymid: integer;
begin
sx := (c.ClipRect.Right)/(b-a);
h := 1/sx;
xmid := c.ClipRect.Right div 2;
ymid := c.ClipRect.Bottom div 2;
x := a;
max := f( x);
min := max;
while x<=b do
begin
y := f( x);
if y<min then min := y;
if y>max then max := y;
x := x + h;
end;
sy := c.ClipRect.Bottom/ (max-min);
c.Brush.Color := clWhite;
c.FillRect(Rect(0, 0, c.ClipRect.Right, c.ClipRect.Bottom));
c.Pen.Color := clBlack;
c.MoveTo(0, ymid);
c.LineTo(c.ClipRect.Right, ymid);
c.MoveTo(xmid, 0);
c.LineTo(xmid, c.ClipRect.Bottom);
x := a;
y := f(x);
c.Pen.Color := clBlack;
c.MoveTo(xmid+round(sx*x), ymid-round(sy*y));
while x<=b do
begin
y := f(x);
c.LineTo(xmid+round(sx*x), ymid-round(sy*y));
x := x + h;
end;
end;
procedure TForm1.DrawGraph2 (f: TFunc; a: real; b: real; C: TCanvas);
var x, y, h: real;
max, min: real;
sx, sy: real;
xmid, ymid,i: integer;
begin
sx := (c.ClipRect.Right)/(b-a);
h := 1/sx;
xmid := c.ClipRect.Right div 2;
ymid := c.ClipRect.Bottom div 2;
x := a;
max := f( x);
min := max;
while x<=b do
begin
y := f( x);
if y<min then min := y;
if y>max then max := y;
x := x + h;
end;
sy := c.ClipRect.Bottom/ (max-min);
c.Brush.Color := clWhite;
c.FillRect(Rect(0, 0, c.ClipRect.Right, c.ClipRect.Bottom));
c.Pen.Color := clBlack;
c.MoveTo(0, ymid);
c.LineTo(c.ClipRect.Right, ymid);
c.MoveTo(xmid, 0);
c.LineTo(xmid, c.ClipRect.Bottom);
x := a;
y := f(x);
c.Pen.Color := clBlack;
c.MoveTo(xmid+round(sx*x), ymid-round(sy*y));
for i := 1 to StringGrid1.ColCount - 1 do
begin
y := StrToFloat(StringGrid1.Cells[i,1]);
x := StrToFloat(StringGrid1.Cells[i,0]);
c.LineTo(xmid+round(sx*x), ymid-round(sy*y));
x := x + h;
end;
end;
end.