Тоновая визуализация нелинейных поверхностей

Живопись света - так критики характеризуют творчество современной немецкой художницы Рут Хюблер. Она работает в уникальной, присущей только ей манере ступенчатой техники живописи. Картины Рут Хюблер строятся, как правило, на основе какой-то геометрической фигуры, разделенной на отдельные сегменты. Все сегменты исходной геометрической конструкции раскрашиваются в тона одного и того же цвета различной интенсивности. Цвет располагается так, что интенсивность тона плавно изменяется от одного соседнего сегмента к другому. Таким образом, создается впечатление, что все изображение как бы состоит из света, преломленного тем или иным причудливым образом. Например, если светлый тон концентрируется в центре композиции и плавно затухает по ее краям, то зритель воспринимает сюжет такой картины как размытое изображение некого светящегося объекта.

Идея светописи Рут Хюблер может оказаться полезной не только в изобразительном искусстве, но и в области компьютерной визуализации. Компьютерная визуализация имеет исключительное значение для современной насквозь математизированной науки. Абстрактные математические формулы недостаточны для полноценного познания сути того или иного объекта или явления. Всегда хочется знать, как э т о "выглядит". Человеку в силу его ментальной организации необходимы наглядные образы. И здесь компьютерная визуализация совершенно необходима.

Рассмотрим задачу визуализации нелинейной поверхности, описываемой функцией вида z=f(x, y). Задачи подобного рода часто возникают при анализе математических моделей изменения некоторого параметра z в зависимости от пространственных координат x и y. Речь может идти о картине распределения теплых и холодных воздушных масс на карте города, о зонах с различными физическими характеристиками на поверхности какого-то испытуемого образца нового сплава и о многих других подобных задачах. Решить проблему можно, построив трехмерный "проволочный каркас" исследуемой поверхности. Это будет, однако, не самое простое, а в некоторых случаях и не самое удобное решение. В трехмерной проекции отдельные крупные "холмы" на переднем плане могут заслонить другие, не менее важные детали на заднем плане. Кроме того, в трехмерном варианте возможны определенные проблемы с визуальной оценкой координат тех либо иных деталей рельефа исследуемой поверхности.

Одним из наиболее простых и удобных способов посмотреть, что же внешне представляет собой график интересующей нас функции z=f(x, y), состоит в представлении поверхности z как мозаичного панно, состоящего из отдельных тонированных квадратиков (пикселов). В этом случае мы как бы смотрим сверху на залитую светом поверхность перпендикулярно плоскости (x,y). Необязательно составлять мозаику именно из отдельных пикселов и вычислять значение функции для каждого из них, что, разумеется, резко увеличивает время расчетов. Наглядное представление о форме поверхности можно получить, даже если просто покрыть исследуемый участок координатной плоскости достаточно мелкой квадратной сеточкой и вычислить значения z для каждой ее ячейки. При этом точкой, определяющей цвет отдельного квадратика, можно выбрать его центр, а потом, в зависимости от значения функции в этой точке, окрашивать весь квадратик.

Для того, чтобы игра света и тени адекватно отображала впадины и выпуклости на исследуемой нелинейной поверхности, значение z в каждом из квадратиков удобно изображать соответствующим уровнем яркости свечения пикселов. Например, чем выше значение z, тем ярче светится квадратик, и наоборот, чем меньше значение z в ячейке, тем в более темный тон она окрашивается. То есть, можно каждой точке исследуемого прямоугольного участка приписать определенное значение цвета, которое будет тем или иным образом соответствовать значению z в данной области. Например, при использовании палитры, содержащей плавный переход от черного к белому, большим значениям z можно поставить в соответствие более светлый тон свечения пикселов, а более малым значениям z поставить в соответствие более темный тон. Тогда впадины будут скрыты густой тенью, а выпуклости или возвышенности, напротив, будут ярко освещены. Ниже приводится фрагмент программного кода на Visual Basic, позволяющий строить тоновые графики функций двух переменных.

 
DefSng X-Z

