Задание № 1 - Северо-Кавказский горно

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«СЕВЕРО-КАВКАЗСКИЙ ГОРНО-МЕТАЛЛУРГИЧЕСКИЙ ИНСТИТУТ
(ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ)»
* * *
Кафедра «Автоматизированной обработки информации»
ПРОГРАММИРОВАНИЕ
ГРАФИКИ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
по выполнению лабораторных работ
для студентов, обучающихся по направлению подготовки
230100.68 – «Информатика и вычислительная техника»
Составители: Е. А. Соколова, С. А. Джиоева
Допущено
редакционно-издательским советом
Северо-Кавказского горно-металлургического института
(государственного технологического университета).
Протокол заседания РИСа № 4 от 16.07.2014 г.
ВЛАДИКАВКАЗ 2015
1
УДК 004.92
ББК 73
С59
Рецензент: кандидат технических наук,
доцент Северо-Кавказского горно-металлургического института
(государственного технологического университета)
Будаева А. А.
С59 Программирование графики: Методические указания по выполнению
лабораторных работ для студентов, обучающихся по направлению
подготовки 230100.68 – «Информатика и вычислительная техника / Сост.
Е. А. Соколова, С. А. Джиоева; Северо-Кавказский горно-металлургический
институт (государственный технологический университет. – Владикавказ:
Северо-Кавказский горно-металлургический институт (государственный
технологический университет). Изд-во «Терек», 2015. – 26 с.
Методические указания предназначены для получения студентами практических навыков
программирования графики. В работе даны варианты индивидуальных заданий по курсу
«Программирование графики».
УДК 004.92
ББК 73
Редактор Иванченко Н. К.
Компьютерная верстка Меркушевой О. А.
© Составление. ФГБОУ ВПО СКГМИ (ГТУ), 2015
© Соколова Е. А., Джиоева С. А., составление, 2015
Подписано в печать 16.02.15. Формат бумаги 60841/16. Бумага офсетная. Гарнитура «Таймс».
Печать на ризографе. Усл. п. л. 1,51. Усл.-изд. 1,05. Тираж 10 экз.
Северо-Кавказский горно-металлургический институт (государственный технологический университет).
Изд-во «Терек».
Отпечатано в отделе оперативной полиграфии СКГМИ (ГТУ).
362021, г. Владикавказ, ул. Николаева, 44.
2
СОДЕРЖАНИЕ
Задание № 1.
Фрактальные изображения………………………………………………. 4
Задание № 2.
Цифровая обработка сигналов…………………………………………... 13
Задание № 3.
Обработка и анализ изображений………………………………………. 15
Задание № 4.
Геометрическое морфирование………………………………………….
17
Задание № 5.
Интерактивная анимация…………………………………………………. 23
Литература……………………………………………………………………….. 26
3
Задание № 1
Фрактальные изображения
Цель задания – рассчитать (желательно с приемлемой скоростью) и отобразить
фрактальное изображение.
Описание задания
Введение
Рассматривая некоторые последовательности комплексных чисел и выбирая
закраску точки в зависимости от скорости сходимости последовательности, можно
получить интересные изображения.
Метод Ньютона
Метод основан на решении уравнений методом Ньютона. Решение уравнения
f( z ) = 0 имеет вид zk+1 = N( zk ), где N( z ) = z – f( z ) / f'( z ). Рассмотрим уравнение
pow ( z, 3 ) – 1 = 0.
Вот как будет выглядеть построение фракталов при использовании метода Ньютона
для решения уравнения:
maxIterations = 64;
count = 0;
z
= current;//комплексные переменные
delta
= z; z1 = z;
while ( count < maxIterations && abs( z ) < 1e6
&& abs ( delta ) > 1e-6 )
{
z = z - ( z * z * z - 1 ) / ( 3 * z * z ); delta = z1 - z;
z1 = z;
}
SetColor ( ColorPalette[count * 256 / maxIterations] );
Палитру можно сформировать по-разному, на данной картинке – градиентный
переход цветов.
Более сложный пример задания
последовательности комплексных чисел
4
Общая идея проста. Берется некая последовательность комплексных чисел
zn = F(zn–1),
где F может быть суперпозицией различных функций. Рассматривается
сходимость (расходимость) этой последовательности. Обычно достаточно рассмотреть
около 30 итераций. Далее, в зависимости от скорости сходимости, выбирается цвет
в точке. Рассмотрим пример с розой – расчет цвета в одной точке. Диапазон
изменения
комплексного
числа
current
(1.41243196908302890000,
0.43820235769674321000) до (1.41299091299888270000, 0.43876197245340087000)
Разность действительных частей соответствует ширине изображения, разность
мнимых – высоте.
tolerance = 1e-6;
z
= current;
zold = [0, 0];//комлексное число, Re( zold ) = Im( zold ) = 0
xmax = xmin = xtot = 0;//вещественные числа
ymin = ymax = ytot = 0;
mmin = mmax = mtot = 0;
stop = 0;
//собственно вычисления
z += log( z );//комплексные функции
while( stop == 0 && count < 30 )//30 итераций достаточно
{
if( abs( Re( z ) - Re( zold ) ) <= tolerance
&& abs( Im( z ) - Im( zold ) ) <= tolerance )
//критерий остановки
stop = 1;
else
sc
= sec( z ) * csc( z );//где
{
sec(z)=1./cos(z),
csc(z)=1./sin(z)
f_z = log( sc );
fp_z = 1/sc * ( sc * tan( z ) - sec( z ) * pow( csc( z
), 2 ) );
zold = z;
z
= z - fp_z / f_z;//такопределяется
последовательность zn
value = csc(z);
//все что далее нужно для определения цвета
x = Re( value );
y = Im( value );
m = abs( value );//модуль комл. числа - sqrt( x*x +
y*y )
xtot += x;
ytot += y;
mtot += m;
xmin = min( xmin, x );
xmax = max( xmax, x );
ymin = min( ymin, y );
ymax = max( ymax, y );
mmin = min( mmin, m );
mmax = max( mmax, m );
count++;
}
}
//теперь собственно определение цвета - немного изменив эту часть,
получаем:
5
совсем др вид
r = g = b = 0;
if( count > 0 )
{
r = ((xtot/count) - xmin)/(xmax - xmin);
g = ((ytot/count) - ymin)/(ymax - ymin);
b = ((mtot/count) - mmin)/(mmax - mmin);
//параметры для расчета цвета, можно менять по-разному, но так
// чтобы 0 < xStart < 255 и 0 < xStep < 2
rStart = 255;
gStart = 205;
bStart = 255;
rStep = 1.5;
gStep = 1.5;
bStep = 1.0;
//собственно расчет цвета, здесь цвета как бы "идут по кругу"
r = -cos( 2*PI*r );
g = -cos( 2*PI*g );
b = -cos( 2*PI*b );
r = r*127 + 127;
g = g*127 + 127;
b = b*127 + 127;
r = r*rStep + rStart;
g = g*gStep + gStart;
b = b*bStep + bStart;
r /= 360.0;
g /= 360.0;
b /= 360.0;
r = sin( PI*r );
g = sin( PI*g );
b = sin( PI*b );
r = r*128 + 127;
g = g*128 + 127;
b = b*128 + 127;
}
SetColor( b, g, r );
Метод Тейлора
Рассмотрим разложение exp(z) в ряд Тейлора, Z – комплексное число.
Фактически раскраска определяется тем, насколько быстро сумма многочленов,
взятых с некоторым коэффициентом (в его выборе можно поэксперементировать),
6
приближается к значению экспоненты. Вот пример, как это
Расчет цвета в данной точке:
может выглядеть.
maxIterations = 15;
tolerance
= 1e-6;
z = exp (current);//current - точка на комлексной плоскости,
//соответствующая данной точке получаемого изображения
xmax = xdev = xavg = 0;
ymax = ydev = yavg = 0;
mmax = mdev = mavg = 0;
zSum = 0;
double denominator = 1;//вещественная переменная
point = exp( current );//это и будет весовой коэффициент
//совсем необязательно брать здесь экспоненту,
// выглядет это может и так point[5, 5]; point = sin (point)
// и т.д.
//цикл, не более maxIterations, пока zSum не подойдет "достаточно
близко" к z
while( count < maxIterations && norm( zSum - z ) > tolerance )
{
zSum += exp( point ) * ( ( current - point ) ^ count ) /
denominator;
if( count > 0 )
denominator *= ( count + 1 );
//теперь собственно определение цвета
value = cot( zSum );
x = abs( value^0.1 );
y = abs( value^0.2 );
m = abs( value^0.4 );
xavg = (x + xavg*count) / (count + 1);
yavg = (y + yavg*count) / (count + 1);
mavg = (m + mavg*count) / (count + 1);
xdev = sqrt( (x-xavg) * (x-xavg) );
ydev = sqrt( (y-yavg) * (y-yavg) );
mdev = sqrt( (m-mavg) * (m-mavg) );
xmax = max( x, xdev );
ymax = max( y, ydev );
mmax = max( m, mdev );
xtot += xdev;
ytot += ydev;
mtot += mdev;
}
r = g = b = 0;
if (count > 0)
{
r = (xtot/count)/ xmax;
g = (ytot/count)/ ymax;
b = (mtot/count)/ mmax;
r = InterpolateColor( 1, 255, r );
g = InterpolateColor( 1, 255, g );
b = InterpolateColor( 1, 255, b );
}
SetColor (r, g, b);
7
Метод регионов
Можно сгенерировать интересные изображения, задавая определенные
условия цикла. Рассмотрим механизм регионов (т. е. в цикле определяем,
принадлежит ли данная точка некоторому региону). В общем виде это выглядит так
z = [0, 0];
while( count < 20 && squared_abs( z ) < 4 )
{
if( inside(z, some region ) )
{
// точка z принадлежит региону, выходим из цикла
break;
}
z = z ^ 2 + current;
}
value = deg( z ) * ( 255 / 360.0 );
set_color( value, value, value );
В качестве региона можно взять круг, эллипс, многоугольник, но лучше их
комбинации (объединение, пересечение, отсечение).
Пример:
z = [0, 0];
xmin = 0; ymin = 0;
xmax = 0; ymax = 0;
mmin = 0;
mmax = 0;
xtot = 0; ytot = 0;
mtot = 0;
flag = 0;
p
= [0, 0];
r1 = 1;
r2 = 1.05; r3 = 2;
r4 = 2.05;
while( count < 30 && squared_abs( z ) < 1e4 )
{
if( flag == 0 )
{
if( inside( z,
region_and( region_not(
region_sidedpoly(p, 5, r1, 0)),
region_sidedpoly(p, 5, r2, 0) ) ) )
//здесь sidedpoly( p, 5, r2, 0 ) - 5-угольник, вписанный в
8
//окружность с центром в т.p и радиусом r2
{
flag = 1;
}
}
else
{
if( inside( z,
region_and( region_not(
region_sidedpoly(p, 5, r3, 0)),
region_sidedpoly(p, 5, r4, 0) ) ) )
{
flag = 0;
}
}
if( flag == 0 )
z = sec(z - current);
else
z = csc(z - current);
z = log( z ); value
= z;
x = real( value ); y =
imag( value ); m = mag(
value );
xmin = min( xmin, x ); ymin
= min( ymin, y ); mmin =
min( mmin, m ); xmax = max(
xmax, x ); ymax = max( ymax,
y ); mmax = max( mmax, m );
xtot += x;
ytot += y; mtot +=
m;
}
r = 0; g = 0; b = 0;
if(count > 0)
{
r = ( xtot/count - xmin ) / ( xmax - xmin ); g = (
ytot/count - ymin ) / ( ymax - ymin ); b = (
mtot/count - mmin ) / ( mmax - mmin );
r = get_sin_color( r, 255, 1 ); g =
get_sin_color( g, 255, 1 ); b =
get_sin_color( b, 255, 1 );
}
set_color(r, g, b);
}
}
9
Дополнительная часть
Желательно реализовать сохранение файла в форматы png, jpeg, tif и т. д.
Как один из несложных вариантов этого – использование классов и функций
GDI+. Основные ваши действия при этом – потребуется подключить #include и
добавить библиотеку gdiplus.lib, а также указать using namespace Gdiplus.
Для инициализации GDI+ определить GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR
gdiplusToken;
и
в
начале
программы
вызвать
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL). При завершении работы
программы вызвать GdiplusShutdown( gdiplusToken ).
GDI+ по умолчанию позволяет работать со следующими форматами:





image/bmp
image/jpeg
image/gif
image/tiff
image/png
Для сохранения изображения в желаемом
идентификатор требуемого кодировщик, например:
формате
нужно
получить
CLSID pngClsid;
GetEncoderClsid(L"image/png", &pngClsid);
image.Save(L"Mosaic2.png", &pngClsid, NULL);
//где image - переменная класса Image или его производного Bitmap,
содержащая
//сгенерированное изображение.
10
Определить идентификатор енкодера данного формата можно так:
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0;
// number of image encoders
UINT size = 0;
// size of the image encoder array in
bytes
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}
free(pImageCodecInfo);
return -1; // Failure
}
Третий параметр в методе Image::Save() – указатель на EncoderParameters,
используя его, для каждого формата можно задать определенные настройки,
например, для jpeg – уровень качества. Подробнее см. документацию по GDI+.
Для повышения качества картинки рекомендуется избавиться от эффекта
алиасинга (ступенчатости).
Фрактальное изображение с сильной ступенчатостью
11
Работая с GDI+, достаточно установить для объекта Graphics желаемое качество.
VOID Example_SetSetSmoothingMode(HDC hdc)
{
Graphics graphics( hdc );
graphics.SetSmoothingMode( SmoothingModeHighQuality );
}
Требования к программе
Программа должна генерировать фрактал каким-либо из предложенных
способов (наиболее простым является метод Ньютона), можно сделать и своим
способом, тогда в readme файле кратко опишите метод. Если расчет занимает
много времени, выводите индикатор состояния.
12
Задание № 2
Цифровая обработка сигналов
Цель задания – научиться обработке изображений, работе с фильтрами.
Описание задания
Звездочкой (*) отмечены необязательные пункты.
Обработка изображений
Требуется написать программу, выполняющую следующие операции над
изображениями:

