Загрузка данных
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.