Загрузка данных


unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

// Функция Варианта 18 (стр. 34 методички)
function f(x: Real): Real;
begin
  // В точке x = 1 происходит деление на ноль (1 / 0).
  // Делаем микросдвиг, чтобы программа не вылетала с ошибкой:
  if Abs(x - 1.0) < 1e-6 then
    x := 1.000001;

  f := 2 * Cos(1 / (x - 1));
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Начальные значения отрезка, включающего точку разрыва x = 1
  Edit1.Text := '-1';
  Edit2.Text := '5';
  Edit3.Text := '2000';
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  // Координаты графического окна строго по Варианту 18 (стр. 34)
  Xgmin = 40;
  Xgmax = 500;
  Ygmin = 50;
  Ygmax = 400;
var
  a, b, h, m, x, t1, t2: Real;
  n, i, xg, yg, xv, yv: Integer;
begin
  // 1. Считывание исходных данных
  a := StrToFloat(Edit1.Text);
  b := StrToFloat(Edit2.Text);
  n := StrToInt(Edit3.Text);

  // Шаг аргумента x (формула со стр. 27 методички)
  h := (b - a) / n;

  // 2. Поиск максимального по модулю значения функции m = max|f(x)|
  m := Abs(f(a));
  for i := 1 to n do
  begin
    if Abs(f(a + i * h)) > m then
      m := Abs(f(a + i * h));
  end;

  if m = 0 then 
    m := 1; // Защита от деления на ноль

  // 3. Вычисление масштабов (формулы 1.3 со стр. 27 методички)
  t1 := (Xgmax - Xgmin) / (b - a); // пикселей на единицу X
  t2 := (Ygmax - Ygmin) / (2 * m);   // пикселей на единицу Y

  // 4. Очистка и рисование белой рамки окна под график
  Canvas.Brush.Color := clWhite;
  Canvas.Pen.Color := clBlack;
  Canvas.Rectangle(Xgmin - 5, Ygmin - 5, Xgmax + 5, Ygmax + 5);

  // 5. Координаты центра системы координат (формулы 1.4 со стр. 28)
  xv := Round(Xgmin - a * t1);
  yv := Round((Ygmin + Ygmax) / 2);

  // Рисование осей координат
  Canvas.Pen.Color := clBlack;

  // Ось OY (рисуем, только если математический x = 0 попал в наше окно)
  if (xv >= Xgmin) and (xv <= Xgmax) then
  begin
    Canvas.MoveTo(xv, Ygmin);
    Canvas.LineTo(xv, Ygmax);
  end;

  // Ось OX (горизонтальная линия посередине рамки)
  Canvas.MoveTo(Xgmin, yv);
  Canvas.LineTo(Xgmax, yv);

  // 6. Построение графика кусочно-линейным методом (LineTo)
  Canvas.Pen.Color := clRed;

  // Ставим перо в начальную точку при x = a
  xg := Xgmin;
  yg := yv - Round(f(a) * t2);
  Canvas.MoveTo(xg, yg);

  // Проходим по всем n отрезкам и соединяем их линиями
  for i := 1 to n do
  begin
    x := a + i * h;
    xg := Xgmin + Round((x - a) * t1);
    yg := yv - Round(f(x) * t2);
    Canvas.LineTo(xg, yg);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;

end.