Public Function f(x As Single, y As Single) As Single
f = Sin((y * x - x ^ 2) * (x - x * y))
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
n = 500
xmin = Text1(0).Text
xmax = Text1(1).Text
ymin = Text1(2).Text
ymax = Text1(3).Text
zmin = Text1(4).Text
zmax = Text1(5).Text
hx = (xmax - xmin) / n
hy = (ymax - ymin) / n
y = ymin - hy / 2
For j = 0 To n
 x = xmin - hx / 2
 y = y + hy
 For i = 0 To n
 x = x + hx
 z = f(x, y)
 Select Case z
 Case Is > zmax
 c = RGB(255, 255, 255)
 Case Is < zmin
 c = RGB(0, 0, 0)
 Case zmin To zmax
 t = 255 * (z - zmin) / (zmax - zmin)
 c = RGB(t, t, t)
 End Select
 Screen.PSet (i, j), c
 Next i
Next j
End Sub

Необходимыми исходными данными для программы являются: вид функции z=f(x, y), задаваемый в отдельной подпрограмме-функции; минимальные и максимальные значения координат Xmin, Xmax, Ymin, Ymax, ограничивающие исследуемый участок числовой плоскости; минимальное и максимальное значение Zmin, Zmax. Заранее точно знать последние два параметра удается не всегда. Поэтому все квадратики, в которых f(x, y) принимает значения меньшие заданного Zmin, окрашиваются в черный цвет (RGB(0,0,0)), а все квадратики, в которых f(x, y) принимает значение больше заданного Zmax, окрашиваются в белый цвет (RGB(255,255,255)). Все необходимые числовые значения считываются после щелчка мыши на объекте screen (PictureBox) из отдельных текстовых окошек, объединенных в массив объектов. В приведенной процедуре поверхность строится с точностью до пиксела. Если же строить график на более крупной масштабной сеточке, то метод Pset следует заменить на метод Line с параметром BF.

Поэкспериментировав с различными функциями, можно убедиться в том, что простые нелинейные выражения нередко определяют поверхности сложнейшей изысканной формы. Мир математической нелинейности (как, впрочем, и мир окружающей нас физической реальности) неимоверно богат и разнообразен. Кто знает, какие тайны еще скрыты в его глубинах. Исследование функций двух переменных - крайне занимательное занятие само по себе. Слегка изменяя вид функции и масштаб картинки, можно получить бесконечный ряд фантастически красивых математических "пейзажей". Кроме того, такие компьютерные экскурсии в мир математической нелинейности весьма поучительны. Они развивают способность иначе видеть окружающий нас мир и гораздо глубже понимать его законы. Анализ отдельных графиков позволяет наполнить конкретным смыслом абстрактную философскую формулу о том, что порядок, доведенный до крайней сложности, переходит в хаос - свою диалектическую противоположность. Так происходит, когда форма поверхности настолько сложна, что в данном масштабе рассмотрения выглядит как хаотическая мозаика случайным образом раскрашенных квадратиков (пикселов). Наиболее эффектного результата можно добиться, если экспериментировать с тригонометрическими функциями. Они, будучи примененными к неким несложным нелинейным выражениям, способны порождать бесконечные, причудливо искривленные волновые структуры. Ряды волн, все более измельчающихся, превращаются на экране монитора в особого рода завихрения - так называемые муаровые эффекты. Если кому-то из читателей повезет наткнуться в своих путешествиях по нелинейному миру на что-то неординарное и изысканное, возможно, этим стоит поделиться с остальным человечеством. Присылайте найденные вами функции. Я думаю, что наиболее интересные из них вместе с именами первооткрывателей (вашими именами) будут прославлены на страницах газеты.

А. КОЛЕСНИКОВ,
аndr61@mail.ru

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

Номер: 

29 за 1999 год

Рубрика: 

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

Комментарии

Аватар пользователя Александр
Спасибо большое за качественную статью!
Аватар пользователя Колесников А.
Спасибо, Александр