Лекция №4. Визуализация линий тока.

advertisement
ЛЕКЦИЯ №1. ВВЕДЕНИЕ. ЭЛЕМЕНТЫ ДИФФЕРЕНЦИАЛЬНОЙ
ГЕОМЕТРИИ. ....................................................................................................................... 2
ЛЕКЦИЯ №2. СВОЙСТВА СКАЛЯРНЫХ И ВЕКТОРНЫХ ПОЛЕЙ...................... 6
ЛЕКЦИЯ №3. ВИЗУАЛИЗАЦИЯ СКАЛЯРНЫХ ПОЛЕЙ. ......................................... 8
ЛЕКЦИЯ №4. ВИЗУАЛИЗАЦИЯ ЛИНИЙ ТОКА. (ВИЗУАЛИЗАЦИЯ
ВЕКТОРНЫХ ПОЛЕЙ.) .................................................................................................... 14
ЛЕКЦИЯ №5. МНОЖЕСТВА ЖЮЛИА, МНОЖЕСТВО МАНДЕЛЬБРОТА И
ИХ КОМПЬЮТЕРНОЕ ПРЕДСТАВЛЕНИЕ. .............................................................. 17
ЛЕКЦИЯ №6. СИСТЕМЫ ИТЕРИРОВАННЫХ ФУНКЦИЙ (СИФ). .................... 19
ЛЕКЦИЯ №7. ОСНОВНЫЕ ПОНЯТИЯ, ИСПОЛЬЗУЕМЫЕ ПРИ АНАЛИЗЕ
ИЗОБРАЖЕНИЙ. ............................................................................................................... 24
ЛЕКЦИЯ №8. ПОСТАНОВКА ПРОБЛЕМЫ ВЫДЕЛЕНИЯ ПЕРЕПАДОВ
ЯРКОСТИ И РАЗРЫВОВ ЧИСЛЕННОГО РЕШЕНИЯ. ........................................... 25
ЛЕКЦИЯ №9. ЭТАПЫ ОБРАБОТКИ ИЗОБРАЖЕНИЙ. .......................................... 26
ЛЕКЦИЯ №10. ВЫДЕЛЕНИЕ РАЗРЫВОВ В ЧИСЛЕННОМ РЕШЕНИИ. .......... 28
ЛЕКЦИЯ №11. ВЫДЕЛЕНИЕ РАЗРЫВОВ В ТРЕХМЕРНОМ ЧИСЛЕННОМ
РЕШЕНИИ. .......................................................................................................................... 30
ЛЕКЦИЯ №12. КЛАССИФИКАЦИЯ РАЗРЫВОВ ЧИСЛЕННОГО РЕШЕНИЯ. 32
ВАРИАНТ ТЕОРЕТИЧЕСКОЙ ЧАСТИ ЭКЗАМЕНА. .............................................. 36
ПРИМЕРЫ ЭКЗАМЕНАЦИОННЫХ ЗАДАНИЙ........................................................ 39
ПРИЛОЖЕНИЕ. КРАТКИЕ СВЕДЕНИЯ OPENGL. ................................................. 40
РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА. ............................................................................ 58
1
Лекция №1. Введение. Элементы дифференциальной геометрии.
Введение в визуализацию. Обзор прикладных графических пакетов.
Пространственные кривые. Поверхности. Квадратичные формы поверхности.
Кривизна. Главные кривизны. Средняя и полная кривизны.
Компьютерная графика, ставшая самостоятельным научным направлением,
проникает сегодня во все сферы интеллектуальной деятельности человека, включая
кино и телевидение, издательские системы, космос и авиацию, медицину,
экологический мониторинг, научные исследования и образование. Многие алгоритмы
машинной графики названы по фамилиям авторов – алгоритмы отсечения Сазерленда
(Sazerland), прямые Брезенхейма и Брассини, кривые Безье, поверхности Кунса, Цао
Ена и т.д. Этот список постоянно пополняется новыми алгоритмами, и соответственно
именами их авторов.
Научный аспект компьютерной графики связан с моделированием
динамических процессов, диагностикой и распознаванием образов.
Традиционными объектами для методов визуализации являются скалярные и
векторные поля, поскольку именно в терминах таких полей описываются решения
задач, которые интересуют исследователей. Скалярными полями представляются,
например, температура, плотность
и давление, векторными – скорость,
напряженности электрического и магнитного поля. Минимальная размерность
евклидова пространства, содержащего область определения поля, называется
размерностью
поля
и
определяет
сложность
визуализации.
Наиболее
распространенные задачи оперируют с двух- и трех- мерными объектами, однако
существуют задачи, требующие изучения полей большей размерности, в частности,
задача тензорной геометрии. В зависимости от изучаемого явления, наряду с самим
полем, исследователя могут интересовать отдельные характеристики этого поля.
Приведем несколько простых иллюстрирующих примеров.
 При обработке рентгеновского снимка врача интересуют области наибольшей
плотности, соответствующие патологическим явлениям.
 При изучении аэродинамического обтекания автомобиля инженерами
исследуются режимы образования рециркуляционных зон в зависимости от
скорости обтекания.
Из вышеперечисленного можно сделать вывод, что объекты, представляющие
интерес для исследователя, существенно зависят от изучаемой задачи и для каждого
конкретного случая при визуализации необходимо смещать акценты в зависимости от
выбора проблемы.
Естественно, существует набор методов визуализации,
предлагаемый стандартными пакетами программ. Каждый конкретный пользователь
такого пакета должен выбрать подходящий ему метод или комбинацию методов,
наиболее адекватно изображающие искомые характеристики изучаемого объекта.
Кратко опишем возможности некоторых распространенных пакетов программ.

Пакет IDL (Interactive Data Language) обладает большими графическими
возможностями, которые делают его в некотором смысле универсальным. Он
позволяет создать индивидуальную графическую среду для конкретной задачи.
В частности, в рамках этого пакета возможно:



построение графиков разнообразных функций одной переменной;
использование различных типов осей;
построение графиков функций и поверхностей в различных системах
координат;
2











использование специальных видов графического представления функции
(точки массива, векторные графики, линии уровня)
определение системы координат пользователем;
графическое изображение трехмерных поверхностей с функциональной
закраской;
визуализация решений обыкновенных дифференциальных уравнений;
построение пересекающихся в пространстве объектов;
построение трехмерных объектов;
задание и создание своей палитры;
создание своего визуализационного окна;
импортирование графиков из других пакетов и программных систем;
анимационное представление графических зависимостей;
создание и проигрывание анимационных файлов.
Отличительная особенность IDL заключается в переносимости на различные
платформы. Кроме того система обладает






мощным и лаконичным языком программирования;
редактором для подготовки и редактирования документов и программ;
современным многооконным пользовательским интерфейсом с возможностью
работы в диалоговом режиме;
подробной информативной справочной системой;
способностью обеспечивать многопользовательскую поддержку.
Maple – система компьютерной математики, которая позволяет выполнять не
только символьные, но и численные расчеты, причем это сочетается с
превосходной графикой.
Эта система включает в себя









мощный язык программирования (он же язык для интерактивного общения с
системой);
редактор для подготовки и редактирования документов и программ;
современный многооконный пользовательский интерфейс с возможностью
работы в диалоговом режиме;
мощную справочную систему;
ядро алгоритмов и правил преобразования математических выражений;
численный и символьный процессоры;
систему диагностики;
библиотеки встроенных и дополнительных функций;
пакеты функций сторонних производителей и поддержку некоторых других
языков программирования и программ.
Синтаксис структурных операторов языка Марle напоминает смесь Бейсика и Паскаля.
Остановимся на основных графических возможностях пакета Maple.



построение графиков многих функций одного переменного;
различные типы осей (с линейным и логарифмическим масштабом);
графики функций в декартовой и полярной системе координат;
3










специальные виды графиков (точки массива, векторные графики, линии
уровня)
системы координат, определяемые пользователем;
графики трехмерных поверхностей с функциональной закраской;
графики, представляющие решения дифференциальных уравнений;
построение пересекающихся в пространстве объектов;
задание палитры;
импорт графиков из других пакетов и программных систем;
анимация графиков;
создание и проигрывание анимационных файлов.
Matlab – ядро Марle используется и в пакета Matlab.
Для описания методов визуализации необходимо абстрагироваться от конкретной
задачи и перейти к каким-то достаточно универсальным математическим объектам.
Скалярные и векторные поля наиболее подходят для этих целей. С их помощью мы
может формулировать методы изображения, не вдаваясь в природу исследуемого
процесса и объекта. Любое скалярное поле, будь то плотность вещества или давление,
при визуализации изображается одинаковым образом, затем производится, если это
необходимо, дополнительная обработка в зависимости от цели исследования. Таким
образом, необходимо ввести некоторые понятия из дифференциальной геометрии и
теории векторных полей.
Будем говорить, что в трехмерном евклидовом пространстве задана гладкая или
регулярная
поверхность
S,
если
задано
векторное
уравнение
r  r(u,v), (u,v)  U  V, , U и V - интервалы изменения переменных u, v, и
существуют непрерывные производные ru 
r
r
,
, rv 
u
v
удовлетворяющие
условию ru  rv  0 . Для каждой точки r1 регулярной поверхности существует,
причем
единственная, касательная плоскость, определяемая уравнением
(r  r1 )  (ru  rv )  0 . В каждой точке r1 регулярной поверхности S существует
единственная прямая, проходящая через r1 перпендикулярно к касательной
плоскости, которая называется нормалью. Вектор единичной нормали N = , тогда
уравнение нормали можно записать в виде r  r1  t
ru  rv
 tN .
ru  rv
Для регулярной поверхности S можно ввести понятия ориентированного элемента
поверхности, являющегося вектором dS  (ru  rv )dudv  N dS , и просто элемента
площади dS  dS  ru  rv dudv .
Если на поверхности S рассматривается кривая r  r(u(t),v(t)), то естественно
ввести следующие величины: дифференциал радиус-вектора dr  ru du  rv dv,
квадрат дифференциала длины дуги
ds2  dr  E(u,v)du2  2F(u,v)dudv  G(u,v)dv 2 (1),
2
где
4
 x   y   z 
E(u,v)  ru  ru         
 u   u   u 
x x y y z z
F(u,v)  r  rv 


u v u v u v
2
2
2
u
 x   y   z 
G(u,v)  rv  rv         
 v   v   v 
2
2
2
Формула (1) задает первую основную квадратичную форму поверхности, которая
всегда является положительно определенной.
В каждой точке кривой r  r (u(t),v(t)) вектор кривизны может быть единственным
образом представлен в виде суммы двух векторов, один из которых лежит в
касательной плоскости, а другой направлен вдоль нормали к поверхности S
d 2r
dr

k
n

k
(
N

)  kNN .
G
ds2
ds
N-единичный вектор нормали к поверхности, n-единичный вектор главной нормали
2
 dr
  dr d r 
,
n
,
N

k
,
 ds
  ds ds2 ,N  -кривизна проекции, кривой С на
d 2r
dr dN

касательную плоскость, k N  k(n  N)  2  N  
-кривизна нормального
ds
ds ds
кривой С. k G  k
сечения.
Для того чтобы записать выражение k N
в криволинейных координатах u,v
рассмотрим дифференциал dN  N u du  N v dv и введем обозначения
L(u,v)  ru  N u 
M(u,v)  ru  N v 
N(u,v)  rv  N v 
r
uu
,ru ,rv 
EG  F2
ruv ,ru ,rv 
EG  F2
rvv ,ru ,rv 
,
EG  F2
2
2
тогда dr  dN  L(u,v)du  2M(u,v)dudv  N(u,v)dv
Все производные во второй квадратичной форме берутся в точке (u,v).
В этих обозначениях кривизна нормального сечения в точке (u,v) поверхности S имеет
вид k N  
dr  dN Ldu 2  2Mdudv  Ndv 2

. Точка поверхности, в которой k N
ds2
Edu 2  2Fdudv  Gdv 2
имеет одно и то же значение для всех нормальных сечений (L:M:N=E:F:G) называется
омбилической. В каждой неомбилической точке существуют два нормальных сечения,
которым соответствуют наибольшая k 1 и наименьшая k 2 величина кривизны k N главные кривизны поверхности S в точке (u,v). Плоскости главных нормальных
сечений взаимно перпендикулярны. Величины k1 , k 2 являются собственными
5
числами обобщенной задачи и собственными значениями матрицы (A-kB), где
 L M
E F
, B
A

.
M
N
F
G




1 1
1 EN  2FM  GL
2
Симметрические функции H  (k  k ) 
,
2
2
EG  F2
LN  M 2
K  k1 k 2 
называются соответственно средней и полной кривизной.
EG  F2
Как известно, величины H, K, k 1 и k 2 не зависят от выбора криволинейных
координат.
В зависимости от того будет ли квадратичная форма
определенной,
полуопределенной или неопределенной в точке (u,v), эта последняя является

эллиптической точкой, в которой K  k1k 2  0 ( все нормальные сечения
выпуклы или вогнуты, пример – точки эллипсоида);

параболической точкой (пример – точки цилиндра);

гиперболической точкой (пример – точки однополостного гиперболоида).
Лекция №2. Свойства скалярных и векторных полей.
Векторные поля. Теоремы о дивергенции, роторе и связанные с ними свойства
скалярных и векторных полей. Теорема Гельмгольца.
По определению скалярное поле есть скалярная функция Ф(r)  Ф(x, y,z)
вместе с областью определения аргументов. Поверхности Ф(r)  c называются
поверхностями уровня (изоповерхностями). Они позволяют геометрически
представить структуру скалярного поля.
Векторное поле задается векторной функцией F (r)  F (x, y,z) вместе с
областью определения аргументов. Силовые (векторные) линии в каждой точке r
имеют направление вектора поля F (r) и определяются дифференциальными
уравнениями dr  F (r)  0 . Векторное поля может быть геометрически представлено
своими векторными линиями, относительная плотность которых в каждой точке r
пропорциональна F (r ) .
В прямоугольной декартовой системе координат линейный оператор  определяется
формулой



 j k .
x
y
z
Градиент скалярной функции точки
Ф(r) есть векторная функция точки
grad Ф(r )  Ф .
Дивергенция векторной функции точки F (r) есть скалярная функция точки,
определяемая как div F (r )   F .
Ротор векторной функции точки F (r) есть векторная функция точки, определяемая
как rot F (r )    F .
i
Напомним важнейшие теоремы векторного анализа.
6
Предполагаем, что область V является ограниченной и односвязной, поверхность S
замкнутая и регулярная, а все функции и их частные производные непрерывны в
замкнутой области V S .
1.
   F (r)dv   F (r)dS
V
2.
S
   F (r)dv   F (r)  dS
V
3.
S
   Ф(r)dv   Ф(r)dS
V
4.
S

2
2
V
5.
Ф
   Ф  Ф  dv    Ф  Ф dS     n
S
S
Ф
Ф
 
 dS .
n 
  Фdv   Ф  dS =  n dS .
2
V
S
Если векторная функция F (r) однозначна и имеет непрерывные частные
производные в конечной односвязной области V, лежащая в области V поверхность S
односвязна и регулярна и ограничена замкнутой регулярной кривой С, тогда верны
следующие утверждения:
1.
   F (r )  dS   F (r )  dr , ориентация
S
dS должна быть согласована с
C
обходом контура.
2.
 (  F (r))  dS 
S
 F (r)  dr .
C
Векторное поле F (r) называется безвихревым в области V, если в каждой точке этой
области  F (r)  0. Поле F (r) является безвихревым тогда и только тогда, когда
- F (r) есть градиент некоторой скалярной функции Ф(r) в каждой точке области V.
Функцию Ф(r) часто называют скалярным потенциалом безвихревого поля.
Векторное поле F (r) называется соленоидальным в области V, если в каждой точке
этой области  F (r)  0. Поле F (r) является соленоидальным тогда и только
тогда, когда F (r) есть ротор некоторой функции точки A( r ) в каждой точке области
V. Функцию A( r ) часто называют векторным потенциалом соленоидального поля.
Теорема Гельмгольца.
Пусть V – конечная открытая область пространства, ограниченная регулярной
поверхностью S положительная которой непрерывна в каждой точке поверхности.
Если дивергенции и ротор F (r) определены в каждой точке r области V, то всюду в
V функция F (r) может быть представлена в виде суммы безвихревого поля F1 (r ) и
соленоидального поля F2 (r ) .
F (r )  F1 (r )  F2 (r )

