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;