Графік функції двох змінних
можна собі уявляти у вигляді деякої поверхні в тривимірному просторі. Для наочного зображення поверхні будемо використовувати наступний алгоритм: проведемо в просторі площину
, паралельну осям
і
. Тоді перетин даної площини з поверхнею функції є деяка крива – графік функції однієї змінної
. (правда, розташований цей графік під певним кутом до площини екрану). Змінюючи значення константи з деяким кроком, ми отримаємо сімейство таких кривих.

Наступним кроком алгоритму є побудова другого сімейства кривих, кожна з яких буде перетином поверхні площиною
. Накладення сімейства таких кривих дають хороше уявлення про поверхню граіка вихідеої функції.

Отже, давайте спробуємо застосувати даний алгоритм для конкретного прикладу. Для цього, запустимо середовище програмування delphi і створимо новий проект. Значення властивостей ширини (Width) і висоти (Height) головної форми Form1 встановимо рівним 529 та 534 відповідно. Після цього, розмістимо в нижній частині форми компонент типу TButton, при натисканні на який буде здійснюватись побудова графіка, і встановимо для даної кнопки значення властивості Caption рівним “Побудувати графік функції двох змінних“.
Далі переходимо до обробника події OnClick компонента Button1, і в тілі процедури Button1Click, в першу чергу, визначемо область форми Form1, призначену для виводу графіка та намалюємо осі координат
.

var
i, j, x0, y0, n: integer;
S, my, mz, mq1, mq2, xmin, ymin, xmax, ymax, zmin, zmax, hx, hy, xx, yy: real;
O, X, Xr, Y, Z: array[1..2] of integer;
XXX, YYY, ZZZ: array[1..1000] of real;
R_matr: array[1..2, 1..2] of real;
begin
// Область виводу графіка
Form1.Canvas.Brush.Color := clWhite;
Form1.Canvas.Rectangle(10, 20, 510, 470);
// Координати центрк системи ккординат
x0 := 510 div 2;
y0 := 470 div 2;
// Координати точки O
O[1] := x0; O[2] := y0;
// Координати точки Y
Y[1] := 500; Y[2] := y0;
// Координати точки Z
Z[1] := x0; Z[2] := 30;
// Координати точки X
X[1] := 20; X[2] := y0;
// Малюємо вісь OZ
Form1.Canvas.MoveTo(Trunc(O[1]), Trunc(O[2]));
Form1.Canvas.LineTo(Trunc(Z[1]), Trunc(Z[2]));
// Малюємо вісь OY
Form1.Canvas.MoveTo(Trunc(O[1]), Trunc(O[2]));
Form1.Canvas.LineTo(Trunc(Y[1]), Trunc(Y[2]));
// Заповнюємо елементи матриці обертання відповідними елементами
R_matr[1, 1] := Cos(45 * (Pi/180)); R_matr[1, 2] := Sin(45 * (Pi/180));
R_matr[2, 1] := -Sin(45 * (Pi/180)); R_matr[1, 2] := Cos(45 * (Pi/180));
// Переносимо точку X в центр обертання O
for j := 1 to 2do
Xr[j] := X[j] – O[j];
// Виконуємо поворот точки X на 45 градусів
for i := 1 to 2 do
begin
S := 0;
for j := 1 to 2 do
S := S + Xr[j] * R_matr[i ,j];
Xr[i] := Round(S);
end;
// Повертаємо точку X у вихідне положення (на малюнку точка Xr)
for j := 1 to 2 do
Xr[j] := O[j] + Xr[j];
// Маліюмо вісь X
Form1.Canvas.MoveTo(x0, y0);
Form1.Canvas.LineTo(Trunc(Xr[1]), Trunc(Xr[2]));
Після того, як система координат готова, переходимо до побудови графіка функції двох змінних. На першому кроці, будемо здійснювати побудову сімейства кривих (являються графіком функції однієї змінної), в площинах
, паралельних осям
та
. Детально описувати процес побудови графіка функції однієї змінної ми не будемо, його можна знайти за посиланням Алгоритм побудови графіка функції однієї змінної, а перейдемо до обробника події OnClick кнопки Button1 і доповнимо його наступним кодом.
xmin := 0; ymin := 0; zmin := 0;
xmax := 4; ymax := 4; zmax := 4;
// Кількість точок графіка
n := 30;
// Масштаб по осі OY
my := (Y[1] – O[1])/(ymax – ymin);
// Масштаб по осі OZ
mz := (O[2] – Z[2])/(zmax – zmin);
// Параметри зміщення графіка по осі OX
mq1 := (O[1] – Xr[1])/n;
mq2 := (Xr[2] – O[2])/n;
// Крок зміни X
hx := (xmax – xmin)/n;
// Крок зміни Y
hy := (ymax – ymin)/n;
Form1.Canvas.Pen.Color := clRed;
xx := xmin;
Xr := O;
while (xx <= xmax) do
begin
i := 0;
yy := ymin;
// Малюємо сімейство кривих паралельних осям OX, OZ
while (yy <= ymax) do
begin
i := i + 1;
YYY[i] := yy;
ZZZ[i] := Sin(xx * yy);
yy := yy + hy;
end;
for j := 1 to i-1 do
begin
Form1.Canvas.MoveTo(Trunc(Xr[1] + YYY[j]*my), Trunc(Xr[2] – ZZZ[j]*mz));
Form1.Canvas.LineTo(Trunc(Xr[1] + YYY[j + 1]*my), Trunc(Xr[2] – ZZZ[j + 1]*mz));
end;
xx := xx + hx;
Xr[1] := Xr[1] – mq1; Xr[2] := Xr[2] + mq2;
end;
Запустивши проект на виконання і натисшувши кнопку “Побудувати графік функції двох змінних“, отримаємо:

Далі, аналогічним чином, побудувавши сімейство кривих в площинах
, отримуємо поверхню граіка вихідеої функції.
mxx := (O[1] – Xr[1])/(xmax – xmin);
yy := ymin;
Xr := O;
// Малюємо сімейство кривих паралельних осям OY, OZ
while (yy <= ymax) do
begin
i := 0;
xx := xmin;
while (xx <= xmax) do
begin
i := i + 1;
XXX[i] := xx;
ZZZ[i] := Sin(xx * yy);
xx := xx + hx;
end;
for j := 1 to i-1 do
begin
Form1.Canvas.MoveTo(Trunc(Xr[1] – XXX[j] * mxx), Trunc(Xr[2] – ZZZ[j] * mz + (j-1)*mq2));
Form1.Canvas.LineTo(Trunc(Xr[1] – XXX[j+1] * mxx), Trunc(Xr[2] – ZZZ[j+1] * mz + j*mq2));
end;
yy := yy + hy;
Xr[1] := Trunc(O[1] + yy*my); Xr[2] := O[2];
end;

Зауваження: при побудові осей координат, а саме
, ми здійснювали поворот точки і використовували для цього матрицію обертання. Що таке матриця обертання, і для чого вона використовується можна знайти за посиланням Поворот точки на площині.