.
  F1 (r )  0,   F2 (r )  0 
7
Лекция №3. Визуализация скалярных полей.
Задача триангуляции. Постановка и обзор методов ее решения. Ячеечные
методы (cell-based), метод предиктор-корректора (predictor-corrector),
алгоритм"марширующих кубов", алгоритм Канейро, алгоритм Скалы.
Данная лекция посвящена сравнительному анализу алгоритмов визуализирующих
заданную поверхность с помощью аппроксимации её треугольниками. Это так
называемая задача триангуляции. Проблема визуализации поверхности, заданной
различными способами возникает во многих областях математики, физики, медицины:
 Визуализация
экспериментальных данных. При проведении физических
экспериментов очень часто возникает необходимость отобразить информацию сразу
со всех датчиков. Например, при измерении температуры среды необходимо
отобразить область с температурой, выше заданной.
 Функциональное представление. В некоторых математических задачах или
расчетах необходимо визуализировать геометрический объект, заданный с помощью
одной вещественной непрерывной описывающей функции нескольких переменных в
виде F(X)> 0. Также может возникнуть общая задача, в которой описывающая
функция задана с помощью множества точек, в которых известно её значение.
Рис.1 Функциональное представление. Визуализирован объект, заданный функцией
f(x,y,z)=0
  x 2  y 2 
2
f ( x, y , z )   1  
     x  3,9   y 2  1,44

  6,5   4  



  x  3,9   y 1,44   z
2
2
Медицина. Использование компьютеров дало возможность развиваться новым
направлениям томографической интроскопии, таким как компьютерная томография
(CT-computed tomography), магнитная резонансная томография (MRI-magnetic
resonance imaging) и позитронная эмиссионная томография (PET-positron emission
tomography). С помощью томографической аппаратуры можно получить снимки
множества сечений тела пациента, которые характеризуют особенности его анатомии
и физиологии. Эти снимки с чрезвычайной четкостью показывают различные органы,
причем изображения органов не налагаются друг на друга. Методы визуализации
позволяют реконструировать трехмерную структуру органов по множеству
параллельных сечений.
8
8
Под визуализацией трехмерных скалярных полей понимается визуализация
поверхности, заданной уравнением функции от трех аргументов и фиксированного
значения этой функции - уровня.
( x, y, z ) | f ( x, y, z )  c,
где f(x,y,z) - это заданная функция, а с - заданный уровень. Множество точек,
удовлетворяющее этой формуле, и есть искомая поверхность. Однако удобнее
восстанавливать не саму поверхность, а поверхность, аппроксимирующую искомую с
помощью треугольников. Такой способ визуализации называется триангуляцией.
При решении задачи визуализации важную роль играет способ задания функции,
которая описывает искомую поверхность. В большинстве прикладных задач функция
задается таблично на регулярной сетке или имеет явное отображение, описываемое
заданной формулой. Но часто возникают задачи, в которых поверхность задана
неявным образом или таблица значений задана на нерегулярной сетке. Такие задачи
могут возникать во многих приложениях, например, в задаче измерения расстояния до
поверхности с помощью облучения или в задаче реконструкции трехмерной структуры
с помощью множества контуров-срезов (в медицинских исследованиях). В таких
задачах предлагается использовать следующий алгоритм действий: поверхность S,
заданная выборкой X, аппроксимируется касательными плоскостями, проходящими
через каждую точку выборки X. Затем искомая функция, задающая поверхность,
считается следующим образом: для каждой точки P пространства R функция в этой
точке равна расстоянию до ближайшей касательной плоскости, взятому со знаком
плюс, если точка находится внутри объема, ограниченного построенными
плоскостями, или со знаком минус, если точка находится вне этого объема. Затем
проводится триангуляция поверхности, заданной с помощью получившейся функции.
Обычно сравниваются алгоритмы по следующим критериям:




Скорость работы
Ошибка аппроксимации
Количество сгенерированных треугольников (большое количество получаемых
треугольников, несомненно, негативно влияет на скорость отрисовки искомой
поверхности, при этом тратится большое количество памяти).
Качество генерируемых треугольников
Для пояснения этого критерия необходимо ввести некий термин – «мера правильности
треугольника». Это есть отношение меньшей стороны треугольника к большей
стороне. Таким образом, мера правильности треугольника может принимать значения
от нуля до единицы (для равностороннего правильного
треугольника). Чем
«компактнее» треугольник - тем правильнее освещение. Если учесть тот факт, что
большое количество треугольников невыгодно, то получается, что «идеальный»
треугольник - тот, у которого максимальная площадь при заданном периметре. Это
равносторонний треугольник. Таким образом, мера правильности треугольника
обуславливает корректность освещения.
Обзор методов решения задачи триангуляции
Ячеечные методы (cell-based)
В методах такого типа происходит разбиение области триангуляции на ячейки –
параллелепипеды или треугольные пирамиды. Далее производится триангуляция
9
поверхности в каждой ячейке отдельно. Причем каждая ячейка триангулируется одним
из заданных ранее способов, т.е. значения координат для треугольников просто
берутся из заранее заданной таблицы.
Для применения методов этого типа необходимо задать допустимую ошибку
аппроксимации, исходя из которой, следует выбрать размер ячейки - куба или
тетраэдра (если быть точным - то треугольной пирамиды, т.к. тетраэдрами нельзя
замостить пространство без пропусков и наложений.) После этого с помощью уже
известных таблиц триангуляции можно получить искомое множество треугольников.
При этом процедура триангуляции каждой ячейки сводится к анализу значений
функции в вершинах этой ячейки - другими словами, определяется, какие вершины
лежат внутри поверхности, а какие - снаружи. На основе этого можно сделать вывод о
достаточности определения функции только в вершинах ячеек.
Наиболее известные ячеечные алгоритмы: метод Канейро (Caneiro), метод,
предложенный Гуэзеком (Gueziec), метод Скалы (Skala), метод «Марширующих
кубов».
Метод типа предиктор-корректор (predictor-corrector)
Методы из этого класса основаны на добавлении к уже имеющемуся множеству точек
триангуляции ещё одной, лежащей на касательной плоскости к заданной функции (это
положение предиктора (predictor) - предсказанное) и затем передвижению её до
визуализируемой поверхности (это положение корректора (corrector)
скорректированное).
При использовании методов из этого класса необходимо знать значение функции во
всех точках пространства и найти хотя бы одну точку, принадлежащую искомой
поверхности. Метод заключается в наращивании треугольников - на каждой итерации
метода к уже существующему множеству треугольников добавляется еще один,
построенный на ребре крайнего треугольника и предсказанной (а затем
скорректированной по кривизне поверхности) точки на поверхности.
Алгоритм "марширующих кубов"
Алгоритм «Марширующих кубов», предложенный Лоренсеном, можно разбить на два
этапа:
1. разбиение области G пространства R3 на конечное множество ячеек,
поиск ячеек пересекаемых искомой поверхностью;
2. аппроксимация поверхности в найденных ячейках.
Две эти подзадачи являются независимыми. Рассмотрим их подробнее.
Первый этап
На этом этапе необходимо:
1. разбить область G на ячейки,
2. выбрать ячейки, которые пересекаются с искомой поверхностью.
После того как область G будет разбита на ячейки, значения функции, задающей
поверхность, будут известны только в вершинах этих ячеек. Таким образом, на этом
этапе ячейка является главной структурной единицей во всех алгоритмах.
В тех задачах, в которых функция, задающая поверхность задана таблицей на
регулярной сетке, проблема разбиения области G на ячейки сразу отпадает, ввиду
однозначности ее решения - ячейка должна быть параллелепипедом - для того, чтобы
знать значения функции в вершинах ячейки. Если же функция задана явно, то ячейку
можно выбрать произвольной формы и размера. Однако следует учесть некоторые
10
проблемы, связанные с аппроксимацией искомой поверхности в ячейке. Если размер
ячейки будет очень большим, то возможна большая потеря точности.
Рис.2. На схеме квадрат обозначает ячейку, овал - некий изгиб искомой поверхности.
Как видно из рис.2, при большом размере ячейки некоторые части искомой
поверхности просто не будут видны. Однако выбирать ячейки очень маленького
размера не очень хорошо с точки зрения быстродействия метода. Поэтому размер
ячейки надо выбирать не меньше допустимой погрешности построения искомой
поверхности.
Форма ячейки в алгоритме «Марширующих кубов» - параллелепипед. Однако это не
единственно возможный вариант. Форма ячейки определяет дальнейшую
триангуляцию ячейки. Пусть форма ячейки - многогранник с N вершинами, тогда
сопоставим каждой ячейке N-битовый индекс, а каждой вершине - один бит в индексе.
Причем, если вершина ячейки находится вне объема ограниченного искомой
поверхностью, то значение этого бита <0>, иначе <1>. Тогда количество разных типов
триангуляции будет 2N. Отсюда видно, что использовать в качестве ячейки, например,
икосаэдр не оптимально. Многогранник с наименьшим количеством вершин треугольная пирамида. Именно она используется в качестве ячейки в алгоритмах
Канейро, Скалы.
Итак, допустим, что область G уже разбита на ячейки. Тогда главной проблемой
становится поиск ячеек пересекаемых искомой поверхностью. Пусть С - множество
ячеек, тогда Cv - множество ячеек, пересекаемых поверхностью F(P)=v. Тогда можно
считать, что поверхность пересекает ячейку, если существуют такие P 1 и P2 - вершины
ячейки, что
F ( p1 )    F ( p2 ) (*)
Это условие выполняется, если справедливо неравенство
MinF ( pi )    MaxF ( p j ) (**)
i
j
где pi и pj - вершины ячейки.
Таким образом, проблема свелась к следующему: из множества ячеек C выбрать
подмножество ячеек Cv, удовлетворяющих условию (**).
Рассмотрим далее проблему аппроксимации поверхности в ячейке.
Второй этап
Как уже было сказано, пространство разбивается на ячейки, и отбираются только те
ячейки, в которых надо производить аппроксимацию. Таким образом, задачей второго
этапа является аппроксимация поверхности в одной ячейке. Наиболее оптимальный
способ аппроксимации - триангуляция. Посчитаем, сколько способов триангуляции
имеет параллелепипед. Пусть имеется 8-битовый индекс. Тогда сопоставим каждой
вершине один бит в индексе. Причем, если вершина ячейки находится вне объема
ограниченного искомой поверхностью, то значение этого бита <0>, иначе <1>. Тогда
количество разных типов триангуляции будет 28=256. Однако из рис.3 видно, что
11
способ триангуляции с индексом ( i ) совпадает со способом триангуляции с индексом
( i  j ).
Рис.3 Cпособы триангуляции
Итого получается 128 различных способов триангуляции. Однако, используя
симметрию и вращение, все 128 способов можно свести к 14:
Получив способ триангуляции, можно уже аппроксимировать поверхность в ячейке. К
этому моменту уже известно количество треугольников, а для каждого треугольника
известны ребра ячеек, на которых лежат его вершины. Остается найти точку на ребре
ячейки, в которой поверхность ее пересекает. В случае явно заданной функции точку
можно с большой точностью найти методами поиска корня, а в случае заданной
таблично функции искомая точка находится с помощью линейной интерполяции двух
вершин.
Алгоритм Канейро
Алгоритм Канейро [2], основанный на разбиении пространства на треугольные
пирамиды, как и алгоритм «Марширующих кубов», состоит из двух этапов:
1. разбиение пространства на конечное множество ячеек, затем поиск ячеек
пересекаемых искомой поверхностью;
2. аппроксимация поверхности в найденных ячейках.
Первый этап
Как уже было сказано, алгоритм использует в качестве ячеек треугольные пирамиды.
Для этого пространство разбивается на параллелепипеды в соответствии с сеткой, на
которой задана функция, а затем каждый параллелепипед разбивается на треугольные
пирамиды. Такой же подход применяется в алгоритмах Скалы. Разбиение
параллелепипеда на треугольные пирамиды по методу Канейро показано на рис. 4.
12
Рис. 4 Разбиение параллелепипеда на треугольные пирамиды
Однако при подобном разбиении <швы> <разрезов> не совпадают. Другими словами,
стороны треугольников, полученных в результате триангуляции соседних ячеек, не
будут совпадать, что повлечет за собой появление <дырок>. Для решения этой
проблемы предлагается разбивать параллелепипеды в <шахматном порядке> - по
очереди меняя шаблон разбиения: с показанного на рис.4 на зеркальный, как показано
на рис.5
Рис. 5 Разбиение параллелепипеда на треугольные пирамиды
Второй этап
Задача второго этапа - аппроксимация поверхности в ячейке. Для алгоритмов Канейро,
Скалы, второй этап один и тот же - производится триангуляция треугольной пирамиды
в соответствии со значениями функции в вершинах.
Подсчитаем, число способов триангуляции треугольной пирамиды. Пусть имеется
4-битовый индекс. Тогда сопоставим каждой вершине один бит в индексе, таким же
образом, как и для параллелепипеда. Тогда количество разных типов триангуляции
будет 24=16. Однако, используя симметрию и вращение, число способов можно свести
к 3.
Рис. 6 Способы триангуляции треугольной пирамиды
Алгоритм Скалы
Алгоритм Скалы, относящийся к разряду ячеечных методов, был разработан для
визуализации трехмерных скалярных полей, заданных с помощью функции,
13
определенной в каждой точке пространства. Однако, метод разбиения пространства на
ячейки таков, что дает возможность использовать этот алгоритм для визуализации
скалярных полей, заданных на регулярной сетке.
Рис. 7 Построение ячейки у параллелепипеда
Для разбиения пространства на ячейки метод Скалы использует узлы регулярной
сетки, находящиеся в вершинах параллелепипеда, полученного тем же способом, что и
в выше рассмотренных методах, и дополнительную точку, находящуюся на
пересечении диагоналей этого параллелепипеда. Для вычисления значения функции в
этой точке предлагается использовать линейную интерполяцию значений функции в
вершинах параллелепипеда. Для каждого параллелепипеда, полученного из узлов
регулярной сетки, строится ячейка способом, показанным на рис. 7. При таком
разбиении для каждой ячейки используются <срединные> точки <соседних>
параллелепипедов. На рис.10 это точки I,K,D. Итог этого разбиения - 12 треугольных
пирамид (DEAC, DABC, DFBC, DFEC, IEAC, IAHC, IGHC, IEGC, KAHC, KHJC,
KJBC, KABC).
Лекция №4. Визуализация линий тока. (Визуализация векторных полей.)
Определение линий тока. Алгоритм нахождения линий тока. Алгоритм построения
линий тока.
 Если в каждой точке пространства М поставить в соответствие вектор r , в
результате получим векторное поле. В декартовой системе координат
двумерное
векторное
поле
можно
записать
в
виде
r ( x, y )  P( x, y ) i  Q ( x, y ) j . Скалярные функции P, Q однозначно
определяют векторное поле.
 Через каждую точку М проходит одна линия тока. За исключением точек, где
поле не определено или r ( M )  0 , линии тока не пересекаются. В декартовых
координатах уравнение линий тока имеет вид
dx
dy
.