Загрузка и отображение BMP-файла. Достаточно сделать поддержку только
формата RGB-24 BMP-файлов.

Преобразование изображения (см. далее), отображение на экране
результата и сохранение в BMP-файл (достаточно поддержки RGB-формата).

Построение для изображения палитры методом K-средних. Число цветов в
палитре задается пользователем (в пределах 2 – 256). 2 балла.

Палитризация изображения с использованием построенной палитры
методами:
– округления, 1 балл;
– диффузии ошибки (Floyd-Steinberg), 2 балла.

Фильтр Unsharp Mask:
Регулируемые радиус фильтра и сила эффекта. Устранение краевых
эффектов – по краям не должно появляться рамки. 2 балла;
(*) Адаптация к количеству шума, регулируемый порог. +1 балл;
(*) Реализация гауссиана в двух вариантах: 2D и 1D (с учетом
сепарабельности) и сравнение времени фильтрации. +1 балл;

(*) Вращение изображения на произвольный задаваемый угол с
использованием билинейной интерполяции. 2 балла.
(*) Обработка звука
Требуется написать программу, выполняющую следующие операции:
– загрузка, преобразование и сохранение WAV-файла. Достаточно сделать
поддержку только CD-формата 44.1 кГц, 16 бит, стерео;
– преобразование стереопанорамы по формулам:
LeftOut = Norm * (LeftIn + k * RightIn)
RightOut = Norm * (RightIn + k * LeftIn)
13
-1 <= k <= 1
Norm = 1/(1+k) при k > 0, иначе Norm = 1
При k = 0 получаем тождественное преобразование, при k = 1 получаем эффект
моно, при к = -1 получаем эффект караоке.
Отображение Фурье-спектра звукового сигнала
Должна быть возможность задать смещение анализируемого блока от начала
WAV-файла и использовать весовое окно Ханна. Амплитуда отбражается в децибелах.
Доп. возможности: логарифмический масштаб по частотам, сетка частот и
амплитуд.
14
Задание № 3
Обработка и анализ изображений
Задание посвящено применению полученных знаний по обработке и анализу
изображений для решения модельной задачи – построения пути от начальной точки,
отмеченной красной стрелкой на изображении до "клада". Для успешного выполнения
задания требуется реализовать несколько функций по обработке изображений, а
также суметь воспользоваться этими функциями для успешного решения задачи
распознавания.
На изображениях для обработки находятся 3 типа объектов интереса:
– белые стрелки, указывающие путь;
– начальная стрелка (всегда красного цвета);
– "клад" – некоторый объект, на который указывает последняя в пути стрелка.
Задание. Задание формулируется следующим образом: на входном изображении нужно обнаружить стрелки, построить путь от начальной точки до "клада".
Правила отображения результатов:
1. Нарисовать путь по стрелочкам от начальной точки до клада в виде ломаной
линии.
2. Отметить клад на рисунке (либо прямоугольной рамкой, либо оконтуриванием
объекта).
Исходная картинка (слева) и результат работы (справа)
Обязательная часть задания
Требуется написать программу, выполняющую следующие операции над
изображениями из категории "simple" (отсутствие шума, черный фон, светлые
объекты):
– загрузка и отображение BMP-файла. Достаточно сделать поддержку только
RGB (непалитровых) форматов изображений;
– преобразование изображения в бинарное с помощью любого
из представленных на лекции алгоритмов;
– выделение связных областей любым из алгоритмов, данных на лекции;
15
– обнаружение объектов на изображении (стрелки, начальная стрелка,
клад) с помощью их характеристик (цвет, хар-ки связных областей, что еще
придумаете);
– построение пути от красной стрелки до клада.
Отображение должно быть оформлено, как написано выше, оба пункта правил
отображения обязательны.
Программа должна реализовывать универсальный алгоритм, одинаково
(правильно) работающий на всех изображениях из категории "simple".
Дополнительная часть задания






