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


unit Unit1;

{$mode objfpc}{$H+}

interface

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

type

  { TForm1 }

  TForm1 = class(TForm)
    lbl1: TLabel;
    lbl2: TLabel;
    lbl3: TLabel;
    lbl4: TLabel;
    lbl5: TLabel;
    lbl6: TLabel;
    edt1: TEdit;
    edt2: TEdit;
    edt3: TEdit;
    edt4: TEdit;
    edt5: TEdit;
    btn1: TButton;
    btn2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

// Задаем начальные значения при создании формы
procedure TForm1.FormCreate(Sender: TObject);
begin
  lbl1.Caption := 'a =';
  lbl2.Caption := 'b =';
  lbl3.Caption := 'n =';
  lbl4.Caption := 'a1 =';
  lbl5.Caption := 'b1 =';
  btn1.Caption := 'График';
  btn2.Caption := 'Выход';
  lbl6.Caption := '';

  // Отрезок [a, b], включающий особую точку x = 1
  edt1.Text := '-1';
  edt2.Text := '5';
  edt3.Text := '10000'; // количество отрезков

  // Отрезок [a1, b1], не включающий особую точку x = 1
  edt4.Text := '1,5';
  edt5.Text := '5';
end;

procedure TForm1.btn1Click(Sender: TObject);

  // Функция Варианта 18: y = 2 * cos(1 / (x - 1))
  function fun(x: Real): Real;
  begin
    // Защита от деления на 0 при точном попадании в точку разрыва x = 1
    if Abs(x - 1.0) < 1e-7 then
      x := 1.0 + 1e-7;
    fun := 2 * Cos(1 / (x - 1));
  end;

  // Универсальная процедура построения графика в заданном окне (стр. 29 методички)
  procedure grafun(xgmin, xgmax, ygmin, ygmax, n: Integer; a, b: Real);
  var
    h, m, x, t1, t2: Real;
    i, xg, yg, xv, yv: Integer;
  begin
    // 1. Расчет шага аргумента по формуле кусочно-линейного метода
    h := (b - a) / n;

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

    // Защита от деления на ноль, если функция тождественно равна 0
    if m < 1e-6 then
      m := 1;

    // 3. Вычисление масштабных коэффициентов
    t1 := (xgmax - xgmin) / (b - a); // масштаб по горизонтали
    t2 := (ygmax - ygmin) / (2 * m);   // масштаб по вертикали

    // 4. Отрисовка белой рамки графического окна
    Canvas.Brush.Color := clWhite;
    Canvas.Pen.Color := clBlack;
    Canvas.Rectangle(xgmin - 5, ygmin - 5, xgmax + 5, ygmax + 5);

    // 5. Расчет координат экранного начала координат (пересечения осей)
    xv := Round(xgmin - a * t1);
    yv := Round((ygmin + ygmax) / 2);

    // 6. Отрисовка координатных осей
    Canvas.Pen.Color := clBlack;
    // Ось OY (рисуется только если попадает в окно)
    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);

    // 7. Построение графика методом LineTo
    Canvas.Pen.Color := clRed; // цвет линии графика
    Canvas.MoveTo(xgmin, yv - Round(fun(a) * t2));

    for i := 1 to n do
    begin
      x := a + i * h;
      xg := xgmin + Round((x - a) * t1);
      yg := yv - Round(fun(x) * t2);
      Canvas.LineTo(xg, yg);
    end;
  end;

var
  n: Integer;
  a, b, a1, b1: Real;
begin
  a  := StrToFloat(edt1.Text);
  b  := StrToFloat(edt2.Text);
  n  := StrToInt(edt3.Text);
  a1 := StrToFloat(edt4.Text);
  b1 := StrToFloat(edt5.Text);

  // Скрываем элементы ввода, как в примере из пособия
  edt1.Visible := False;
  edt2.Visible := False;
  edt3.Visible := False;
  edt4.Visible := False;
  edt5.Visible := False;
  btn1.Visible := False;
  lbl1.Visible := False;
  lbl2.Visible := False;
  lbl3.Visible := False;
  lbl4.Visible := False;
  lbl5.Visible := False;

  lbl6.Caption := 'График функции y = 2*cos(1/(x-1)) на отрезках [' +
                  FloatToStr(a) + '; ' + FloatToStr(b) + '] и [' +
                  FloatToStr(a1) + '; ' + FloatToStr(b1) + ']';

  // Второе окно: превью без особой точки
  grafun(550, 620, 10, 100, 200, a1, b1);

  // Первое окно: строго по варианту 18 из таблицы на стр. 34 (40, 500, 50, 400)
  grafun(40, 500, 50, 400, n, a, b);
end;

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

end.