P ( x, y ) Q ( x, y )
Алгоритм нахождения линий тока
Алгоритм основывается только на информации, которая явно дана в узлах расчетной
сетки. Внутри ячеек сетки информации нет. По определению линий тока, известно, что
14
в любой точке среды проходит только одна линия тока. Поэтому нужно определить
правила, по которым можно быстро интерполировать векторное поле внутри ячейки,
то есть интерполировать две координатные компоненты.
Для нахождения линий тока векторного поля предлагается применить двумерный
аналог метода Фонга. Алгоритм нахождение линий тока базируется на билинейной
интерполяции вдоль отрезков прямой.
Описание алгоритма
Первый этап. Сначала происходит инициализация базовой точки на области
определения векторного поля, которая будет определять одну линию тока. Механизм
инициализации базовой точки может быть разный. Итак, пусть задана базовая точка
( xb , yb ) .
Второй этап. Нужно определить, какой ячейке сетки принадлежит базовая точка. На
этом этапе работают алгоритмы локализации точки. Время локализации точки зависит
от типа разностной сетки. Можно предложить два метода:
1. Последовательный полный перебор ячеек. Рассмотрим текущую
четырехугольную ячейку с индексами: (i, j), (i+1, j), (i+1, j+1), (i, j+1).
Вычисляется габаритный прямоугольник, описывающий ячейку. Если
базовая точка не принадлежит описывающему прямоугольнику, то базовая
точка не принадлежит ячейке, в противном случае, применяем следующий
способ. Поскольку узлы ячеек легко ориентировать по часовой стрелке или
против нее, то ребра можно рассматривать в виде векторов, относительно
которых можно определить положение базовой точки. Если для каждого
вектора базовая точка будет, в зависимости от ориентации, слева или
справа, то она принадлежит ячейке.
(i, j  1)
Ymax
(i  1, j  1)
( xb , yb )
y  yb
(i, j )
(i  1, j )
Ymin
X min
x  xb
X max
Рис 8. Текущая четырехугольная ячейка и габаритный описывающий прямоугольник.
2. В этом случае возможен полный перебор, только в худшем случае.
Рассматриваются горизонтальная ( y  yb ) и вертикальная ( x  xb ) прямые,
которые пересекаются в базовой точке. Рассмотрим текущую четырехугольную
ячейку с индексами: (i, j), (i+1, j), (i+1, j+1), (i, j+1). Сначала рассматриваются
координаты абсцисс узлов ячейки. Если существуют узлы с координатами
x1 , x2 : x1  xb  x2 или x1  xb  x2 , то необходимо проверить факт
пересечения с вертикальной прямой. Если пересечения нет, то переходим к
следующей ячейке. Проверка факта пересечения с вертикальной прямой
аналогична проверке факта пересечения с горизонтальной, если ячейка же не
пересекает вертикальную прямую, то переходим к следующей ячейке. Если
15
ячейка пересекает обе прямые, то ячейка анализируется первым способом.
Естественно, такой подход сокращает число исследуемых ячеек.
Следует заметить, эти методы пригодны только для выпуклых ячеек.
Y
(i, j  1)
( xb , yb )
(i, j )
(i  1, j  1)
(i  1, j )
X
Рис 9. Текущая четырехугольная ячейка с ориентированными ребрами.
Третий этап.
Пусть нам известно, что базовая точка принадлежит ячейке с индексами (i, j), (i+1, j),
(i+1, j+1), (i, j+1). Векторное поле задано в узлах, поэтому нам надо восполнить
значение векторной величины U в базовой точке.
Предлагается применить алгоритм билинейной интерполяции по горизонтали или по
вертикали. Не ограничивая общности, допустим, что i=0, j=0, то есть рассматривается
ячейка
(0,
0),
(1,
0),
(1,
1),
(0,1).
Введем
обозначения
v1  (0,1),v2  (1,1), v3  (1,0), v4  (0,0) . Координаты векторов в узлах обозначим:
( xv , yv ), ( xv , yv ), ( xv , yv ), ( xv , yv ).
4
4
1
1
2
2
3
3
Алгоритм
геометрического
восполнения
заключается в билинейной интерполяции двух векторных векторов.
(0,1)  v1
Ymax
(1,1)  v2
( xb , yb )
y  yb
B
C
(0,0)  v4
(1,0)  v3
Ymin
X min
x  xb
X max
Рис. 10 Текущая ячейка с базовой точкой, внутренними отрезками сканирующих
прямых BC и DE.
Алгоритм графического восполнения векторных величин внутри ячеек осуществляется
вдоль прямой сканирования, которая проходит через локализованную базовую точку
( xb , yb ) текущей ячейки.
16
Для сканирующей прямой находятся точки пересечения с ребрами ячейки. Обозначим
их B, C. Теперь в эти точки необходимо интерполировать значения U из узлов ребер.
Интерполирование значение векторной величины U подразумевает интерполирование
координат вектора ( x, y ) . Воспользуемся линейной интерполяцией:
xB  txv  (1  t ) xv , xC  t * xv  (1  t * ) xv ,
1
4
y B  tyv  (1  t ) yv ,
1
4
2
3
yC  t yv  (1  t ) yv ,
*
*
2
3
где параметры t , t : 0  t  1, 0  t  1; t  v1 B v4 B , t  v2C v3C .
Вторая интерполяция. Линейно интерполируем значение координат векторов из точек
В, С в точку ( xb , yb )
*
*
*
xb  pxB  (1  p ) xC ,
yb  py B  (1  p ) yC , 0  p  1, p  AB AC , A  ( xb , yb )
.
В результате мы получили приближенное значение искомой векторной величины U в
базовой точке.
Четвертый этап. Мы определили направление движения линии тока от базовой точки.
Теперь нужно найти приближенную кусочно-линейную траектория линии тока.
Метод 1.
Эмпирически задается длина элементарного шага смещения от базовой точки вдоль
вектора U. Например, длина шага ориентировочно определяется некоторым
соотношением габаритов области определения. Зная направление шага и его длину,
однозначно определяется следующая точка линии тока A1 . Если вектор AA1 не
пересекает ни одного ребра ячейки, то точка A1 лежит в текущей ячейке, тогда нужно
повторить третий этап, в другом случае линия тока переходит в другую ячейку, и она
определяется однозначно по пересеченному ребру. Следовательно, меняется текущая
ячейка, и мы переходим к третьему этапу. Продолжая, таким образом,
последовательно определяем линию тока.
Метод 2.
Этот способ является более быстрым, но менее точным, он базируется на одной
линейной интерполяции вдоль ребра ячейки. Из базовой точки выпускается вектор по
найденному направлению до пересечения с каким-нибудь ребром ячейки. Точка
пересечения A1 считается следующей точкой линии тока, и она переходит в
следующую ячейку. Далее переходим к третьему этапу, в этом методу происходит
только одна интерполяция векторной величины вдоль пересекаемого ребра. В
результате в точке A1 получает значение величины U. Затем из точки A1 выпускается
вектор в новом найденном направлении до пересечения с ребром данной ячейки.
Процесс повторяется.
Следует учесть, из базовой точки мы строим линии тока, двигаясь вперед, в этом
случае мы строим линию тока не полностью. По описанному алгоритму легко
продолжить
линию тока в обратном направлении от базовой точки. Для этого
необходимо использовать вектор, обратный вектору элементарного смещения.
Лекция №5. Множества
Жюлиа, множество Мандельброта и их
компьютерное представление.
Комплексные динамические системы. Итерации рациональной функции R(z)=P(z)/Q(z).
Периодическая точка и периодическая траектория (цикл), собственное значение
точки z 0 . Классификация периодических точек. Бассейн притяжения. Определение и
17
фундаментальные свойства множества Жюлиа. Динамика в окрестности
нейтральных периодических точек. Параболический случай. Множества Жюлиа для
трансцендентных отображений. Множество Мандельброта для квадратичного
отображения. Построение множества Мандельброта
Вероятно, нельзя привести пример такого компьютерного эксперимента, который
впечатлением от результатов превосходил бы то чувство удивления и восхищения,
которое вызывает графическое построение множеств Жюлиа и множества
Мандельброта на плоскости.
Ограничимся рассмотрением функции, которая представляет собой полиномы одного
комплексного переменного. Пусть
f ( z)  an z n  an1 z n1  ...  a1 z  a0 ,
an  0.
полином степени n  2 коэффициенты которого комплексные числа. Множество
Жюлиа функции f, обозначаемое J(f), определяется как
J ( f )  {z : f ( n ) ( z) , n }
Таким образом, множество Жюлиа f есть граница множества точек z, стремящихся к
бесконечности при итерировании f(z). Множество названо в честь французского
математика Гастона Жюлиа (1893-1978), который одновременно с Пьером Фату (18781929) в 1917-19 гг. написал основополагающие статьи по итерированию функций
комплексного переменного. Еще раз мы видим впечатляющий пример математических
исследований, которые далеко опередили свое время в том смысле, что потребовалось
более 50 лет, прежде чем компьютерная графика достигла уровня, позволяющего
наблюдать эти математические объекты. Можно написать простую программу для
построения заполняющего множества Жюлиа. Заполняющее множество Жюлиа
состоит из точек, орбиты которых пойманы, в отличие от границы этого множества,
которое и является настоящим множеством Жюлиа. Заполняющие множества более
привлекательны визуально и именно по этой причине наиболее часто реализуются
программно. Такая программа наилучшим образом работает в случае множества
Жюлиа, обладающих притягивающей периодической орбитой. В первую очередь
рассмотрим множества Жюлиа квадратичных функций
f c ( z )  z 2  c, скомплексная константа.
Приведем примеры изображений множеств Жюлиа для различных с.
c=0.32+0.043i
c= - 0.39054-0.58679i
Множество Мандельброта
2
Мы убедились в том, что множество Жюлиа функции z  c, обладают большим
разнообразием. Действительно, для каждого нового значения с мы получаем
впечатляющие изображения. Тем не менее, на самом деле существуют всего два типа
18
множеств Жюлиа. Каждое множество Жюлиа функции f c ( z )  z  c, либо связно,
либо вполне несвязно.
Множество Мандельброта служит индикатором двух типов множеств Жюлиа функции
z 2  c . Каждая точка в множестве Мандельброта представляет значение с, для
которого множество Жюлиа J ( f c ) связно. Каждая точка из дополнения к множеству
2
Мандельброта представляет значение с, для которого J ( f c ) вполне несвязно.
Множество Мандельброта М для полинома
f c ( z)  z 2  c, определяется как
M  {c  C :{ f c( n ) (0)}n0 ограничена}.
Лекция №6. Системы итерированных функций (СИФ).
Метрика Хаусдорфа. Фрактал как аттрактор СИФ. Сжимающие отображения на
пространстве фракталов. Примеры СИФ, задаваемые композиций аффинных
отображений. Теорема Барнсли о коллаже. "Дуновение ветра" - непрерывная
зависимость аттракторов СИФ от параметров. Анимация фрактальных
изображений.
Опишем хорошее пространство, в котором и будем изучать геометрию фракталов. Мы
2
будем работать в некотором полном метрическом пространстве, таком как ( R ,
эвклидова метрика) или (С, сферическая метрика), которое будем обозначать (X, d).
Для описания фракталов удобнее ввести пространство к описанию которого мы и
перейдем.
Определение 1. Пусть (X, d) - полное метрическое пространство. Тогда H(X)
обозначает пространство, элементами которого являются компактные подмножества X,
исключая пустое множество.
Для того, чтобы оценивать близость между элементами H(X), введем так называемую
метрику Xаусдорфа следующим образом.
Определение 2. Пусть (X, d) - полное метрическое пространство x  X, B  H(X ) ,
тогда расстояние от точки x до множества B определяется как
d ( x, B)  min{d ( x, y) : y  B}.
Определение 3. Пусть (X, d) - полное метрическое пространство, A, B  H ( X ) , тогда
d ( A, B)  max{d ( x, B) : x  A} называется расстоянием от множества А до
множества В.
Для иллюстрации этого определения рассмотрим следующий пример:
A  {x1 , x2 : x12  x22  4}
B  {x 1 , x2 : x12  x22  1}
19
x2
1
2
x1
Тогда легко видеть, что d ( A, B)  max{d ( x , B) : x  A}  1,
d ( B, A)  max{d ( x, A) : x  B}  0.
Можно сравнить также расстояния d ( Россия, Москва) и d ( Москва, Россия ).
Определение 4. Пусть (X, d) - полное метрическое пространство. Тогда хаусдорфово
расстояние
между
элементами
определяется
как
A, B  H ( X )
h( A, B)  d ( A, B)  d ( B, A)  max{d ( A, B); d ( B, A)}.
Оказывается, что функция h(A,B) удовлетворяет всем аксиомам метрики, и (H(X),h)
является метрическим пространством. Более того, справедлива
Теорема 1. Если (X, d) - полное метрическое пространство, то (H(X),h) - тоже полное
метрическое пространство относительно метрики Хаусдорфа. Более того, если
{An  H ( X )}n1 - последовательность Коши, то имеет следующую структуру
A  lim An  H ( X ) A  {x  X :  последовательность Коши {xn : x x  An } такая,
n 
что lim xn  x} .
n
Мы обратимся теперь к одному из наиболее замечательных и глубоких достижений в
теории фракталов - системам итерированных функций или IFS (Iterated Function
Systems). Математические аспекты теории были разработаны Джоном Хатчинсоном
(John E. Hutchinson, Fractals and Self Similarity, Indiana University Mathematics Journal,
v.30, N 5. 1981, pp. 713-717.), a сам метод стал хорошо известен благодаря Майклу
Барнсли (Мichael Barnsley, Fractals Everywhere, Academic Press, Boston, 1988).
Подход на основе систем итерированных функций представляет хорошую
теоретическую базу для математического исследования многих классических
фракталов, а также их обобщений.
Следует иметь в виду, с самого начала, что результат применения IFS называемый
аттрактором, не всегда является фракталом. Это может быть любой компакт, включая
интервал или квадрат. Тем не менее, изучение систем итерированных функций важно
для теории фракталов, так как с их помощью можно получить удивительное
множество красивых фрактальных изображений.
Для определения IFS рассмотрим вначале ковер Серпинского, который строится
следующим образом
n=0, S 0
n=1, S1
20
удаляется средняя часть.
n=2, S 2
Это множество было придумано Вацлавом Серпинским в 1915 году, а сам термин
«ковер (gasket) Cерпинского» принадлежит Бенуа Мандельброту.
n
Рассмотрим теперь произвольное аффинное преобразование Т пространство R ,
n
которое можно представить в следующем виде: T ( x )  Ax  a, x  R
  x1   1
   
x
  2  2
2
В случае плоского пространства R имеем T  
1   x1   1 

 2   x2   2 
Так, например, для ковра Серпинского аффинные преобразования показаны на
следующем рисунке
T3
T1
T2
В матричной форме они имеют следующий вид
  x   1 2 0   x1  0
T1   1    
     ,
  x2    0 1 2   x2   0 
  x   1 2 0   x1  1 2 
T   1  
 x    0 ,
x
0
1
2
 2  
  2 
  x   1 2 0   x1   1 4 
T1   1    

  
  x2    0 1 2   x2   3 4 