Реализация медианной фильтрации с задаваемым размером окрестности;
Реализация выделения связных областей путем последовательного
сканирования;
Реализация операций математической морфологии (cужение, расширение,
открытие, закрытие);
Реализация любого метода автоматического определения порога сегментации
(треугольника, k-средних, симметричного пика);
Реализация одного из методов коррекции контрастности/цветности; (серый
мир, растяжение диапазона);
Оконтуривание клада методами выделения краев или мат. морфологии.
Помимо "простых" для распознавания изображений (набор "simple") даются
два дополнительных набора. Один – с зашумленными изображениями, для
тех, кому интересно решить более сложную задачу ("medium"), и один – с
сильно испорченными изображениями ("maniac").
Имейте в виду, что шумоподавление можно применять как до перевода
изображения в бинарное, так и после – выбор алгоритма за вами. В файле readme
обязательно
должно
быть
описано,
как
именно
подавляется
шум
(последовательность
фильтров, их параметры). Если не удается найти
универсальную последовательность фильтров для шумоподавления для всех
изображений с шумом, можно сделать свою последовательность для каждого
шумного изображения, вызываемую из меню программы.
16
Задание № 4
Геометрическое морфирование
Введение
Цель задания – получение навыков работы с геометрическими объектами в
двух- и трехмерном пространствах; определение простейшей визуализации данных с
помощью OpenGL понятия о морфировании геометрических объектов.
Требуется создать программу, позволяющую осуществлять морфирование двухи трехмерных объектов определенной формы.
Рис. 4.1. Примеры морфирования в двухи трехмерном пространствах
Предлагаемый алгоритм
Приведем возможную реализацию для плоских выпуклых фигур. Алгоритм
очевидно обобщается для случая трехмерных фигур.
Подробное описание алгоритма можно найти в прилагаемой к заданию статье.
Рассмотрим процесс морфирования выпуклой фигуры А в выпуклую фигуру B.
Пусть морфинг производится в течение промежутка времени [0,1]. Необходимо
указать для каждого момента времени t из [0,1] фигуру AB(t) такую,
что AB(0) = A, AB(1) = B, причем изменение AB с течением времени – плавное.
Этап I. Создание описывающих фигур
Через грани фигуры А проводятся прямые – назовем их ограничивающими
прямыми. Фигура, ограничиваемая этими прямыми – A''.Производится параллельный
перенос ограничивающих прямых таким образом, чтобы A'' была минимальной
фигурой, содержащей фигуру B (рис. 4.2). Параллельный перенос граней по
17
отдельности показан на рис. 4.2a, 4.2b, 4.2c. На рис. 4.2d показан результат: исходная
фигура "описала" конечную. Если производить перенос в течение конечного
промежутка времени, получим морфинг А в А'':
A' = A'(t)
A'(0) = A
A'(1) = A''
Аналогично создается образ B'' фигуры B, содержащий фигуру А, и морфинг B' = B'(t).
Построение образа показано на рис. 4.3.a–d.
Рис. 4.2. Создание описывающих фигур
Рис. 4.3. Создание описывающих фигур
Этап II. Морфирование
Для того, чтобы построить непрерывное морфирование фигур A и B друг в друга,
одновременно производится морфинг A в A' и B' в B. Для каждого t из [0,1] строится
фигура AB'(t), являющаяся пересечением A'(t) и B'(t). Процесс получения
промежуточных фигур показан на рис. 4.4а. Результат показан на риc. 4.4b.
18
Рис. 4.4. Процесс морфинга
Рис. 4.5. Результат морфинга
Заметим, что:
AB'(0) = A
AB'(1) = B
AB изменяется плавно с течением времени Таким образом,
AB'(t) – морфинг между фигурами A и B. Подробное описание алгоритма для
трехмерного случая.
19
Шаг 1. Построение описывающих фигур
Предположим, что нормали граней фигуры А направлены наружу, будем называть
полупространство относительно грани (или плоскости, содержащей грань) фигуры А
положительным ( P+(a) ), если нормаль грани направлена в это полупространство.
Зададимся разрешением морфинга (количеством промежуточных фигур между A и B) – N.
1. Возьмем грань фигуры А, обозначим плоскость, ее содержащую, через a.
Вычислим минимальный вектор d такой, что фигуры А и B будут целиком
лежать по одну сторону от грани a', полученной путем сдвига a на d.
a. Среди всех вершин фигуры В найдем вершину M, наиболее удаленную
от плоскости a и находящуюся в P+(a) . Проекция вектора из
произвольной точки a в M на нормаль a будет искомым вектором d.
б. Обозначим плоскость, полученную из a путем добавления к ней d*(i/N) ,
как a(i).
2. Повторим шаг 1 для всех граней фигуры А. Множество полученных граней
для каждого i обозначим A(i).
Для фигуры B повторим ту же самую процедуру, за исключением:
обозначение b(i) для граней фигуры B будет означать b + d*(N-i/N) .
Шаг 2. Генерация морфинга
Для получения i-го шага морфинга необходимо найти фигуру, ограничиваемую
множествами плоскостей A(i) и B(i). Объединение этих множеств назовем C(i) .
1. Найдем множество Q' точек, где пересекаются три или более граней из С(i).
2. Получаем из Q' множество Q путем отбрасывания точек, находящихся
в положительном полупространстве хотя бы одной из плоскостей из
C(i).
3. Сформируем грани промежуточной фигуры из точек Q:
a. Для каждой плоскости из C(i) найдем точки из Q, принадлежащие ей
(расстояние от плоскости до точки равно нулю). Эти точки станут
вершинами грани.
б. Занумеруем точки так, чтобы они образовали выпуклый многоугольник.
Выберем вектор b, соединяющий две произвольно выбранные
точки A и B из рассматриваемого набора. Обозначим n – нормаль к
плоскости, которой принадлежат точки набора (плоскость можно найти
по любым трем точкам набора). Нумерацию точек набора проведем в
соответствии с углом, на который нужно повернуть b вокруг A, чтобы
плоскость, проходящая через n и q, включила отличную от A и B точку С
из набора, т. е. между векторами b и c = AC.
Примечание. При нумерации имейте в виду, что потом вам понадобится
найти нормаль полученной грани.
Примечание. Решаемая на этапе 3 задача – суть нахождение выпуклой
оболочки для множества точек Q. Существуют более изящные алгоритмы решения
этой задачи. Реализация подобных алгоритмов – повод для получения бонуса.
Обязательная часть
Обязательная часть предполагает реализацию морфирования выпуклых
многоугольников в двумерном пространстве. В программе есть жестко определенные
начальный и конечный многоугольники. По команде пользователя запускается
процесс морфирования.
20
Процесс морфирования должен быть хорошо виден на экране – скорость
процесса должна быть разумной.
Исходная и конечная фигуры должны существенно отличаться: разное
количество вершин, ребер и т. п.
Вместо плоских фигур (или дополнительно к ним) можно реализовать
морфирование в трехмерном пространстве – за этот вариант дается большее
количество баллов.
Визуализация процесса производится с применением библиотеки OpenGL.
Дополнительная часть
Ниже приведены возможности, за реализацию которых можно получить
дополнительные баллы:
– управление ходом морфирования: кнопки вперед, назад,
приостановить, сделать один шаг морфирования;
– считывание моделей многоугольников или многогранников и файла.
Формат файла для двумерного случая:
В каждой строке хранятся разделенные пробелом координаты вершин. Номер
вершины совпадает с номером строки. Вершины нумеруются по часовой стрелке.
Координаты вершины – действительные числа, находятся в диапазоне [-1,1]. ,
Формат файла для трехмерного случая:
MESH_FILE ::=
{
MESH_VERTEX_LIST { < VERTEX_LIST > }
MESH_FACE_LIST { < FACE_LIST > }
}
VERTEX_LIST ::= < VERTEX_DEF > | < VERTEX_LIST>, < VERTEX_DEF >
FACE_LIST ::= < FACE_DEF > | < FACE_LIST>, < FACE_DEF >
VERTEX_DEF ::= < DOUBLE > < DOUBLE > < DOUBLE >
FACE_DEF ::= < INT > | < FACE_DEF > < INT >
Примечание: в описании символ { и лексемы MESH_VERTEX_LIST,
MESH_FACE_LIST нужно рассматривать как строковые константы – целое
неотрицательное число, вещественное число в диапазоне [-1,1].
Блендинг цвета или текстуры. Блендинг цвета – постепенное изменение
цвета в процессе морфирования одной фигуры в другую. Блендинг текстуры: на
исходную и целевую модели многогранников накладываются текстуры. Текстура
промежуточных моделей морфинга представляет из себя смесь текстур исходной и
конечной моделей, полученную средствами мультитекстурирования OpenGL (см.
Материалы для выполнения задания).
21
Примеры моделей многоугольников и многогранников:
square.txt
triangle.txt
cube.ase
pyramid.ase
Материалы для выполнения задания
Предлагается реализовать морфирование, описанное в статье DMorph by Andrew
Glasser, используя следующие материалы:
1. Баяковский Ю., Игнатенко А., Фролов А. Графическая библиотека
OpenGL. Учебно-методическое пособие.
2. Обучающая программа для изучение свойств команд OpenGL
3. Простые примеры, использующие OpenGL.
4. Дополнительные полезные материалы и ссылки.
5. http://www.opengl.org/
Требования к программе
Обязательное требование – выполнить обязательную часть задания. При этом
программа должна работать в интерактивном режиме, т. е. количество кадров в
секунду не должно опускаться ниже 5–10 на современной машине с ускорителем.
22
Задание № 5
Интерактивная анимация
Введение
Цель задания – получение навыков работы с трехмерными динамическими
данными, визуализация с помощью OpenGL, использование приемов работы с
OpenGL для увеличения реалистичности интерактивной визуализации сцены.
Требуется создать средствами OpenGL анимированное изображение заданное
трехмерной сценой. Движение объектов должно происходить под действием
ньютоновских сил (гравитации и т. п.), по законам динамики твердых тел.
Описание задания
На входе программы – специальный файл, в котором задается геометрия
сцены вместе с параметрами для симуляции (начальные скорости объектов, масса и
т. п.). Для загрузки файла предоставляется специальная библиотека, т. е. загрузка
своими силами не требуется.
Сцена включает в себя следующие элементы:




шары (анимируются);
прямоугольники (не анимируются, задают статическую часть сцены – стены и
т. п.);
начальное положение и направление камеры;
положение точечных источников света.
Каждый динамический объект имеет начальную скорость, цвет и массу.
Обязательная часть
Обязательная часть задания предполагает, во-первых, рисование сцены в
начальном положении, соответствующем заданному во входном файле. Во-вторых,
по нажатию на клавишу (кнопку и т. п.) сцена должна начать анимироваться в
соответствии с законами физики и параметрами, заданными во входном файле.
Симуляция должна соответствовать законам Ньютоновской динамики.
В сцене должно присутствовать освещение, т. е. визуализация должна
происходить с включенным режимом освещения OpenGL, а объектам должны быть
назначены материалы.
Освещение и начальное положение камеры должно соответствовать данным в
файле. Если освещение не задано, необходимо поставить источник "по умолчанию"
(лучше всего параллельный).
Замечания по алгоритмам симуляции динамики
Симуляция физически корректного движения объектов распадается на две
подзадачи: определение столкновений объектов и моделирование движения под
действием сил.
В конкретной постановке задачи требуется определять столкновения шаров с
плоскостью (прямоугольником) и шаров с шарами.
В статическом варианте определить точку пересечения нетрудно. Однако для
дискретной анимации могут возникать некоторые сложности, связанные с тем, что
момент столкновения может попасть на время между последовательными вызовами
процедуры тестирования пересечения.
Для решения этой проблемы в случае пересечения шара и плоскости
предлагается использовать уравнение для луча и находить точное время
23
пересечения. Если это время ненамного отличается от текущего, считать, что
пересечение произошло и соответствующим образом модифицировать положение
сферы ("поставить" на плоскость).
Для нахождения пересечения двух шаров можно использовать следующий
метод: если в данный момент времени шары пересекаются, откатывать время
назад небольшими шагами, на каждом шаге проверяя пересечение. Таким образом
можно достаточно точно найти момент времени, в который шары столкнулись.
Моделирование движения под действием сил сводится к вычислению
перемещения тел (шаров) под действием силы гравитации и в моменты столкновения
с другими объектами. Достаточно реализовать простейшую модель движения под
действием силы тяжести, пренебрегая сопротивлением воздуха. Например:
Velocity_New = Velocity_Old + Acceleration * TimeStep
Position_New = Position_Old + Velocity_New * TimeStep
где
 Velocity_New – скорость объекта по прошествии времени TimeStep,
 Position_New – положение объекта по прошествии времени TimeStep,
 Velocity_Old , Position_Old – соответственно текущие скорость и
положение объекта.
Объекты перемещаются соответственно вычисленной скорости. В
моменты столкновения рассчитывается новое ускорение (a = F/m, где F – сумма
сил, действующих на тело, а m – масса тела) и скорость модифицируется
соответствующим образом.
Дополнительная часть











Улучшенная анимация. За реализацию дополнительных физических эффектов
(описать в readme.txt) даются дополнительные баллы.
Соударение шаров. Реализация корректного соударения шаров (с правильным
моделированием отскоков!).
Независимая скорость анимации. Скорость анимации не зависит от скорости
машины.
Навигация по сцене. Реализация перемещения камеры по сцене в режиме
"полета".
Текстуры. Использование текстур для объектов. Изображение текстур можно
задавать в файле данных, а отображение определять автоматически.
Тени на плоскости. Отображение теней, падающих на плоскости (тени не
должны вылезать за края плоскости).
Полные тени. Тени, падающие в том числе и на шары.
Зеркальные отражения на плоскости. Зеркальные отражения на плоскостях.
Коэффициент зеркального отражения задается в файле данных.
Зеркальные отражения на шарах. Коэффициент зеркального отражения
задается в файле данных. Отражения должны обновляться динамически.
Полупрозрачные объекты. Полупрозрачность объектов задается в файле
данных. Засчитывается только корректная полупрозначность (т. е. с
пространственной сортировкой объектов и выводом back-to-front)
Устранение
ступенчатости.
Реализация
устранения
ступенчатости
(antialiasing) методом, предложенным в пособии или каким-либо другим также
оценивается. Обратите внимание: есть разница между размытием сцены и
устранением ступенчатости!
24
Требования к программе
Программа должна предоставлять возможность открытия произвольного файла
.cganim. Имя файла можно брать из командной строки или открывать
соответствующий диалог. После загрузки файла должна показываться сцена в
начальном положении, без анимации.
По нажатию кнопки в окне, пункта меню, клавиши и т. п. должна запускаться
анимация. Также необходимо предоставить возможность вернуть симуляцию в
начальное состояние. Приветствуется возможность регулировки скорости анимации.
Скорость работы должна быть ориентировочно не менее 5 кадров/с на
современной машине бюджетного уровня (P4 2000, графический ускоритель уровне
NVidia GeForce3)
http://graphicon.ru/oldgr/courses/cg/assigns/2004/index.html
25
ЛИТЕРАТУРА
Основная:
1. Миронов Б. Г. Инженерная и компьютерная графика. М.: Высшая школа, 2004. 334 с.: ил.
2. Петров М. Н. Компьютерная графика. СПб.: Питер, 2004. 811 с.: ил.
Дополнительная:
3. Гурский Ю. Компьютерная графика. СПб.: Питер, 2004. 812 с.: ил.
4. Миронов Б. Г. Сборник заданий по инженерной графике с примерами выполнения
чертежей на компьютере. М.: Высшая школа, 2003. 355 с.: ил.
5. Рейнбоу В. Компьютерная графика. Энциклопедия. СПб.: Питер, 2003. 768 с.: ил.
26
ПРОГРАММИРОВАНИЕ
ГРАФИКИ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
по выполнению лабораторных работ
для студентов, обучающихся по направлению подготовки
230100.68 – «Информатика и вычислительная техника»
Составители: Е. А. Соколова, С. А. Джиоева
ВЛАДИКАВКАЗ 2015
27
Download