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


procedure TForm1.Button1Click(Sender: TObject);

  // Функция варианта 18 с защитой от деления на ноль при x = 1
  function fun(x: Real): Real;
  begin
    if Abs(x - 1.0) < 1E-7 then
      fun := 2.0
    else
      fun := 2.0 * Cos(1.0 / (x - 1.0));
  end;

  // Процедура построения кусочно-линейного графика
  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
    h := (b - a) / n;

    // Поиск максимума модуля функции на отрезке для масштабирования
    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 при вычислении t2
    if m < 1E-6 then
      m := 1.0;

    // Масштабные коэффициенты
    t1 := (xgmax - xgmin) / (b - a);
    t2 := (ygmax - ygmin) / (2.0 * m);

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

    // Экранные координаты координатных осей
    xv := Round(xgmin - a * t1);
    yv := Round((ygmin + ygmax) / 2);

    // Отрисовка оси OY
    Form1.Canvas.Pen.Color := clBlack;
    Form1.Canvas.MoveTo(xv, ygmin);
    Form1.Canvas.LineTo(xv, ygmax);

    // Отрисовка оси OX
    Form1.Canvas.MoveTo(xgmin, yv);
    Form1.Canvas.LineTo(xgmax, yv);

    // Начальная точка кусочно-линейной кривой
    Form1.Canvas.MoveTo(xgmin, yv - Round(fun(a) * t2));
    Form1.Canvas.Pen.Color := clRed;

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

var
  n: Integer;
  a, b, a1, b1: Real;
begin
  // Считывание введённых данных
  a  := StrToFloat(Edit1.Text);
  b  := StrToFloat(Edit2.Text);
  n  := StrToInt(Edit3.Text);
  a1 := StrToFloat(Edit4.Text);
  b1 := StrToFloat(Edit5.Text);

  // Скрытие компонентов интерфейса ввода (по алгоритму пособия)
  Edit1.Visible := False;
  Edit2.Visible := False;
  Edit3.Visible := False;
  Edit4.Visible := False;
  Edit5.Visible := False;
  Button1.Visible := False;
  Label1.Visible := False;
  Label2.Visible := False;
  Label3.Visible := False;
  Label4.Visible := False;
  Label5.Visible := False;

  // Формирование информационного заголовка функции
  Label6.Caption := 'Grafic funcsii y=2*cos(1/(x-1)); na otrezke[' +
                    FloatToStr(a) + ';' + FloatToStr(b) + '] i na otrezke[' +
                    FloatToStr(a1) + '; ' + FloatToStr(b1) + ']';

  // Вспомогательное окно детализации (550, 620, 10, 100), n = 200
  grafun(550, 620, 10, 100, 200, a1, b1);

  // Основное окно графика Варианта 18: (40, 500, 50, 400)
  grafun(40, 500, 50, 400, n, a, b);
end;

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