Рассмотрим теперь два других метода
детерминированный и рандомизированный.
построения
ковра
Серпинского:
21
В детерминированном алгоритме рассматривают следующую последовательность
множеств:
E0 - компактное множество (произвольное),
E 1  T1 ( E0 ) T2 ( E0 ) T3 ( E0 )
En  T1 ( En 1 ) T2 ( En 1 ) T3 ( En 1 )
Если в качестве E0 выбрать замкнутую треугольную область S 0 , то множества E n
построенные указанным способом, будут те же, что и при удалении центральных
треугольных частей.
В рандомизированном алгоритме в качестве начального множества выбирают одну
точку:
x 0 - начальная точка (произвольная)
x1  T1 ( x 0 ) or T2 ( x 0 ) or T3 ( x 0 )
x n  T1 ( x n-1 ) or T2 ( x n-1 ) or T3 ( x n-1 )
На каждом шаге
вместо того, чтобы применять сразу три преобразования
T1 ( S ), T2 ( S ), T3 ( S ) , мы используем только одно, выбранное случайным образом.
Следовательно, на каждом шаге получаем ровно одну точку. Оказывается, что после
некоторого переходного этапа точки, полученные в результате выполнения
рандомизированного алгоритма, в точности заполняют ковер Серпинского.
Замечательным свойством алгоритма, основанного на теории IFS, является то, что их
результат (аттрактор) совершенно не зависит от выбора начального множества E0 или
начальной точки x 0 . В случае детерминированного алгоритма это означает, что в
качестве E0 можно взять любое компактное множество на плоскости: предельное
множество будет по-прежнему совпадать с ковром Серпинского. В случае
рандомизированного алгоритма, вне зависимости от выбора начальной точки x 0 ,
после некоторых итераций точки начинают заполнять ковер Серпинского.
В общем случае, для того, чтобы построить систему итерированных функций (IFS)
введем в рассмотрение совокупность сжимающих отображений, т. е. таких
отображений, что
d (T ( x ), T ( y )  sd ( x, y ), 0  s  1, x, y  X отображений,
т. е.
Рассмотрим набор сжимающих отображений
T1 с коэффициентом сжатия s1  1
T2 с коэффициентом сжатия s2  1
Tm с коэффициентом сжатия sm  1
действующих на X. Эти m отображений используются для построения одного
сжимающего отображения T в пространстве H(X) всех непустых компактов из X.
Преобразование Хатчинсона T : H  H определяется
следующим образом
T( E )  T1 ( E ) T2 ( E ) ... Tm ( E ), E  H .
Это преобразование ставит в соответствие «точкам» из H также «точки» из H, причем
под «точками» здесь понимается компактные множества.
22
Теперь можно ввести центральное
Определение 5. Системой итерированных функций (IFS) называется совокупность
введенных ранее отображений вместе с итерационной схемой:
E0 - компактное множество (произвольное)
E1  T ( E0 )
En  T ( En 1 ),
Основная задача теории IFS - выяснить, когда IFS порождает предельное множество E:
E  limEn в смысле сходимости в метрике Хаусдорфа. Если предел существует, то
n
множество Е называется аттрактором системы итерированных функций. Причем
аттрактор часто ( но не всегда !) оказывается фрактальным множеством. Очевидно,
для того чтобы обеспечить сходимость, требуется наложить определенные
ограничения на введенные выше преобразования, к примеру запретить точкам уходить
на бесконечность.
Мы уже представили основные идеи, необходимые для установления условий
сходимости. Если нам удастся показать, что T является сжимающим отображением на
метрическом пространстве (H(X), h), то мы сможем применить теорию сжимающих
отображений. В этом случае аттрактор Е будет представлять неподвижную точку
отображения Т.
Справедливы
Теорема 2. Преобразование Т является сжимающим отображением на H(X). Его
коэффициент сжатия равен: s  max{s1 ,..., sm } ;
и
n
Теорема 3. Пусть T1 , T2 ,...Tm - сжимающие отображения на R . Для произвольного
начального
множества
E0  H ,
система
итерированных
функций
En  T ( E n 1 ), n  1, 2...,
сходится в метрике Xаусдорфа
единственному
множеству E  H . Множество Е называется аттрактором IFS. Обратно, множество Е
(n)
(n)
можно представить в виде: E  lim T ( E0 ) , где T ( E0 )  T (T (...T ( E0 ))) .
n 
Реализация IFS
Пусть IFS задано аффинными преобразованиями:
a
Ti ( x)   i
 ci
bi 
e 
x   i ,

di 
 fi 
i  1,..., m.
Будем хранить все коэффициенты в одной матрице С размера m  6
 a1
a
C 2

a
 m
b1
b2
c1
c2
d 1 e1
d 2 e2
bm
cm
d m em
f1 
f2 


f m 
которая называется таблицей IFS кода.
23
Рандомизированный алгоритм отличается от детерминированного, главным образом,
двумя факторами. Во-первых, начальное множество содержит всего одну точку. Вовторых, на каждом шаге используется только одно аффинное преобразование из всей
совокупности преобразований, задающих IFS, которое выбирается случайным
образом. Полученное множество также содержит ровно одну точку, которая сразу же
выводится на экран
и используется для вычисления следующей итерации.
Следовательно, отпадает необходимость хранить все точки, кроме текущей.
Аффинное преобразование T ( x )  Ax  a уменьшает ( или увеличивает) площади в
|det(A)| раз. Для того, чтобы в процессе случайного выбора преобразования с малым
детерминантом не появлялись слишком часто, имеет смысл производить выбор с
вероятностями, пропорциональными детерминантам. Для этого определим веса
n
p1 , p2 ,..., pm : p j | det( Aj ) | /  | det( Ai ) |,
j  1...m
i 1
Ai - матрица
аффинного преобразования Ti , i  1,...m . Очевидно,
p1  ....  pm  1 , то есть определенные нами веса суть вероятности. В
рандомизированном алгоритме преобразование Ti выбирается с вероятностью pi .
где
Приведем пример IFS c помощью которой можно получить
фрактальное изображение.
Лекция №7. Основные понятия, используемые при анализе изображений.
Вводится понятие о различных типах изображений. Описываются особенности
зрительной системы человека.
Изображения можно разделить на два больших класса: семантические, т.е.
смысловые:
24
и текстурные:
В процессе длительной эволюции зрительная система человека приспособилась
обнаруживать, опознавать и классифицировать не любые произвольные
распределения яркости, спроецированные зрачком на сетчатку глаза, а лишь те,
которые создаются объектами внешнего мира. В этом легко убедиться, если
попытаться обнаружить шумовой узор («шумовой объект») на фоне шумового поля.
Эта задача решается с трудом, путем поэлементного сравнения обоих изображений,
тогда как на другом рисунке любой объект (колеса, сиденье ...) находится легко и
быстро. Отмеченная особенность зрения широко используется в природе для целей
камуфляжа. Так, например, неправильной формы полосы на шкуре тигра делают его
плохо различимым в зарослях.
Характерной особенностью изображений реальных объектов является то, что они
состоят из областей, разделенных более или менее резкими световыми границами,
внутри которых яркость и цвет изменяются сравнительно медленно. Эти световые
границы (контуры) передают форму объекта и являются основой для его опознавания.
Из опыта известно, что информации, содержащейся в контурах, как правило, вполне
достаточно для безошибочного узнавания объекта. Так, например мы легко узнаем
лицо знакомого человека по контурному рисунку.
Лекция №8. Постановка проблемы выделения перепадов яркости и
разрывов численного решения.
Излагается общий подход к проблеме определения положения сильных
разрывов при численном решении задач динамики сплошной среды с помощью
однородных разностных схем. Сущность подхода состоит в привлечении идей и
методов теории цифровой обработки изображений, в частности методов выделения
перепадов яркости.
В настоящее время сквозной расчет разрывных решений широко используется
при численном моделировании газодинамических течений. Такой подход реализован в
многочисленных разностных схемах, в методе конечного объема, в методе конечных
элементов. При использовании схем сквозного счета сильные разрывы решения
«размазываются», то есть в результате разрыв в численном решении представляет
собой область с большими градиентами.
25
Размер этой области по направлению к нормали к поверхности разрыва составляет
несколько интервалов пространственной расчетной сетки (зависит от конкретной
схемы, порядка схемы …). Такой вид решения затрудняет интерпретацию полученных
результатов, поскольку глобальная точность численного моделирования поведения
сплошной среды значительно зависит от того, с какой точностью передается поведение
ее разрывов.
Рассмотрим следующее соответствие терминов, используемых в разностных
схемах и при цифровой обработке изображений.
Численное решение
Шаблон разностной схемы
Ячейка пространственной сетки
Сильный разрыв
Размазывание разрыва
Паразитные осцилляции решения
Локализация разрыва
Сглаживание решения
Цифровое изображение
Окно изображения
Пиксель (воксел)
Перепад яркости
Расфокусировка изображения
“Шумы” изображения
Детектирование перепадов
Сглаживание функции интенсивности
Лекция №9. Этапы обработки изображений.
Описываются основные этапы предварительной обработки изображений.
Приводится ряд применяемых на этих этапах алгоритмов.
Основные этапы обработки изображения заключаются в следующем.
ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ
Ввод изображения
Предварительная обработка изображения
СЕГМЕНТАЦИЯ ИЗОБРАЖЕНИЯ
АНАЛИЗ ИЗОБРАЖЕНИЯ
Вычисление признаков
Расчет дискриминантных функций
Классификация
В нашем случае ввод изображения – это получение численного решения. То
есть, пусть получено численное решение 2-мерной задачи – набор 2-мерных массивов
параметров (давление, плотность …). Будем интерпретировать каждый массив как
цифровую форму изображения. То есть имеется матрица S, значение sij – яркость в
заданном пикселе.
Операции предварительной обработки состоят в том, что на входе операции
имеется изображение, и после выполнения операции также получается изображение.
При применении операций анализа изображения на входе – изображение, а
результатом распознавания может быть, например, совокупность чисел, являющихся
значениями некоторого набора признаков, характеризующих изображение. Например,
признаками могут быть: площадь объекта, периметр объекта, координаты центра
тяжести объекта и т.д. Это может быть также и текстовая информация.
В предварительной обработке изображения можно выделить два основных типа
операций: преобразование координат и преобразование яркостей. Примеры
преобразования координат: выделение области с увеличением (zoom), изменение
масштаба, сдвиг, поворот, отражение.
26
Для создания эффекта искажения изображения можно
преобразование «волна», заключающееся в смещении пикселей
изображения согласно правилу:
применить
исходного

 2 x 

 x1  x  x0 sin 

x




 y  y  y sin  2 y 
0
 1
  
 y 

где x, y – декартовы координаты пикселя в исходном изображении, x1, y1 – его
декартовы координаты в преобразованном изображении, x0, y0 – задаваемые
амплитуды, x, y – длины искажающих волн по соответствующим координатам.
Рассмотрим преобразования яркости. Простейшая операция преобразования
яркости – поэлементное преобразование. В этом случае значение яркости пикселя
после обработки определяется только значением его яркости до обработки. То есть
результат обработки не зависит от значений яркости соседних элементов.
Примерами таких операций преобразования ахроматического изображения,
имеющего 256 градаций яркости, являются, например:
бинаризация: F(x)=0, если x<c, F(x)=255, если xc;
инвертирование: F(x)=256-x;
0, 0  x  c1

выделение поддиапазона: 256  x  c1  / c2  c1  , c1  x  c2 , где c1, c2 – задаваемые
255, c  x  255
2

константы.
Алгоритмы свертки изображения “затрагивают” и другие пиксели. На практике
чаще всего используются свертки с окном 33. Приведем примеры часто
используемых масок.
Низкочастотный фильтр – подавляет высокие частоты и пропускает низкие:
1 2 3 2 1
1
0
0
5
0 1 0 0 1 0 1 1 1
1 1 1
1 2 1
2 6 8 6 2
1 1 1 1
1
1
1
1
1
, 1 2 1 , 1 3 1 , 1 1 1, 1 2 1 , 2 2 2 ,
3 8 12 8 3 .
5 5 5 6
7
9
10
14
100
0 1 0 0 1 0 1 1 1
1 1 1
1 2 1
2 6 8 6 2
1
0
0
1 2 3 2 1
5
Отличительная особенность: сумма всех элементов равна 1 и центральный
элемент не меньше остальных элементов. При использовании таких фильтров
происходит размывание границ.
Высокочастотный фильтр – повышает резкость изображения, но подчеркивает
импульсные шумы:
0 1 0 1 1 1 1  2 1
 1 5  1,  1 9  1,  2  5  2 .
0 1 0 1 1 1 1  2 1
То есть, например, если решение получено по разностной схеме, дающий
осцилляции
в
окрестности
разрыва,
разумно
провести
сглаживание
решенияизображения, а затем уже, если понадобится, применять высокочастотный
фильтр.
27
Свертки с курсовыми градиентами позволяют подчеркивать границы только
определенного направления, например:
1
1
«Север» 1  2
1 1
1
1
1 , «Юго-запад» 1
1
1
1
2
1
1
1
1
Лекция №10. Выделение разрывов в численном решении.
Излагаются требования, предъявляемые к алгоритмам обнаружения перепадов
яркости. Приводятся соответствующие алгоритмы.
Поскольку нас интересует положение разрывов, то особый интерес представляет
сегментация изображения. Алгоритмы, предназначенные для обнаружения перепадов
яркости (детекторы перепада) должны удовлетворять требованиям:
1) быть достаточно экономными в смысле вычислительных затрат (машинное время,
память);
2) быть изотропными – обнаруживать перепад независимо от его ориентации;
3) обладать устойчивостью к шумам;
4) быть универсальными (не зависеть от конкретной задачи);
5) качество выходной информации должно удовлетворять требованиям,
предъявляемым процедурами дальнейших обработок.
Будем применять локальные методы, основанные на вычислении градиента
функции
интенсивности
изображения.
Рассмотрим
функцию
f  x1 , x 2  ,
соответствующую какому-либо параметру течения, например плотности на сетке из
M 1  M 2 точек. В качестве функции f можно брать и другой параметр, например
энергию или температуру.
В каждой точке (i,j) воспользуемся детектором перепадов Собела для окна
изображения 3  3 :
1
2
1
1 0 1
f i 1, j 1 f i , j 1 f i 1, j 1
H1  0
0
0 , H 2   2 0 2 ,F  f i 1, j
f i, j
f i 1, j ,
1  2 1
1 0 1
f i 1, j 1 f i , j 1 f i 1, j 1
и вычислим выражения – дискретные свертки данного окна изображения с масками H1
и H2 ( x1 и x 2 – шаги расчетной сетки по координатам x и y соответственно):
S1  H1 * F   f i1, j 1  2 f i , j 1  f i1, j 1    f i1, j 1  2 f i , j 1  f i1, j 1 ,
S 2  x2 / x1 H 2 * F 
x2 / x1  fi1, j1  2 fi1, j  fi1, j1    fi1, j1  2 fi1, j  fi1, j1 ,
28
тогда величина градиента gi , j  f  функции f в точке i , j  : gi , j 
1
8x 2
S12  S 22 , а
ориентация вектора градиента в центре ячейки i , j  : i j  arctan S1 / S2  .
Вычислим среднее значение градиента по всему расчетному полю:
T   gi j /  M1  M 2  и из множества всех точек i  1,2,..., M1 , j  1,2,..., M 2 
i, j
выберем те, в которых gi j  T (то есть точки, в которых градиент превышает среднее
значение). Обозначим это множество точек через N1.
Поскольку при решении по схеме сквозного счета разрывы “размазаны”, то во
множество N1 попадают не только пиксели истинных перепадов, но и близлежащие.
Для их исключения применим метод подавления немаксимумов, при котором
исключается конкуренция между собой соседних точек, расположенных вдоль
перепада. Принимая во внимание, что i j определяет направление, нормальное к
поверхности разрыва, определим две соседних с
i, j
ячейки
задающих ближайшее к этой нормали направление. При этом если
il , jl 
ir , jr  ,
A  A A  p /   ,
и

l
r
то il , jl  и ir , jr  меняем местами (такое упорядочивание, отвечающее закону
возрастания энтропии на ударной волне, будет использовано на этапе классификации
разрывов). Из точек множества N1 оставим такие, в которых одновременно
выполняются условия gi , j  gil jl , gi j  gir jr , и обозначим это множество точек через
N2 .
Реально на практике значение i j аппроксимируется одним из восьми направлений
из центра пикселя (i,j) на центры соседних ячеек, при этом углы i j  0 заменяются на
2    . Пример с конкретными значениями il , jl  и ir , jr 
ij
схематично выглядит
следующим образом.
i  1, j  1
i, j  1
i  1, j  1
29
i, j
i  1, j
i  1, j
il  i  1, jl  j
i j  0 , Al  Ar
ir  i  1, jr  j
i  1, j  1
i, j  1
i  1, j  1
Рассмотрим максимальную разность между значениями углов – направлений на
центры соседних ячеек   max arctan x 2 / x1  ,  / 2  arctan x 2 / x1  . Для
сохранения свойства линейной протяженности перепада исключим изолированные
выбросы интенсивности изображения. А именно из точек множества N2 оставим те, в

которых

 il jl  i j   , ir jr  i j   одновременно. Поиск изолированных
артефактов осуществляется рассмотрением круговой окрестности каждой точки
радиусом R  Q x12  x 22 . Точка удаляется из множества в том случае, если в этой
окрестности нет других точек перепада (обычно используется константа Q1.5).
Обозначим множество оставшихся точек через N3.
Заметим, что существуют и детекторы перепада яркости, использующие окно
i , j  1 i  1, j  1
изображения F2  2 
i , j  i  1, j  , например детектор Робертса с масками
1 1
1 1
, H4 
, но все они крайне чувствительны к шумам изображения.
1 1
1 1
Следует также отметить, что распознавание контуров объектов человеком даже с не
очень хорошим зрением аналогично применению масок размерностью как минимум
3232.
H3 
Лекция №11. Выделение разрывов в трехмерном численном решении.
Приводится алгоритм локализации разрыва численного решения в трехмерном
случае.
Методика легко распространяется на трехмерный случай. Рассмотрим окно
изображения f размером 3  3  3 , центрированное в вокселе (i,j,k)
fi-1, j+1, k+1 fi, j+1, k+1
fi+1, j+1, k+1
Y
Z
 
fi-1, j, k+1
fi, j, k+1
fi+1, j, k+1
 X
