unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Panel2: TPanel;

    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;

    Panel1: TPanel;

    Image1: TImage;

    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;

    Show: TButton;

    procedure ShowAxis;   // Паказываем размеры ' бумажного полотна '
    procedure SetGrahic;  // Выводим график
    procedure UpDates;    // Обновление данных, взятый из полей редактирования

    procedure FormCreate(Sender: TObject);
    procedure ShowClick(Sender: TObject);
  private

  public
    I1,I2,J1,J2:integer; // Экранные координаты
    X1,X2,Y1,Y2:real;    // 'бумажные' координаты
    h,x,y:real;
    N:integer;           // количество дискетных значений

    function ScaleOX(x:Real):integer; // Масштабирование по оси OX
    function ScaleOY(y:Real):integer; // -----//----- OY
    function F(x:real):real;          // Вычисление значения функции в точке x
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.ScaleOX(x:Real):integer;
begin
  Result:=i1+Trunc((x-x1)*(I2-I1)/(x2-x1));
end;

function TForm1.ScaleOY(y:Real):integer;
begin
  Result:=J2+Trunc((y-Y1)*(J1-J2)/(y2-y1));
end;

// Вы можете выбрать нужную функцию для просмотра
function TForm1.F(x:real):real;
begin
  Result:=sin(x)*sqr(x);
//Result:=8*Exp(-sqr(x-0.5));
//Result:=sin(X)/Cos(x);
//Result:=cos(x);
//Result:=x*x*x;
//Result:=x*x;
//Result:=x;
end;


// Паказываем размеры ' бумажного полотна '
procedure TForm1.SetGrahic;
var i:integer;
begin
  with image1.canvas do
  begin
  // Рисуем оси и делаем закраску
    pen.color:=$00D2D0AE;
    brush.color:=$00D2D0AE;
    RectAngle(0,0,width,height);
    pen.color:=$00929252;
    moveto(ScaleOX(0),ScaleOY(y1)); LineTo(ScaleOX(0),ScaleOY(y2));
    moveto(ScaleOX(x1),ScaleOY(0)); LineTo(ScaleOX(x2),ScaleOY(0));
    pen.color:=clRed;
    x:=x1;
    y:=F(x);
    moveto(ScaleOX(x),ScaleOY(y));
    // Начинаем отрисовку графика
    for I:=0 to n do
    begin
      x:=x+h;
      y:=F(x);
      LineTo(ScaleOX(x),ScaleOY(y));
    end;
  end;
end;

procedure TForm1.ShowAxis;
begin
  label1.caption:='( '+FloatToStr(x1)+' ; '+FloatToStr(y2)+' )';
  label2.caption:='( '+FloatToStr(x2)+' ; '+FloatToStr(y2)+' )';
  label3.caption:='( '+FloatToStr(x2)+' ; '+FloatToStr(y1)+' )';
  label4.caption:='( '+FloatToStr(x1)+' ; '+FloatToStr(y1)+' )';
  Edit1.text:=FloatToStr(y2);
  Edit2.text:=FloatToStr(y1);
  Edit3.text:=FloatToStr(x1);
  Edit4.text:=FloatToStr(x2);
  Edit5.text:=IntToStr(N);
end;

procedure TForm1.UpDates;
begin
  y2:=StrToInt(Edit1.text);
  y1:=StrToInt(Edit2.text);
  x1:=StrToInt(Edit3.text);
  x2:=StrToInt(Edit4.text);
  N:=StrToInt(Edit5.text);
  h:=(x2-x1)/n;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with image1 do
  begin
    i1:=0;
    i2:=width;
    J1:=0;
    j2:=height;
  end;
  // Начальные установки
  n:=300;
  x1:=-10;
  x2:=10;
  y1:=-10;
  y2:=10;
  ShowAxis;
end;

procedure TForm1.ShowClick(Sender: TObject);
begin
  UpDates;
  ShowAxis;
  SetGrahic;
end;

end.
