Графік функції доцільно зображувати у вигляді ламаної лінії, яка з’єднує точки, що лежать на графіку. Для того, щоб така кусковолінійна апроксимація давала хороший результат, необхідно, щоб відстань між точками ламаної лінії була достатньо малою.
Для побудови графіка по заданому аналітичному опису функції необхідно обчислити масив значень аргументу і масив відповідних значень функції. Крок зміни аргументу залежить від кількості точок на які розбивають діапазон зміни аргументу і обчислюється за наступною формулою:
де – крок зміни аргумента; – максимальне значення аргумента; – мінімальне значення аргумента; – задана кількість точок графіка.
Наступним кроком алгоритму побудови графіка є обчислення масиву значень функції , та визначення його мінімального і максимального значення. Дані виличини необхідні для проведення масштабування.
Далі, для малювання графіка на канві вибирають прямокутну область, яка визначається координатами лівого верхнього кута і правого нижнього кута . Задавши дану область визначаємо масштаб по осі та .
Після цього, переходимо до визначення точки центру системи координат. Дані величини обчислюємо за наступними формулами:
де – заокруглення до найближчого цілого числа.
На наступному кроці необхідно визначити координати точок графіка, виражені в екранних координатах, з урахуванням розмірів обраного поля виведення графіка. Значення аргументу в екранних координатах визначається за формулою:
де – значення аргументу в -й точці, виражене в екранних координатах; – значення аргументу в -й точці; – масштаб по осі ; – заокруглення до найближчого цілого числа.
Значення функції в екранних координатах визначається за формулою:
де – значення функції в -й точці, виражене в екранних координатах; – значення функції в -й точці; – масштаб по осі ; – заокруглення до найближчого цілого числа.
На основі отриманих координат точок кривої графіка та центру системи координат, здійснюють побудову осей системи координат та самого графіка шляхом з’єднання точок кривої відрізками прямих.
Отже, давайте створимо новий delphi-проект і спробуємо з допомогою даного алгоритму на канві форми побудувати графік деякої функції. Для цього нам буде потрібно форма, на яку помістимо один компонент TButton та один компонент TLabel.
Тепер перейдемо до самого коду. Головною подією буде натискання на кнопку “Побудувати графік“. Двічі клацнувши на неї, перейдемо в редактор коду і в тілі процедури OnClick компонента Button1 задамо кількість точок графіка та визначемо крок зміни аргументу.
var
i, x0, y0, n, k: integer;
xx, h, xmin, ymin, xmax, ymax, mx, my: real;
X, Y: array [1..1000] of real;
begin
xmin := -3; // Мінімальне значення аргументу
xmax := 3; // Максимальне значення аргументу
n := 100; // Кількість точок графіка
h := (xmax – xmin)/n; // Крок зміни аргументу
Далі будуємо масив значень аргументу та масив значень функції, після чого, використовуючи функцію Extreme, визначаємо максимальне і мінімальне значення функції:
xx := xmin;
while (xx <= xmax) do
begin
i := i + 1;
X[i] := xx; // Значення аргументу в i-й точці
Y[i] := Sin(xx); // Значення функції в i-й точці
xx := xx + h;
end;
ymin := Extreme(Y, n, 0); // Мінімальне значення функції
ymax := Extreme(Y, n, 1); // Максимальне значення функції
На наступному кроці на канві форми визначемо прямокутну область, яка буде слугувати контейнером для побудови графіка функції і встановимо для неї білий колір заливки. Для того, щоб намалювати прямокутник на канві форми, скористаємось методом Rectangle класу TCanvas, який містить чотири параметри цілого типу, перших два вказують на координати лівого верхнього кута, наступні два – координати правого нижнього кута:
Form1.Canvas.Rectangle(10, 20, 510, 320);
Після цього, скориставшись формулами (2) і (3) визначаємо масштаб по осі та та координати точки центру системи координат:
my := (320 – 20)/abs(ymax – ymin); // Масштаб по осі Y
{ Цент системи координат }
x0 := 10 + Trunc(mx * abs(xmin));
y0 := 20 + Trunc(my * abs(ymax));
На останньому кроці, скориставшись методами MoveTo і LineTo того ж класу TCanvas з використанням формул (4) і (5), маліємо осі системи координат та здійснюємо побудову графіка функції:
Form1.Canvas.MoveTo(10, y0);
Form1.Canvas.LineTo(10 + 500, y0);
{ Маліємо вісь Y }
Form1.Canvas.MoveTo(x0, 20);
Form1.Canvas.LineTo(x0, 20 + 300);
{ Для побудови графіка вибираємо червоний колір }
Form1.Canvas.Pen.Color := clRed;
{ Маліємо графік функції }
for i := 1 to n-1 do
begin
Form1.Canvas.MoveTo(Trunc(x0 + X[i]*mx), Trunc(y0 – Y[i]*my));
Form1.Canvas.LineTo(Trunc(x0 + X[i + 1]*mx), Trunc(y0 – Y[i + 1]*my));
end;
end;
В принципі програма готова, залишається лише описати функцуію Extreme (призначена для відшукання максимального (мінімального) значення в масиві), після чого можна переходити до провірки працездатність отриманого delphi-проекту.
var
i: integer;
ext: real;
begin
case Param of
{ Якщо значення парамента Param рівне 1 – знаходимо максимальне значення в масиві }
1 :
begin
ext := V[1];
for i := 1 to n do
if (ext < V[i]) then
ext := V[i];
end;
{ Якщо значення парамента Param рівне 0 – знаходимо мінімальне значення в масиві }
0 :
begin
ext := V[1];
for i := 1 to n do
if (ext > V[i]) then
ext := V[i];
end;
end;
Extreme := ext;
end;