fi-1, j-1, k+1 fi, j-1, k+1
fi+1, j-1, k+1
F=
fi-1, j+1, k
fi-1, j, k
fi, j+1, k
fi, j, k
fi+1, j+1, k
fi+1, j, k
30
fi-1, j-1, k
fi, j-1, k
fi+1, j-1, k
fi-1, j+1, k-1 fi, j+1, k-1
fi+1, j+1, k-1
fi-1, j, k-1
fi, j, k-1
fi+1, j, k-1
fi-1, j-1, k-1
fi, j-1, k-1
fi+1, j-1, k-1
и применим к нему для вычисления составляющей градиента Gx оператор
0
 3/3
3/3
0
 2 /2
2 /2
0
 3/3
3/3
 2/2
Hx=
-1
 2/2
0
0
0
2 /2
1
2 /2
 3/3
 2/2
 3/3
0
3/3
0
2 /2
0
3/3
Операторы для вычисления компонент Gy и Gz получаются при соответствующих
изменениях ориентации Hx. Свойством этих операторов является то, что они дают
наилучший (по методу наименьших квадратов) плоский контур между двумя
областями различной интенсивности в трехмерной окрестности. Величина градиента

 

определяется как g f  x , y , z  Gx2  G y2  Gz2 .
Рассмотрим тестовый пример ступенчатого перепада, когда в качестве изображения
берется массив данных на равномерной по всем трем координатам сетке, в котором от
нуля отличны только значения в точках, лежащих на ребрах произвольного куба (для
определенности полагаем все их равными единице). Те точки, в которых выполняется
неравенство gi , j , k 
 g i jk
i 1... M x , j 1... M y , k 1... M z


/ M x  M y  M z , приведены на рисунке
(Mx, My, Mz – количество ячеек расчётной сетки по соответствующим координатам).
На таком идеальном перепаде использование окна 3  3  3 приводит к выделению
граней “толщиной” в три ячейки.
Для утончения размазанного перепада яркости возможно применение следующей
0
процедуры. Пусть N
– множество всех точек изображения. Число точек во
множестве будем обозначать буквой L, тогда число точек множества N
0
–
 0
L N   M x  M y  M z . Во множество N    включаем те точки множества
31
N   1 , в которых выполнено условие gi , j ,k 

i , j , k N   1
g i jk / L N   1  . При
применении такой итеративной процедуры (применение которой, заметим, возможно и
в случае двумерных изображений) происходит “удаление” более слабых (по
интенсивности) разрывов с одновременным утончением относительно более сильных.
Лекция №12. Классификация разрывов численного решения.
Описываются требования к алгоритмам распознавания. Приводится алгоритм
распознавания типов газодинамических разрывов.
Наряду с положением разрыва течения необходимо знать его тип: Например,
выделенный нами разрыв – это ударная волна или контактный разрыв. То есть
необходимо уметь извлекать не только геометрическую, но и физическую
информацию. Распознавание основано на сходстве образов, принадлежащих одному и
тому же классу образов, и различии между образами, принадлежащим различным
классам. Дискриминантные методы распознавания используют определенные
математические формализмы для описания исходных данных образа.
Классификация образов – отнесение их к заранее известному типу. Требования
к признакам:
1) инвариантность (все объекты, принадлежащие одному классу, обладают этим
признаком);
2) информативность (устранение такого признака из алгоритма классификации
существенно увеличивает меру неопределенности при классификации);
3) универсальность (независимость формы функциональных зависимостей, по
которым вычисляются признаки, от специфики конкретной решаемой задачи);
4) минимальность
общего
количества
признаков
(не
использовать
малоинформативные);
5) инвариантность признаков к местоположению и ориентации объектов.
Построение признаков, репрезентативных для соответствующего класса.
Рассматривается течение невязкого сжимаемого идеального нетеплопроводного
газа. Описание такого течения проводится в переменных Эйлера. Двумерные нестационарные уравнения берутся в виде следующей системы:



     x   u    y  v   0 ,
t



  u    x  u 2  p   y   uv   0 ,
t



v  
 uv  
v 2  p  0 ,


t
x
y



  e    x   e  p u   y   e  p  v  0 .
t








Здесь t – время, x, y – декартовы координаты, u, v – компоненты вектора скорости по x
и y соответственно,  – плотность, p – давление, e – удельная полная энергия. Система

замыкается уравнением состояния в виде: p    1  e 

u2  v 2 
 , где  – показатель ади2 
абаты газа.
32
На любом разрыве выполняются условия (D – скорость рассматриваемого
разрыва, u   u n , u   ):
 l  r  D   l un l
  r un r ,
(1)
 l u n   r u n D   l u n  2  p l    r u n  2  p r  ,
(2)
 l unl  D u l   r unr  D u r ,
(3)

l
r
l



 u  D e  p /   u  D    u
r




D er  pr/  r u r D 2 .
(4)
Соотношения (1)-(4) выполняются также в точках, где решение непрерывно, в
частности на волнах сжатия и волнах разрежения.
На ударных волнах существует поток вещества через разрыв:
l
nl

l

l

l
2
l
r
nr 

 l u n l  D   r u n r  D  J  0 . Отсюда и из (3) следует отсутствие разрыва
u  l  u  r . Согласно теореме
тангенциальной составляющей вектора скорости
Цемплена

u nl  u n r .
Выполняются
условия
 2 / 2  e r  p r /  r  u n
el pl/  l un l  D
Рэнкина-Гюгонио:
2 / 2 .
D
r
Если
(1),
u l  u r  0
(2)
–
и
это
нормальная, u  l  u  r  0 – косая ударная волна.
На контактных разрывах нет потока газа через поверхность разрыва J=0.
Привлекая (1) и (2) получим непрерывность давления p l  p r на контактном разрыве
и условия   l   r   el  e r   0 , u n l  u n r . В случае чисто контактного разрыва
выполняется соотношение: u  l  u  r , а в случае тангенциального разрыва –
2
2
u l  u r .
Точки разрывов (xi,yj) являются объектами, подлежащими классификации. В каждой
точке множества N3 вычислим выражения для a 1 a 7 — дискретных аналогов
признаков типов разрывов ( t – расчетный шаг по времени):
a 1i , j   1  sign u n /  n i j ,




a 2 i , j   sign  i l j l   i r j r  sign  i l j l   i r j r ,


b 3i , j    x 1 / p i j /  p /  n i j , B 3  max b 3 ,
i , j N 3
a 3i , j   b 3i , j  / B 3 ,
b 4 i , j   t  u n / n i j , B 4  max b 4
a 4i , j   b 4i , j  / B 4 ,
i , jN 3
1, A l  A r / max A l , A r    1
a 5 
,
0, A l  A r / max A l , A r    1
1,  t / x  u  u
1 l
r  2

a 6 
,
0,  t / x 1  u  l  u  r   2

33




1,  t / x  u  u
1
l
r  3

a 7 
,
0,  t / x 1  u   u    3
l
r

 1,  2 ,  3 – задаваемые положительные константы.
Выбор первого признака обусловлен тем, что в зоне размазанной ударной волны и в
зоне волны сжатия должно выполняться условие  un /  n  0 . Величина  un /  n
 un /  nij   un /  xij cosij   un /  yij sin ij ,
 u n /  x ij  1 / 2x 1 H3F22  u n , i , j ,
 u n/  yij  1 / 2x 2 H4 F22 u n, i, j .
вычисляется
по
Используется
формуле
окно
F2  2 
изображения
1 1
1
1
, H4 
.
1 1
1 1
Второй
признак
использует
i , j  1 i  1, j  1
i , j  i  1, j 
и
маски
H3 


sign  l   r  sign l   r   2 ,




то,
что
а
на
на

ударной
контактном
волне
разрыве

sign  l   r  sign  l   r  0 . Здесь   p /   1 , а в формулах участвуют не
11 1
сами параметры, а усредненные значения  i j  H5 F22  , i , j , H5 
. Ситуация
41 1
 i
 

  i r j r  0,  i l j l   i r j r  0 исключена уже на этапе сегментации.
Третий и четвертый признаки отражают факт непрерывности давления на
контактном разрыве и разрыве нормальной составляющей скорости на ударной волне.
Пятый признак служит отличению точек разрыва от точек, принадлежащим
подобластям непрерывного течения (например, волнам сжатия), шестой – чисто
контактных разрывов от тангенциальных разрывов, а седьмой – прямых ударных волн
от косых ударных волн. Для большинства задач подходят значения констант
 1  2   3  0.01 .
l jl
Классификация по минимуму расстояния.
Введем следующие классы: С1 – нормальные ударные волны, С2 – косые ударные
волны, С3 – тангенциальные разрывы, С4 – чисто контактные разрывы, С5 – волны
сжатия. Зададим z   z 1, z 2 , z 3 , z 4 , z 5 , z 6 , z 7 , k – эталонные векторы классов (для
одного класса может быть несколько эталонных векторов):
C1 C2 C3 C3 C4 C4 C4 C4 C5 C5 C5 C5
z
z1
2
2
0
2
0
2
0
2
2
2
2
2
z2
2
2
0
0
0
0
0
0
2
2
2
2
z3
1
1
0
0
0
0
0
0
1
1
1
1
z4
1
1
0
0
0
0
0
0
1
1
1
1
z5
1
1
1
1
1
1
1
1
0
0
0
0
z6
0
0
1
1
0
0
0
0
0
1
0
1
z7
0
1
1
1
1
1
0
0
0
0
1
1
34
Точка (i,j) принадлежит классу C k 0 , если dist  a i j ,z k   min a i j ,z k  , где
0
k
a   a 1, a 2 , a 3, a 4 , a 5, a 6 , a 7 , i j , dist 
 a m  z m 
2
(евклидово расстояние в
m1,7
семимерном пространстве признаков).
В качестве примера на рисунке приведена классификация разрывов численного
решения задачи о дифракции ударной волны на плоском прямом угле. Приведены
точки разрывов, полученные в процессе распознавания: 1 - дифрагированная ударная
волна (косая), 2 - первоначальная ударная волна (прямая), 3, 6 - тангенциальные
разрывы, 4 - вторичная ударная волна (косая), 5 - чисто контактный разрыв, 7 маховская волна (прямая).
Отметим, что системы автоматического извлечения информации могут также
использоваться для непосредственного управления процессом расчета (например, для
сгущения разностной сетки в окрестностях разрывов).
35
Вариант теоретической части экзамена.
Для каждого вопроса предлагается 4 ответа, 3 из которых неправильные, а 1
правильный. Студент отмечает крестом правильный ответ. Верный ответ оценивается
в 3 балла, неверный оценивается (-1) балл, отсутствие ответа дает 0 баллов.
Вопрос
1. A=(xz+1,yz,xy)
B=rotA
2. Какое поле является
соленоидальным
3. Если квадратичная форма в точке
(u,v) является полуопределенной, то
эта точка является
4. Что является пределом отношения
угла поворота касательной на дуге,
стягивающейся к данной точке, к
длине этой дуги.
5. Какое поле является безвихревым
6. Векторные линии в каждой точке
имеют направление векторного поля
F ( r) и определяются уравнением
7. В каких случаях кручение во всех
точках линии равно нулю.
Ответ




























B=(0,x-y,y)
B=(x-y,x-z,z)
B=(x-y,x-y,0)
B=(x,y,0)
B=(3/2x-5y, -3/2y-3z, x2-y2)
B=(3/2x-5y,3/4y2+3,x2)
B=(x2+3y,y2+3x,3z)
B=(x3+3xy,3y-3x2y,-3yz)
Эллиптической точкой
Параболической точкой
Гиперболической точкой
Нейтральной точкой
Кривизна
Кручение
Градиент
Геодезическая линия
B=(-2/3xz, 4/3yz, z2-x2/3-2/3y2)
B=(-2/3xz, -4/3yz, z2-x2/3-2/3y2)
B=(y, x+z, 2y)
B=(2y,x+z, 2y)
F (r )=const
drF(r )=0
dr  F( r)=0
F (r )=r
Для плоских линий
Для прямых линий
Для линий у которых градиент в
каждой точке равен нулю
Для линий у которых rot в каждой
точке равен нулю
36
8. Определить размерность подобия
фрактала Коха
n=0




3/2
ln3
lg 5/lg 3
5/3




lg 24/lg 5
ln 5
5/3
2




a
1
1
2
1
n=1
9. Определить размерность подобия
модифицированного ковра
Серпинского
n=0
n=1
n=2
10. Таблица аффинного
преобразования, переводящего
треугольник АВС с вершинами А(1,0),
В(-1,-1), С(1,0) в треугольник PQR с
вершинами P(0,3), Q(0,-8), R(3,2)
имеет следующий вид
11. Метрика Хаусдорфа h(A,B)=
A={(x,x), -1x0}
B={(x,0), -1x1}
12. Метрика Хаусдорфа h(A,B)=
A={(x,y), x2/4+4y2=1}
B={(x,y), 4(x-2)2+y2/4=1}
13. Множество Жюлиа отображения
f(z)=z2 +4iz-4 представляет собой












b
0
-1
-1
1
c
4
4
3
4
d
3
3
4
-3
e
2
2
1
2
f
1
-8
-1
8
0
5
1
1/2
2
3,5
0
1/2
отрезок -1Re z 1
Im z=2
Окружность |z|=1
Окружность |z+2i|=1
Квадрат 0Re z 2
-2Im z 0
37
1 2 1
1
2 2 2 является:
14. Маска
14
1 2 1




высокочастотным фильтром
оператором Лапласа
низкочастотным фильтром
оператором Робертса
15. Пусть имеется изображение F (256
градаций яркости). Операцией его
инвертирования является
преобразование








F(x)=256+x
F(x)=256-x
F(x)=x*256
F(x)=x-256
высокочастотным фильтром
оператором Лапласа
низкочастотным фильтром
оператором Робертса












высокочастотным фильтром
оператором Лапласа
низкочастотным фильтром
оператором Робертса
пиксел
перепад яркости
окно изображения
«шум» изображения
инвертирования
выделения поддиапазона
бинаризации
расфокусировки








высокое быстродействие
независимость от ориентации
устойчивость к шумам
экономию памяти ЭВМ
высокочастотным фильтром
оператором Лапласа
низкочастотным фильтром
оператором Робертса
16. Маска
1
2
1
3
100
2
1
2 3 2 1
6 8 6 2
8 12 8 3
6 8 6 2
2 3 2 1
является:
0 1 0
17. Маска  1 5  1 является:
0 1 0
18. Понятие «шаблон разностной
схемы» в терминах цифровой
обработки изображений аналогично
понятию
19. Операция преобразования
0, x  c
изображения F  x   
является
1, x  c
операцией
20. Изотропность алгоритма
обнаружения перепада яркости
означает его
0 1 0
21. Маска  1 4  1 является:
0 1 0
38
Примеры экзаменационных заданий.
1. Задание по теме «Фракталы»
А) Построение конструктивных фракталов. Кривая Коха. Фрактал
Минковского. Фрактал Леви.
Б) Построение множества Жюлиа для полиномиальных и трансцендентных
отображений.
f ( z)  z 2  C,
f ( z)  z3  C,
f ( z )  z 3  Cz,
f ( z )  e z  b,
f ( z )  c1 sin z  c2 .
В) Построение множества Мандельброта для полиномиальных отображений.
f ( z)  z 2  C,
f ( z)  z3  C,
f ( z )  z 3  Cz.
Г) Построение различных фракталов с помощью СИФ.
Анимация изображений с помощью теоремы о «дуновении ветра».
2. Задание по теме «Методы автоматического анализа изображений».
Демонстрируемая программа должна читать входной файл в формате BMP
(“grayscale 8-bit”=256 градаций серого) произвольного размера и проводить
сегментацию данного изображения. Необходима также возможность применения к
исходному изображению сглаживающей маски и сегментация сглаженного
изображения.
Рекомендуется для детектирования перепадов при окне изображения f размером
3 3 –
f i 1, j 1 f i, j 1 f i 1, j 1
F  f i 1, j
f i, j
f i 1, j
f i 1, j 1 f i, j 1 f i 1, j 1
1
2
1
1 0 1
0
0 и H2   2 0 2 .
воспользоваться масками H 1  0
1  2 1
1 0 1
В этом случае дискретные свертки данного окна изображения (считаем пиксели
квадратами, сторона которых равна единице):


  f i 1, j 1  2 f i, j 1  f i 1, j 1 ,
  f i 1, j 1  2 f i 1, j  f i 1, j 1  .
