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.