Построение трехмерных графиков функций двух переменных

Графики функций двух переменных вида z=f(x,y), в отличие от графиков функций y=f(x), представляют собой не линии, а поверхности. Если график функции y=f(x) можно легко изобразить на плоском листе бумаги, то график функции z=f(x,y) уже не помещается на плоскости, а требует пространственного представления. В прошлых номерах "КВ" (см. "КВ" №29, 1999 г. и №2, 2000 г.) рассматривались способы построения графиков функций двух переменных, основанные на тоновой и цветовой визуализации. Суть этих методов состоит в том, что значениям z ставится в соответствие некая шкала тонов или цветовая гамма. Иными словами, сама картинка строится на плоскости в координатах x и y, а третье пространственное измерение моделируется при помощи игры полутонов или цветовых оттенков. Весьма интересно, однако, было бы увидеть не только плоское изображение графика, но и его пространственную реконструкцию. В изобразительном искусстве и черчении различные объекты моделируются на плоскости рисунка или чертежа в виде тех или иных трехмерных проекций. Рассмотрим один из возможных методов адаптации программы тоновой визуализации для построения трехмерных проекций графиков функций двух переменных. Наиболее удобна для компьютерной реализации так называемая фронтальная диметрическая проекция. В ней ось X располагается горизонтально, ось Z - вертикально, а ось Y - под углом 45° к горизонтальной оси X. При фронтальном диметрическом проецировании размеры по оси Y необходимо делать вдвое меньшими, чем аналогичные размеры по осям X и Z. За основу программы возьмем код процедуры тоновой визуализации ("КВ" №29, 1999 г.). Для того, чтобы преобразовать плоское тоновое изображение в его аксонометрическую проекцию, при построении картинки будем каждую новую строку пикселов сдвигать на одну позицию вправо. Таким образом, квадрат превратится в параллелограмм, острые углы которого будут примерно равны 45°. Картинка окажется как бы лежащей на полу. Для имитации двукратного уменьшения размеров по оси Y уменьшим наполовину количество строк пикселов по сравнению с количеством пикселов в одной строке. Величину z для каждой из точек будем интерпретировать не только как тон пиксела, но и как расстояние от "пола" до точки трехмерного графика. В соответствующей позиции над плоскостью XY будем ставить точку черного цвета.

В результате работы программы над лежащей тоновой тенью повиснет легкое точечное изображение трехмерного каркаса исследуемой поверхности, чем-то напоминающее натянутый прозрачный черный нейлон (см. рисунки). В том случае, когда на одном рисунке совмещается тоновое изображение с "парящей" над ним трехмерной структурой, можно составить наиболее полное и адекватное представление о пространственной форме графика функции. От нас уже не ускользнут различные детали, заслоненные "холмами" на переднем плане. В то же самое время можно будет получить достаточно наглядное и полное впечатление о рельефе поверхности. Ниже приведен программный код процедуры, реализующей описанный алгоритм.

DefSng X-Z

Public Function f(x As Single, y As Single) As Single
f = Sin(x * y / 2)
End Function

Private Sub Screen_Click()
Dim c As Long
Dim t As Byte
Dim n As Integer
Dim hx As Single
Dim hy As Single
Dim Rz As Single
Screen.Cls
n = 300
m = 150
xmin = Text1(0).Text
xmax = Text1(1).Text
ymin = Text1(2).Text
ymax = Text1(3).Text
zmin = Text1(4).Text
zmax = Text1(5).Text
Rz = zmax — zmin
hx = (xmax — xmin) / n
hy = (ymax — ymin) / m
y = ymin — hy / 2
For j = 300 To 450
 x = xmax + hx / 2
 y = y + hy
 For i = j To (j — 300) Step -1
 x = x — hx
 z = f(x, y)
 Select Case z
 Case Is > zmax
 c = RGB(200, 200, 200)
 k = n
 Case Is < zmin
 c = RGB(0, 0, 0)
 k = 0
 Case zmin To zmax
 t = 255 * (z — zmin) / Rz
 k = 300 * (z — zmin) / Rz
 c = RGB(t, t, t)
 End Select
 Screen.PSet (i, j), c
 Screen.PSet (i, j — k), RGB(0, 0, 0)
 Next i
Next j
End Sub

При помощи приведенной программы можно получить бесчисленное множество пространственных изображений различных функций. Мы уже имели возможность оценить богатство их форм и красоту, проводя опыты с тоновой визуализацией. Объемные графики весьма существенно дополняют тоновые изображения. Они в полной мере позволяют оценить неповторимую пластику нелинейных поверхностей, среди которых порой попадаются весьма изысканные и привлекательные формы, доставляющие истинное эстетическое наслаждение. Компьютерная визуализация многократно усиливает творческий потенциал геометрического мышления, стимулирует пространственное воображение, что, несомненно, способствует дальнейшему познанию загадочного и необычайно красивого мира чисел.

Визуализация графиков функций двух переменных имеет не только эстетическое, но и практическое значение. Функции двух переменных нередко выступают в качестве математических моделей различных процессов. После того, как эта модель становится зримой, анализировать ее гораздо проще. Закономерности течения исследуемого явления становятся видимыми и очевидными. На графиках отчетливо прослеживается местоположение экстремальных точек. А поиск минимумов или максимумов функции, описывающей какой-то физический или производственный процесс, имеет прямое отношение к решению различного рода оптимизационных задач.

 

Судя по письмам, при повторении программ, приводимых в моих статьях, у читателей нередко возникает одна и та же ситуация, когда вместо полной картинки в графическом окне появляется лишь ее микроскопическая копия. Это вовсе не какой-то коварный глюк, а всего лишь следствие того, что я привык измерять экранное пространство в пикселах, а не в твипах. В VB же по умолчанию в качестве экранных единиц измерения предлагаются именно твипы. Твипы гораздо мельче пикселов (1 логический сантиметр - 567 твипов), поэтому итоговая картинка получается микроскопической. Для того, чтобы этого избежать, необходимо поменять единицы измерения с твипов на пикселы (свойство ScaleMode).

Андрей КОЛЕСНИКОВ,
andr61@mail.ru

Версия для печатиВерсия для печати

Номер: 

13 за 2000 год

Рубрика: 

Азбука программирования
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!