S1  H1 * F  f i 1, j 1  2 f i, j 1  f i 1, j 1 
S 2  H 2 * F  f i 1, j 1  2 f i 1, j  f i 1, j 1 
Величина градиента gi , j  f  функции f в точке i , j  : g i, j 
1
S12  S 22 .
8
39
Среднее значение градиента по всему расчетному полю: T   gi j /  M1  M 2  . Из
i, j
множества всех точек i  1,2,..., M1 , j  1,2,..., M 2  выбираются те, в которых gi j  T .
Сглаживание изображения рекомендуется осуществлять применением маски
1 1 1
1
H  1 2 1.
10
1 1 1
Если программа также читает и файлы цветного изображения, то его необходимо
преобразовать в изображение «256 градаций серого» по формуле
F = 0.3 Red + 0.59 Green + 0.11 Blue
3. Задание по теме «Изображение скалярных и векторных полей»
Изобразить с помощью алгоритма «марширующих кубов» скалярные поля.
Приложение. Краткие сведения OPENGL.
OpenGL - Open Graphics Library, открытая графическая библиотека. Термин
"открытый" - означает независимый от производителей. OpenGL является на данный
момент одним из самых популярных программных интерфейсов (API) для разработки
приложений в области двумерной и трехмерной графики. Стандарт OpenGL был
разработан и утвержден в 1992 году ведущими фирмами в области разработки
программного обеспечения, а его основой стала библиотека IRIS GL, разработанная
Silicon Graphics. На данный момент реализация OpenGL включает в себя несколько
библиотек (описание базовых функций OpenGL, GLU,GLUT,GLAUX и другие),
назначение которых будет описано ниже.
Основные возможности OpenGL

Набор базовых примитивов: точки, линии, многоугольники и т.п.

Видовые и координатные преобразования

Удаление невидимых линий и поверхностей (z-буфер)

Использование сплайнов для построения линий и поверхностей

Наложение текстуры и применение освещения

Добавление специальных эффектов: тумана, изменение
прозрачности,сопряжение цветов (blending), устранение ступенчатости (antialiasing).
Как уже было сказано, существует реализация OpenGL для разных платформ, для чего
было удобно разделить базовые функции графической системы и функции для
отображения графической информации и взаимодействия с пользователем. Были
созданы библиотеки для отображения информации с помощью оконной подсистемы
для операционных систем Windows и Unix (WGL и GLX соответственно), а также
библиотеки GLAUX и GLUT, которые используются для создания так называемых
консольных приложений.
40
Архитектура и особенности синтаксиса
С точки зрения архитектуры, графическая система OpenGL является конвейером,
состоящим из нескольких этапов обработки данных:

Аппроксимация кривых и поверхностей

Обработка вершин и сборка примитивов

Растеризация и обработка фрагментов

Операции над пикселами

Подготовка текстуры

Передача данных в буфер кадра
Вообще, OpenGL можно сравнить с конечным автоматом, состояние которого
определяется множеством значений специальных переменных (их имена обычно
начинаются с символов GL_) и значениями текущей нормали, цвета и координат
текстуры. Все эта информация будет использована при поступлении в систему
координат вершины для построения фигуры, в которую она входит. Смена состояний
происходит с помощью команд, которые оформляются как вызовы функций.
Для обеспечения интуитивно понятных названий в OpenGL полное имя команды имеет
вид:
type glCommand_name[1 2 3 4][b s i f d ub us ui][v](type1 arg1,…,typeN argN)
Таким образом, имя состоит из нескольких частей:
gl это имя библиотеки, в которой описана эта функция: для базовых функций OpenGL,
функций из библиотек GLU, GLUT, GLAUX это gl, glu, glut, aux соответственно.
Command_name имя команды [1 2 3 4]число аргументов команды [b s i f d ub us ui ]тип
аргумента:
символ b означает тип GLbyte (аналог char в С\С++), символ f тип GLfloat (аналог
float), символ i– тип GLint(аналог int) и так далее.
Полный список типов и их описание можно посмотреть в файле gl.h
Структура консольного приложения
Будем рассматривать построение консольного приложения при помощи библиотеки
GLUT или GL Utility Toolkit, получившей в последнее время широкое
распространение. Эта библиотека обеспечивает единый интерфейс для работы с
окнами вне зависимости от платформы, поэтому описываемая ниже структура
приложения остается неизменной для операционных систем Windows, Linux и многих
других.
Функции GLUT могут быть классифицированы на несколько групп по своему
назначению:

Инициализация

Начало обработки событий

Управление окнами

Управление меню

Регистрация вызываемых (callback) функций

Управление индексированной палитрой цветов
41

Отображение шрифтов

Отображение дополнительных геометрических фигур (тор, конус и др.)
Инициализация проводится с помощью функции glutInit(int *argcp, char **argv)
Переменная argcp есть указатель на стандартную переменную argc описываемую в
функции main(), а argv– указатель на параметры, передаваемые программе при
запуске, который описывается там же. Эта функция проводит необходимые начальные
действия для построения окна приложения, и только несколько функций GLUT могут
быть вызваны до нее. К ним относятся:
glutInitWindowPosition (int x, int y) glutInitWindowSize (int width, int height)
glutInitDisplayMode (unsigned int mode)
Первые две функции задают соответственно положение и размер окна, а последняя
функция определяет различные режимы отображения информации, которые могут
совместно задаваться с использованием операции побитового “или” (|):
GLUT_RGBA Режим RGBA. Используется по умолчанию, если не указаны явно
режимы GLUT_RGBA или GLUT_INDEX. GLUT_RGB то же, что и GLUT_RGBA.
GLUT_INDEX режим индексированных цветов (использование палитры). Отменяет
GLUT_RGBA. GLUT_SINGLE окно с одиночным буфером. Используется по
умолчанию. GLUT_DOUBLE окно с двойным буфером. Отменяет GLUT_SINGLE.
GLUT_DEPTH Окно с буфером глубины.
Это неполный список параметров для данной функции, однако для большинства
случаев этого бывает достаточно.
Двойной буфер обычно используют для анимации, сначала рисуя что-нибудь в одном
буфере, а затем меняя их местами, что позволяет избежать мерцания. Буфер глубины
или z-буфер используется для удаления невидимых линий и поверхностей.
Функции библиотеки GLUT реализуют так называемый событийно-управляемый
механизм. Это означает, что есть некоторый внутренний цикл, который запускается
после соответствующей инициализации и обрабатывает, одно за другим, все события,
объявленные во время инициализации. К событиям относятся: щелчок мыши, закрытие
окна, изменение свойств окна, передвижение курсора, нажатие клавиши, и "пустое"
(idle) событие, когда ничего не происходит. Для проведения периодической проверки
совершения того или иного события надо зарегистрировать функцию, которая будет
его обрабатывать. Для этого используются функции вида:

void glutDisplayFunc (void (*func) (void))

void glutReshapeFunc (void (*func) (int width, int height))

void glutMouseFunc (void (*func) (int button, int state, int x, int y))

void glutIdleFunc (void (*func) (void))
То есть параметром для них является имя соответствующей функции заданного типа.
С помощью glutDisplayFunc() задается функция рисования для окна приложения,
которая вызывается при необходимости создания или восстановления изображения.
Для явного указания, что окно надо обновить, иногда удобно использовать функцию
void glutPostRedisplay(void)
Через glutReshapeFunc() устанавливается функция обработки изменения размеров окна
пользователем, которой передаются новые размеры.
glutMouseFunc() определяет обработчика команд от мыши, а glutIdleFunc() задает
функцию, которая будет вызываться каждый раз, когда нет событий от пользователя.
42
Контроль всех событий происходит внутри бесконечного цикла в функции void
glutMainLoop(void) которая обычно вызывается в конце любой программы,
использующей GLUT.
Вершины и примитивы
Определение атрибутов вершины
Под вершиной понимается точка в трехмерном пространстве, координаты которой
можно задавать следующим образом:

void glVertex[2 3 4][s i f d](type coords)

void glVertex[2 3 4][s i f d]v(type *coords)
Координаты точки задаются максимум четырьмя значениями: x, y, z, w, при этом
можно указывать два (x,y) или три (x,y,z) значения, а для остальных переменных в
этих случаях используются значения по умолчанию: z=0, w=1. Как уже было сказано
выше, число в названии команды соответствует числу явно задаваемых значений, а
последующий символ – их типу.
Координатные оси расположены так, что точка (0,0) находится в левом нижнем углу
экрана, ось x направлена влево, ось y- вверх, а ось z- из экрана. Это расположение осей
мировой системы координат, в которой задаются координаты вершин объекта, другие
системы координат будут рассмотрены ниже.
Однако чтобы задать какую-нибудь фигуру одних координат вершин недостаточно, и
эти вершины надо объединить в одно целое, определив необходимые свойства. Для
этого в OpenGL используется понятие примитивов, к которым относятся точки, линии,
связанные или замкнутые линии, треугольники и так далее. Задание примитива
происходит внутри командных скобок:

void glBegin(GLenum mode)

void glEnd(void)
Параметр mode определяет тип примитива, который задается внутри и может
принимать следующие значения:

GL_POINTS каждая вершина задает координаты некоторой точки.

GL_LINES каждая отдельная пара вершин определяет отрезок; если задано
нечетное число вершин, то последняя вершина игнорируется.

GL_LINE_STRIP каждая следующая вершина задает отрезок вместе с
предыдущей.

GL_LINE_LOOP отличие от предыдущего примитива только в том, что
последний отрезок определяется последней и первой вершиной, образуя
замкнутую ломаную.

GL_TRIANGLES каждая отдельная тройка вершин определяет треугольник;
если задано не кратное трем число вершин, то последние вершины
игнорируются.

GL_TRIANGLE_STRIP каждая следующая вершина задает треугольник вместе
с двумя предыдущими.

GL_TRIANGLE_FAN треугольники задаются первой и каждой следующей
парой вершин (пары не пересекаются).
43

GL_QUADS каждая отдельная четверка вершин определяет четырехугольник;
если задано не кратное четырем число вершин, то последние вершины
игнорируются.

GL_QUAD_STRIP четырехугольник с номером n определяется вершинами с
номерами 2n-1, 2n, 2n+2, 2n+1.

GL_POLYGON последовательно задаются вершины выпуклого
многоугольника.
Можно определить нормаль в вершине, используя команды

void glNormal3[b s i f d](type coords)

void glNormal3[b s i f d]v(type coords)
Внутри командных скобок glBegin() и glEnd() можно производить вызов лишь
нескольких команд, в которые входят glVertex..(), glColor..()glNormal..(), glRect..(),
glMaterial..() и glTexCoord..().
Последние две команды будут рассматриваться ниже, а с помощью команды void
glRect[s i f d]( GLtype x1, GLtype y1, GLtype x2, GLtype y2 ), void glRect[s i f d]v(
GLtype *v1, GLtype *v2 ) можно нарисовать прямоугольник в плоскости z=0 с
координатами противоположных углов (x1,y1) и (x2,y2), либо набор прямоугольников
с координатами углов в массивах v1 и v2.
Кроме задания самих примитивов можно определить метод их отображения на экране,
где под примитивами в данном случае понимаются многоугольники.
Однако сначала надо определить понятие лицевых и обратных граней.
Под гранью понимается одна из сторон многоугольника, и по умолчанию лицевой
считается та сторона, вершины которой обходятся против часовой стрелки.
Направление обхода вершин лицевых сторон можно изменить вызовом команды void
glFrontFace(GLenum mode) со значением параметра mode равным GL_CW, а отменитьс GL_CCW.
Чтобы изменить метод отображения многоугольника используется команда void
glPolygonMode(GLenum face, Glenum mode)
44
Параметр mode определяет, как будут отображаться многоугольники, а параметр face
устанавливает тип многоугольников, к которым будет применяться эта команда и
может принимать следующие значения:

GL_FRONT для лицевых граней

GL_BACK для обратных граней

GL_FRONT_AND_BACK для всех граней
Параметр mode может быть равен:

GL_POINT при таком
многоугольников.
режиме
будут
отображаться
только
вершины

GL_LINE при таком режиме многоугольник будет представляться набором
отрезков.

GL_FILL при таком режиме многоугольники будут закрашиваться текущим
цветом с учетом освещения и этот режим установлен по умолчанию.
Кроме того, можно указывать, какой тип граней отображать на экране. Для этого
сначала
надо
установить
соответствующий
режим
вызовом
команды
glEnable(GL_CULL_FACE), а затем выбрать тип отображаемых граней с помощью
команды void glСullFace(GLenum mode)
Вызов с параметром GL_FRONT приводит к удалению из изображения всех лицевых
граней, а с параметром GL_BACK- обратных (установка по умолчанию).
Важно отметить, что для корректного построения перечисленных примитивов
необходимо удалять невидимые линии и поверхности, для чего надо включить
соответствующий режим вызовом команды glEnable(GL_DEPTH_TEST).
Массивы вершин
Если вершин много, то чтобы не вызывать для каждой команду glVertex..(), удобно
объединять вершины в массивы, используя команду
void glVertexPointer( GLint size, GLenum type, GLsizei stride, void *ptr )
которая определяет способ хранения и координаты вершин. При этом size определяет
число координат вершины (может быть равен 2, 3, 4), type определяет тип данных
(может быть равен GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE). Иногда удобно
хранить в одном массиве другие атрибуты вершины, и тогда параметр stride задает
смещение от координат одной вершины до координат следующей; если stride равен
нулю, это значит, что координаты расположены последовательно. В параметре ptr
указывается адрес, где находятся данные.
Аналогично можно определить массив нормалей, цветов и некоторых других
атрибутов вершины, используя команды

void NormalPointer(GLenum type, GLsizei stride, void*pointer)

void ColorPointer(GLintsize, GLenum type, GLsizei stride, void *pointer)
Для того, чтобы эти массивы можно было использовать в дальнейшем, надо вызвать
команду
void glEnableClientState(GLenum array)
с параметрами GL_VERTEX_ARRAY, GL_NORMAL_ARRAY, GL_COLOR_ARRAY
соответственно. После окончания работы с массивом желательно вызвать команду
void glDisableClientState(GLenum array)
45
с соответствующим значением параметра array.
Для отображения содержимого массивов используется команда
void glArrayElement(GLint index)
которая передает OpenGL атрибуты вершины, используя элементы массива с номером
index. Это аналогично последовательному применению команд вида glColor..(…),
glNormal..(…), glVertex..(…) c соответствующими параметрами. Однако вместо нее
обычно вызывается команда
void glDrawArrays(GLenum mode, GLint first, GLsizei count)
рисующая count примитивов, определяемых параметром mode, используя элементы из
массивов с индексами от first до first+count-1. Это эквивалентно вызову команды
glArrayElement() с соответствующими индексами.
В случае если одна вершина входит в несколько примитивов, то вместо дублирования
ее координат в массиве удобно использовать ее индекс.
Для этого надо вызвать команду
void glDrawArrays(GLenum mode, GLsizei count, GLenum type, void *indices)
где indices– это массив номеров вершин, которые надо использовать для построения
примитивов, type определяет тип элементов этого массива: GL_UNSIGNED_BYTE,
GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, а count задает их количество.
Списки изображений.
Если нужно несколько раз обращаться к одной и той же группе команд, эти команды
можно объединить в так называемый список изображений (display list) и вызывать его
при необходимости. Для того, чтобы создать новый список изображений надо
поместить все команды, которые должны в него войти между командными скобками:

void glNewList(GLuint list, GLenum mode)

void glEndList()
Для различения списков используются целые положительные числа, задаваемые при
создании списка значением параметра list, а параметр mode определяет режим
обработки команд, входящих в список:

GL_COMPILE команды записываются в список без выполнения

GL_COMPILE_AND_EXECUTE команды сначала выполняются, а затем
записываются в список
После того, как список создан, его можно вызвать командой
void glCallList(GLuint list)
указав в параметре list идентификатор нужного списка. Чтобы вызвать сразу несколько
списков, можно воспользоваться командой
void glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
вызывающей n списков с идентификаторами из массива lists, тип элементов которого
указывается
в
параметре
type.
Это
могут
быть
типы
GL_BYTE,
GL_UNSIGNED_BYTE, GL_SHORT, GL_INT, GL_UNSIGNED_INT >и некоторые
другие. Для удаления списков используется команда
void glDeleteLists(GLint list, GLsizei range)
которая удаляет списки с идентификаторами ID из диапазона list <=ID<= list+range-1.
46
Преобразования координат и проекции
В OpenGL используются как основные три системы координат: левосторонняя,
правосторонняя и оконная. Первые две системы являются трехмерными и отличаются
друг от друга направлением оси z: в правосторонней она направлена на наблюдателя, а
в левосторонней – в глубь экрана. Расположение осей x и y аналогично описанному
выше. Левосторонняя система используется для задания значений параметрам
команды gluPerspective(), glOrtho(), которые будут рассмотрены ниже, а
правосторонняя или мировая система координат во всех остальных случаях.
Отображение трехмерной информации происходит в двумерную оконную систему
координат.
Для задания различных преобразований объектов сцены в OpenGL используются
операции над матрицами, при этом различают три типа матриц: видовая, проекций и
текстуры. Все они имеют размер 4x4. Видовая матрица определяет преобразования
объекта в мировых координатах, такие как параллельный перенос, изменение
масштаба и поворот. Матрица проекций задает как будут проецироваться трехмерные
объекты на плоскость экрана (в оконные координаты), а матрица текстуры определяет
наложение текстуры на объект.
Для того, чтобы выбрать, какую матрицу надо изменить, используется команда
void glMatrixMode(GLenum mode)
вызов которой со значением параметра mode равным GL_MODELVIEW,
GL_PROJECTION, GL_TEXTURE включает режим работы с видовой, проекций и
матрицей текстуры соответственно. Для вызова команд, задающих матрицы того или
иного типа необходимо сначала установить соответствующий режим.
Для определения элементов матрицы текущего типа вызывается команда
void glLoadMatrix[f d](GLtype *m)
где m указывает на массив из 16 элементов типа float или double в соответствии с
названием команды, при этом сначала в нем должен быть записан первый столбец
матрицы, затем второй, третий и четвертый.
Команда
void glLoadIdentity(void)
заменяет текущую матрицу на единичную. Часто нужно сохранить содержимое
текущей матрицы для дальнейшего использования, для чего используют команды

void glPushMatrix(void)

void glPopMatrix(void)
Они записывают и восстанавливают текущую матрицу из стека, причем для каждого
типа матриц стек свой. Для видовых матриц его глубина равна как минимум 32, а для
двух оставшихся типов как минимум 2.
Для умножения текущей матрицы слева на другую матрицу используется команда
void glMultMatrix[f d](GLtype *m)
где m должен задавать матрицу размером 4x4 в виде массива с описанным
расположением данных. Однако обычно для изменения матрицы того или иного типа
удобно использовать специальные команды, которые по значениям своих параметров
создают нужную матрицу и перемножают ее с текущей. Чтобы сделать текущей
созданную матрицу, надо перед вызовом этой команды вызвать glLoadIdentity().
47
В целом, для отображения трехмерных объектов сцены в окно приложения
используется следующая последовательность действий:
Координаты
Видовые
Усеченные
Нормализованные
Оконные
=>
=>
=>
=>
объекта
координаты
координаты
координаты
координаты
Рассмотрим каждое из этих преобразований отдельно.
Видовое преобразование
К видовым преобразованиям будем относить перенос, поворот и изменение масштаба
вдоль координатных осей. Для проведения этих операций достаточно умножить на
соответствующую матрицу каждую вершину объекта и получить измененные
координаты этой вершины:
(x’, y’, z’, 1)T =M * (x, y, z, 1)T
где M матрица видового преобразования. Перспективное преобразование и
проектирование производится аналогично. Сама матрица может быть создана с
помощью следующих команд:

void glTranslate[f d](GLtype x, GLtype y, GLtype z)

void glRotate[f d](GLtype angle, GLtype x, GLtype y, GLtype z)

void glScale[f d](GLtype x, GLtype y, GLtype z)
glTranlsate..() производит перенос объекта, прибавляя к координатам его вершин
значения своих параметров.
glRotate..() производит поворот объекта против часовой стрелки на угол angle
(измеряется в градусах) вокруг вектора ( x,y,z ).
glScale..() производит масштабирование объекта (сжатие или растяжение), домножая
соответствующие координаты его вершин на значения своих параметров.
Все эти преобразования будут применяться к примитивам, описания которых будут
находиться ниже в программе. В случае если надо, например, повернуть один объект
сцены, а другой оставить неподвижным, удобно сначала сохранить текущую видовую
матрицу в стеке командой glPushMatrix(), затем вызвать glRotate..() с нужными
параметрами, описать примитивы, из которых состоит этот объект, а затем
восстановить текущую матрицу командой glPopMatrix().
Кроме изменения положения самого объекта иногда бывает нужно изменить
положение точки наблюдения, что однако также приводит к изменению видовой
матрицы. Это можно сделать с помощью команды
void gluLookAt (GLdouble eyex,
GLdouble eyey,
GLdouble eyez,
GLdouble centerx,
GLdouble centery,
GLdouble centerz,
GLdouble upx,
GLdouble upy,
GLdouble upz)
48
где точка (eyex,eyey,eyez) определяет точку наблюдения, (centerx, centery, centerz)
задает центр сцены, который будет проектироваться в центр области вывода, а вектор
(upx,upy,upz ) задает положительное направление оси у, определяя поворот камеры.
Если, например, камеру не надо поворачивать, то задается значение (0,1,0), а со
значением (0,-1,0) сцена будет перевернута.
Фактически, эта команда совершает перенос и поворот объектов сцены, но в таком
виде задавать параметры бывает удобнее.
Проекции
В OpenGL существуют ортографическая (параллельная) и перспективная проекция.
Первый тип проекции может быть задан командами

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top,
GLdouble near, GLdouble far)

void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)
Первая команда создает матрицу проекции в усеченный объем видимости
(параллелограмм видимости) в левосторонней системе координат. Параметры команды
задают точки (left, bottom, -near) и (right, top, -near), которые отвечают левому нижнему
и правому верхнему углам окна вывода. Параметры near и far задают расстояние до
ближней и дальней плоскостей отсечения по дальности от точки (0,0,0) и могут быть
отрицательными.
Во второй команде, в отличие от первой, значения near и far устанавливаются равными
–1 и 1 соответственно.
Перспективная проекция определяется командой
void gluPerspective(GLdouble angley, GLdouble aspect, GLdouble znear, GLdouble zfar)
которая задает усеченный конус видимости в левосторонней системе координат.
Параметр angley определяет угол видимости в градусах по оси у и должен находиться
в диапазоне от 0 до 180. Угол видимости вдоль оси x задается параметром aspect,
который обычно задается как отношение сторон области вывода. Параметры zfar и
znear задают расстояние от наблюдателя до плоскостей отсечения по глубине и
должны быть положительными. Чем больше отношение zfar/znear, тем хуже в буфере
глубины будут различаться расположенные рядом поверхности, так как по умолчанию
в него будет записываться ‘сжатая’ глубина в диапазоне от 0 до 1 (см. следующий
пункт).
Область вывода
После применения матрицы проекций на вход следующего преобразования подаются
так называемые усеченные (clip) координаты, для которых значения всех компонент
(xc, yc, zc, wc)T находятся в отрезке [-1,1]. После этого находятся нормализованные
координаты вершин по формуле:
(xn, yn, zn)T=(xc/wc, yc/wc, zc/wc)T
Область вывода представляет из себя прямоугольник в оконной системе координат,
размеры которого задаются командой:
void glViewPort(GLint x, GLint y, GLint width, GLint height)
Значения всех параметров задаются в пикселах и определяют ширину и высоту
области вывода с координатами левого нижнего угла ( x,y ) в оконной системе
координат. Размеры оконной системы координат определяются текущими размерами
окна приложения, точка (0,0)находится в левом нижнем углу окна.
49
Используя параметры команды glViewPort(), вычисляются оконные координаты
центра области вывода (ox, oy) по формулам ox=x+width/2, oy=y+height/2.
Пусть px=width, py=height, тогда можно найти оконные координаты каждой вершины:
(xw, yw, zw)T = ( (px/2) xn+ ox , (py/2) yn+ oy , [(f-n)/2] zn+(n+f)/2 )T
При этом целые положительные величины n и f задают минимальную и максимальную
глубину точки в окне и по умолчанию равны 0 и 1 соответственно. Глубина каждой
точки записывается в специальный буфер глубины (z-буфер), который используется
для удаления невидимых линий и поверхностей. Установить значения n и f можно
вызовом функции
void glDepthRange(GLclampd n, GLclampd f)
Команда glViewPort() обычно используется в функции, зарегистрированной с
помощью команды glutReshapeFunc(), которая вызывается, если пользователь изменяет
размеры окна приложения, изменяя соответсвующим образом область вывода.
Материалы и освещение
Для создания реалистических изображений необходимо определить как свойства
самого объекта, так и свойства среды, в которой он находится. Первая группа свойств
включает в себя параметры материла, из которого сделан объект, способы нанесения
текстуры на его поверхность, степень прозрачности объекта. Ко второй группе можно
отнести количество и свойства источников света, уровень прозрачности среды. Все эти
свойства можно задавать, используя соответствующие команды OpenGL.
Свойства материала
Для задания параметров текущего материала используются команды

void glMaterial[i f](GLenum face, GLenum pname, GLtype param)

void glMaterial[i f]v(GLenum face, GLenum pname, GLtype *params)
С их помощью можно определить рассеянный, диффузный и зеркальный цвета
материала, а также цвет степень зеркального отражения и интенсивность излучения
света, если объект должен светиться. Какой именно параметр будет определяться
значением param, зависит от значения pname:
GL_AMBIENT параметр params должен содержать четыре целых или вещественных
значения цветов RGBA, которые определяют рассеянный цвет материала (цвет
материала в тени).
Значение по умолчанию: (0.2, 0.2, 0.2, 1.0).
GL_DIFFUSE параметр params должен содержать четыре целых или вещественных
значения цветов RGBA, которые определяют цвет диффузного отражения материала.
Значение по умолчанию:(0.8, 0.8, 0.8, 1.0).
GL_SPECULAR параметр params должен содержать четыре целых или вещественных
значения цветов RGBA, которые определяют цвет зеркального отражения материала.
Значение по умолчанию: (0.0, 0.0, 0.0, 1.0).
GL_SHININESS параметр params должен содержать одно целое или вещественное
значение в диапазоне от 0 до 128, которое определяет степень зеркального отражения
материала.
Значение по умолчанию: 0.
50
GL_EMISSION параметр params должен содержать четыре целых или вещественных
значения цветов RGBA, которые определяют интенсивность излучаемого света
материала.
Значение по умолчанию: (0.0, 0.0, 0.0, 1.0).
GL_AMBIENT_AND_DIFFUSE эквивалентно двум вызовам команды glMaterial..() со
значением pname GL_AMBIENT и GL_DIFFUSE и одинаковыми значениями params.
Из этого следует, что вызов команды glMaterial[i f]() возможен только для установки
степени зеркального отражения материала. В большинстве моделей учитывается
диффузный и зеркальный отраженный свет; первый определяет естественный цвет
объекта, а второй – размер и форму бликов на его поверхности.
Параметр face определяет тип граней, для которых задается этот материал и может
принимать значения GL_FRONT, GL_BACK или GL_FRONT_AND_BACK.
Если в сцене материалы объектов различаются лишь одним параметром,
рекомендуется сначала установить нужный режим, вызвав glEnable() c параметром
GL_COLOR_MATERIAL, а затем использовать команду
void glColorMaterial(GLenum face, GLenum pname)
где параметр face имеет аналогичный смысл, а параметр pname может принимать все
перечисленные значения. После этого, значения выбранного с помощью pname
свойства материала для конкретного объекта (или вершины) устанавливается вызовом
команды glColor..(), что позволяет избежать вызовов более ресурсоемкой команды
glMaterial..() и повышает эффективность программы.
Источники света
Добавить в сцену источник света можно с помощью команд
void glLight[i f](GLenum light, GLenum pname, GLfloat param)
void glLight[i f](GLenum light, GLenum pname, GLfloat *params)
Параметр light однозначно определяет источник,и выбирается из набора специальных
символических имен вида GL_LIGHTi, где i должно лежать в диапазоне от 0 до
GL_MAX_LIGHT, которое не превосходит восьми.
Оставшиеся два параметра имеют аналогичный смысл, что и в команде glMaterial..().
Рассмотрим их назначение (вначале описываются параметры для первой команды,
затем для второй):
GL_SPOT_EXPONENT параметр param должен содержать целое или вещественное
число от 0 до 128, задающее распределение интенсивности света. Этот параметр
описывает уровень сфокусированности источника света.
Значение по умолчанию: 0 (рассеянный свет).
GL_SPOT_CUTOFF параметр param должен содержать целое или вещественное
число между 0 и 90 или равное 180, которое определяет максимальный угол разброса
света. Значение этого параметра есть половина угла в вершине конусовидного
светового потока, создаваемого источником.
Значение по умолчанию: 180 (рассеянный свет).
GL_AMBIENT параметр params должен содержать четыре целых или вещественных
значения цветов RGBA, которые определяют цвет фонового освещения.
Значение по умолчанию: (0.0, 0.0, 0.0, 1.0).
51
GL_DIFFUSE параметр params должен содержать четыре целых или вещественных
значения цветов RGBA, которые определяют цвет диффузного освещения.
Значение по умолчанию: (1.0, 1.0, 1.0, 1.0)для LIGHT0 и (0.0, 0.0, 0.0, 1.0) для
остальных.
GL_SPECULAR параметр params должен содержать четыре целых или вещественных
значения цветов RGBA, которые определяют цвет зеркального отражения.
Значение по умолчанию: (1.0, 1.0, 1.0, 1.0)для LIGHT0 и (0.0, 0.0, 0.0, 1.0) для
остальных.
GL_POSITION параметр params должен содержать четыре целых или вещественных,
которые определяют положение источника света. Если значение компоненты w равно
0.0, то источник считается бесконечно удаленным и при расчете освещенности
учитывается только направление на точку (x,y,z), в противном случае считается, что
источник расположен в точке (x,y,z,w).
Значение по умолчанию: (0.0, 0.0, 1.0, 0.0).
GL_SPOT_DIRECTION параметр params должен содержать четыре целых или
вещественных числа, которые определяют направление света.
Значение по умолчанию: (0.0, 0.0, -1.0, 1.0).
При изменении положения источника света следует учитывать следующие факты: если
положение задается командой glLight..() перед определением ориентации взгляда
(командой glLookAt() ), то будет считаться, что источник находится в точке
наблюдения. Если положение устанавливается между заданием ориентации и
преобразованиями видовой матрицы, то оно фиксируется и не зависит от видовых
преобразований. В последнем случае, когда положение задано после ориентации и
видовой матрицы, его положение можно менять, устанавливая как новую ориентацию
наблюдателя, так и меняя видовую матрицу.
Для использования освещения сначала надо установить соответствующий режим
вызовом команды glEnable (GL_LIGHTNING), а затем включить нужный источник
командой glEnable(GL_LIGHTn).
Модель освещения
В OpenGL используется модель освещения Фонга, в соответствии с которой цвет
точки определяется несколькими факторами: свойствами материала и текстуры,
величиной нормали в этой точке, а также положением источника света и наблюдателя.
Для корректного расчета освещенности в точке надо использовать единичные
нормали, однако команды типа glScale..(), могут изменять длину нормалей. Чтобы это
учитывать, используется уже упоминавшийся режим нормализации нормалей,
который включается вызовом команды glEnable(GL_NORMALIZE).
Для задания глобальных параметров освещения используются команды
void glLightModel[i f](GLenum pname, GLenum param)
void glLightModel[i f]v(GLenum pname, const GLtype *params)
Аргумент pname определяет, какой параметр модели освещения будет настраиваться и
может принимать следующие значения:
GL_LIGHT_MODEL_LOCAL_VIEWER параметр param должен быть булевским и
задает положение наблюдателя. Если он равен FALSE, то направление обзора
считается параллельным оси –z, вне зависимости от положения в видовыx
координатах. Если же он равен TRUE, то наблюдатель находится в начале видовой
52
системы координат. Это может улучшить качество освещения, но усложняет его
расчет.
Значение по умолчанию: FALSE.
GL_LIGHT_MODEL_TWO_SIDE параметр param должен быть булевским и
управляет режимом расчета освещенности как для лицевых, так и для обратных
граней. Если он равен FALSE, то освещенность рассчитывается только для лицевых
граней. Если же он равен TRUE, расчет проводится и для обратных граней. Значение
по умолчанию: FALSE .
GL_LIGHT_MODEL_AMBIENT параметр params должен содержать четыре целых
или вещественных числа, которые определяют цвет фонового освещения даже в случае
отсутствия определенных источников света.
Значение по умолчанию:(0.2, 0.2, 0.2,1.0).
Текстуры
Наложение текстуры на поверхность объектов сцены повышает ее реалистичность,
однако при этом надо учитывать, что этот процесс требует значительных
вычислительных затрат. Под текстурой будем понимать некоторое изображение,
которое надо определенным образом нанести на объект. Для этого следует выполнить
следующие этапы:
выбрать изображение и преобразовать его к нужному формату
загрузить изображение в память
определить, как текстура будет наноситься на объект и как она будет с ним
взаимодействовать.
Рассмотрим каждый из этих этапов.
Подготовка текстуры
Принятый в OpenGL формат хранения изображений отличается от стандартного
формата Windows DIB только тем, что компоненты (R,G,B) для каждой точки хранятся
в прямом порядке, а не в обратном и выравнивание задается программистом.
Считывание графических данных из файла и их преобразование можно проводить и
вручную, однако удобней воспользоваться функцией, входящей в состав библиотеки
GLAUX (для ее использования надо дополнительно подключить glaux.lib), которая
сама проводит необходимые операции. Это функция
AUX_RGBImageRec* auxDIBImageLoad(string file)
где file– название файла с расширением *.bmp или *.dib. В качестве результата
функция возвращает указатель на область памяти, где хранятся преобразованные
данные.
При создании образа текстуры в памяти следует учитывать следующие требования.
Во-первых, размеры текстуры как по горизонтали, так и по вертикали должны
представлять собой степени двойки. Это требование накладывается для компактного
размещения текстуры в памяти и способствует ее эффективному использованию.
Использовать только текстуры с такими размерами конечно неудобно, поэтому перед
загрузкой их надо преобразовать. Изменение размеров текстуры проводится с
помощью команды
void gluScaleImage(GLenum format,
GLint widthin,
53
GL heightin,
GLenum typein,
const void *datain,
GLint widthout,
GLint heightout,
GLenum typeout,
void *dataout)
В качестве значения параметра format обычно используется значение GL_RGB или
GL_RGBA, определяющее формат хранения информации. Параметры widthin, heightin,
widhtout, heightout определяют размеры входного и выходного изображений, а с
помощью typein и typeout задается тип элементов массивов, расположенных по
адресам datain и dataout. Как и обычно, то может быть тип
GL_UNSIGNED_BYTE, GL_SHORT, GL_INT и так далее. Результат своей работы
функция заносит в область памяти, на которую указывает параметр dataout.
Во-вторых, надо предусмотреть случай, когда объект по размерам значительно меньше
наносимой на него текстуры. Чем меньше объект, тем меньше должна быть наносимая
на него текстура и поэтому вводится понятие уровней детализации текстуры. Каждый
уровень детализации задает некоторое изображение, которое является как правило
уменьшенной в два раза копией оригинала. Такой подход позволяет улучшить
качество нанесения текстуры на объект. Например, для изображения размером 2 mx2n
можно построить max(m,n)+1 уменьшенных изображений, соответствующих
различным уровням детализации.
Эти два этапа создания образа текстуры в памяти можно провести с помощью команды
void gluBuild2DMipmaps(GLenum target,
GLint components,
GLint width,
GLint height,
GLenum format,
GLenum type,
const void *data)
где параметр target должен быть равен GL_TEXTURE_2D, components определяет
количество цветовых компонент текстуры, которые будут использоваться при ее
наложении и может принимать значения от 1 до 4 (1-только красный,2-красный и
alpha, 3-красный, синий, зеленый, 4-все компоненты).
Параметры width, height, data определяют размеры и расположение текстуры
соответственно, а format и type имеют аналогичный смысл, что и в команде
gluScaleImage().
В OpenGL допускается использование одномерных текстур, то есть размера 1xN,
однако это всегда надо указывать, используя в качестве значения target константу
GL_TEXTURE_1D. Существует одномерный аналог рассматриваемой командыgluBuild1DMipmaps(), который отличается от двумерного отсутствием параметра
height.
54
При использовании в сцене нескольких текстур, в OpenGL применяется подход,
напоминающий создание списков изображений. Вначале, с помощью команды
void glGenTextures(GLsizei n, GLuint*textures)
надо создать n идентификаторов для используемых текстур, которые будут записаны в
массив textures. Перед началом определения свойств очередной текстуры следует
вызвать команду
void glBindTexture(GLenum target, GLuint texture)
где target может принимать значения GL_TEXTURE_1D или GL_TEXTURE_2D, а
параметр texture должен быть равен идентификатору той текстуры, к которой будут
относиться последующие команды. Для того, чтобы в процессе рисования сделать
текущей текстуру с некоторым идентификатором, достаточно опять вызвать команду
glBindTexture() c соответствующим значением target и texture. Таким образом, команда
glBindTexture() включает режим создания текстуры с идентификатором texture, если
такая текстура еще не создана, либо режим ее использования, то есть делает эту
текстуру текущей.
Методы наложения текстуры
При наложении текстуры, как уже упоминалось, надо учитывать случай, когда
размеры текстуры отличаются от размеров объекта, на который она накладывается.
При этом возможно как растяжение, так и сжатие изображения, и то, как будут
проводиться эти преобразования может серьезно повлиять на качество построенного
изображения. Для определения положения точки на текстуре используется
параметрическая система координат (s,t), причем значения s и t находятся в отрезке
[0,1]. Для изменения различных параметров текстуры применяются команды:
void glTexParameter[i f](GLenum target, GLenum pname, GLenum param)
void glTexParameter[i f]v(GLenum target, GLenum pname, GLenum *params)
При этом target имеет аналогичный смысл, что и раньше, pname определяет, какое
свойство будем менять,а с помощью param или params устанавливается новое
значение. Возможные значения pname:
GL_TEXTURE_MIN_FILTER параметр param определяет функцию, которая будет
использоваться для сжатия текстуры. При значении GL_NEAREST будет
использоваться один (ближайший), а при значении GL_LINEAR четыре ближайших
элемента текстуры.
Значение по умолчанию: GL_LINEAR.
GL_TEXTURE_MAG_FILTER параметр param определяет функцию, которая будет
использоваться для увеличения (растяжения) текстуры. При значении GL_NEAREST
будет использоваться один (ближайший), а при значении GL_LINEAR четыре
ближайших элемента текстуры.
Значение по умолчанию: GL_LINEAR.
GL_TEXTURE_WRAP_S параметр param устанавливает значение координаты s, если
оно не входит в отрезок [0,1]. При значении GL_REPEAT целая часть s отбрасывается,
и в результате изображение размножается по поверхности. При значении GL_CLAMP
используются краевые значения: 0 или 1, что удобно использовать, если на объект
накладывается один образ.
Значение по умолчанию: GL_REPEAT.
55
GL_TEXTURE_WRAP_T
координаты t.
аналогично
предыдущему
значению,
только
для
Использование режима GL_NEAREST значительно повышает скорость наложения
текстуры, однако при этом снижается качество, так как в отличие от GL_LINEAR
интерполяция не производится.
Для того, чтобы определить, как текстура будет взаимодействовать с материалом, из
которого сделан объект, используются команды
void glTexEnv[i f](GLenum target, GLenum pname, GLtype param)
void glTexEnv[i f]v(GLenum target, GLenum pname, GLtype *params)
Параметр target должен быть равен GL_TEXTURE_ENV, а в качестве pname
рассмотрим только одно значение GL_TEXTURE_ENV_MODE, которое наиболее
часто применяется. Параметр если param может быть равен:
GL_MODULATE конечный цвет находится как произведение цвета точки на
поверхности и цвета соответствующей ей точки на текстуре.
GL_REPLACE в качестве конечного цвета используется цвет точки на текстуре.
GL_BLEND конечный цвет находится как сумма цвета точки на поверхности и цвета
соответствующей ей точки на текстуре с учетом их яркости.
Координаты текстуры
Перед нанесением текстуры на объект осталось установить соответствие между
точками на поверхности объекта и на самой текстуре. Задавать это соответствие
можно двумя методами: отдельно для каждой вершины или сразу для всех вершин,
задав параметры специальной функции отображения.
Первый метод реализуется с помощью команд
void glTexCoord[1 2 3 4][s i f d](type coord)
void glTexCoord[1 2 3 4][s i f d]v(type *coord)
Чаще всего используется команды вида glTexCoord2..(type s, type t), задающие текущие
координаты текстуры. Вообще, понятие текущих координат текстуры аналогично
понятиям текущего цвета и текущей нормали, и является атрибутом вершины. Однако
даже для куба нахождение соответствующих координат текстуры является довольно
трудоемким занятием, поэтому в библиотеке GLU помимо команд, проводящих
построение таких примитивов, как сфера, цилиндр и диск, предусмотрено также
наложение на них текстур. Для этого достаточно вызвать команду
void gluQuadricTexture(GLUquadricObj*quadObject, GLboolean textureCoords)
с параметром textureCoords равным GL_TRUE, и тогда текущая текстура будет
автоматически накладываться на примитив.
Второй метод реализуется с помощью команд
void glTexGen[i f d](GLenum coord, GLenum pname, GLtype param)
void glTexGen[i f d]v(GLenum coord, GLenum pname, const GLtype *params)
Параметр coord определяет для какой координаты задается формула и может
принимать значение GL_S, GL_T; pname определяет тип формулы и может быть равен
GL_TEXTURE_GEN_MODE, GL_OBJECT_PLANE, GL_EYE_PLANE. С помощью
params задаются необходимые параметры, а param может быть равен
GL_OBJECT_LINEAR, GL_EYE_LINEAR, GL_SPHERE_MAP. Рассмотрение всех
возможных комбинаций значений аргументов этой команды заняло бы слишком много
56
места, поэтому в качестве примера рассмотрим, как можно задать зеркальную
текстуру. При таком наложении текстуры изображение будет как бы отражаться от
поверхности объекта, вызывая интересный оптический эффект. Для этого сначала надо
создать два целочисленных массива коэффициентов s_coeffs и t_coeffs со значениями
(1,0,0,1) и (0,1,0,1) соответственно, а затем вызвать команды:
glEnable(GL_TEXTURE_GEN_S);
glTexGeni(GL_S,
GL_TEXTURE_GEN_MODE,
GL_EYE_LINEAR); glTexGendv(GL_S, GL_EYE_PLANE, s_coeffs); и такие же
команды для координаты t с соответствующими изменениями.
57
Рекомендуемая литература.
[1] William E. Lorensen, Harvey E. Cline. CG vol.21, no.4, July 1987
[2] Bernardo P. Carneiro, Arie E. Kaufman. SIGGRAPH'96, pp. 205-210
[3] Andre Gueziec , IEEE Transactions on Visualization and Computer Graphics. Vol. 1,
Issue 4, pp. 328 - 342, December 1995
[4] Vaclav Skala , Conference on Scientific Computing 2000, pp. 368 - 378.
http://www.emis.de/journals/AMUC/_contributed/algo2000/skala.pdf
[5] Paolo Cignoni. IEEE Transaction on visualization and CG, vol.3, no.2 April-June 1997.
[6] D. V. Mogilenskikh, I. V. Pavlov. «Color interpolation algorithm in visualizing results of
numerical simulations». Visualization and imaging in transport phenomena. Annals of the
New York Academy of Sciences. v. 97, pp. 43-52, 2002.
[7] A. Hilton, A. J. Stoddart, J. Illingworth, T. Windeatt. International Conference on Image
Processing, 1996. ftp://ftp.ee.surrey.ac.uk/pub/vision/papers/hilton-icip96.ps.Z
[8] Tasso Karkanis , A. James Stewart. IEEE Computer Graphics and Applications, v.21 n.2,
p.60-69, March 2001
[9] B. Crespin, P. Guitton, C. Schlick. Proceedings of CSG'98, 1998
[10] Marshall Bern and David Eppstein. Computing in Euclidean Geometry Eds. World
Scientific, 1992, pp. 23-90
[11] M. Durst, "Letters: Additional Reference to Marching Cubes," Computer Graphics, vol.
22, no. 2, pp. 72-73, 1988.
[12] C. Rocchini, P. Cignoni, F. Ganovelli. International Conference on Shape Modeling &
Applications, 2001. http://smi2001.ima.ge.cnr.it/abstracts/47.pdf
[13] Yutaka Ohtake, Alexander G. Belyaev. ACM Symposium on Solid Modeling and
Applications, pp. 171 - 178, 2002. http://cis.k.hosei.ac.jp/~F-rep/SM02ob.pdf
[14] Y. Ohtake, A. G. Belyaev. Proceedings of the International Conference on Shape
Modeling & Applications, Page: 74, 2001. http://cis.k.hosei.ac.jp/~F-rep/OhtakeSmi01.pdf
[15] Gregory M. Nielson, Bernd Hamann. IEEE Visualization, Proceedings of the 2nd
conference on Visualization '91, pp.83 - 91, 1991
[16] Adriano Lopes, Ken Brodlie. IEEE Transactions on Visualization and Computer
Graphics, pp 16-29, 2002
[17] S. V. Matveev. Proceedings IEEE Visualization '94, pp. 288-292
[18] Andrew P. Witkin, Paul S. Heckbert. Proceedings of the 21st annual conference on
Computer graphics and interactive techniques, pp: 269 - 277, 1994.
www.cs.cmu.edu/~aw/pdf/particles-reprint.pdf
[19] H. Hoppe, T. DeRose, T. Duchamp, J. McDonald, and W. Stuetzle. SIGGRAPH'92
proceedings, 26(2), pp. 71-78.
[20] T. Itoh and K. Koyamada. «Automatic Isosurface Propagation using an Extrema Graph
and Sorted Boundary Cell Lists» IEEE Transactions on Visualization and Computer
Graphics 1(4) pp.319-327, 1995
58
[21] C. L. Bajaj, V. Pascucci, D. R.Schikore. «Fast Isocontouring for improved
Interactivity» In 1996 Symposium on Volume Visualization Proc., San Francisco (CA), Oct.
28-29, pp.39-46, 1996.
[22] H. Shen, C. D. Hansen, Y. Livnat and C. R. Johnos. « Isosurfacing in Span Space with
Utmost Effeciency (ISSUE)» in Visualisation 96’ Conf. Proc., San Francisco, Oct. 27-Nov.1,
pp. 287-294,1996.
[23] J. Wilhelms and A. Van Gelder. «Octrees for faster isosurface generation» ACM
Transaction on Graphics, 11(3) pp.201-227, July 1992.
[24] К.Фу, Р.Гонсалес. К.Ли. Робототехника. М.: Мир. 1989. 622 с.
[25] Б.К.П.Хорн. Зрение роботов. М.: Мир. 1989. 488 c.
[26] Ф. Мартинес. Синтез изображений. М.: Радио и связь. 1990. 192 с.
[27] У.Пратт. Цифровая обработка изображений. т.1 и т. 2. М.: Мир. 1982.
[28] Д. В. Могиленских и др. «Визуализация линий тока и методы комплексной
визуализации дискретных векторных полей». VII Забабахинские научный чтения.
Международная конференция. 2003.
[29] Ю.М.Баяковский, А.В.Игнатенко, А.И.Фролов. «Графическая
OpenGL». Учебно-методическое пособие, МГУ ВМиК, 2003 г.
библиотека
[30] Б. Мандельброт. Фрактальная геометрия природы . Ижевск: РХД. 2001
[31] Х.-О. Пайтген, П. Х. Рихтер. Красота фракталов. М.: Мир. 1993.
[32] Р. М. Кроновер. Фракталы и хаос в динамических системах. М.: Постмаркет. 2000.
[33] А. Д. Морозов. Введение в теорию фракталов. Ижевск.: Институт компьютерных
исследований. 2004.
59
Download