Читайте также: |
|
Курсовая работа
по Компьютерной графике
Тема: «Программирование движущегося изображения:………………………………….»
Выполнил: студент гр. ЗСМ 14-11 Проверил: профессор Иванов А.Г. |
Чебоксары 2012
Задание:
Программирование движущегося изображения:, путем создания программы на языках Turbo Pascal и Object Pascal, которая выводит изображение в среде Windows с цветовым разрешением 16,5 млн цветов.
Основные сведения.
Динамическая графика - это движущиеся или нестационарные графические объекты, реалистично имитирующие природные процессы и реагирующие на внешние события: нажатие клавиши, изменение положения курсора, временные интервалы.
В основе формирования прямолинейного и криволинейного движений лежит стробоскопическая фиксация новых промежуточных положений графического объекта и очистка предыдущих положений с экрана. Фиксация заключается в кратковременной задержке положения объекта, а затем перерисовка его в новом состоянии, с удалением изображения предыдущего состояния. Для задержки времени программно может использоваться пустой цикл с большим количеством
итераций или временной интервал фиксации изображения по системному таймеру С обработкой сообщения wm_Timer. Также возможно пользоваться скроллингом экрана.
Рассмотрим все три варианта программной реализации.
Вариант 1.
Реализация прямолинейного движения трех шаров с разными скоростями на темном экране.
Программный код написан в части, ограниченной инструкциями
BeginPaint (HWindow, PS)... EndPaint (HWindow, PS). Сначала зальем экран фоновым цветом:
Затем в цикле по все длине горизонтальной части окна сделаем прорисовку трех шаров разного цвета, затем установим кисть черной, выдержим паузу и закрасим карандашом цветом фона дуговой шлейф, остающийся на экране после последующего изменения положения каждого из шаров:
Для аккуратной работы иногда приходится устанавливать инструмент пожирнее, чтобы избежать незакрашенных участков шлейфа. Предпочтительно использовать инструкции циклов без параметров, так как при сворачивании окна заново отрабатывается процедура wmPaint, устанавливающая начальное значение параметра i=0. Параметр масштабирования а обусловливает изменение размеров шаров, а координаты хО, уО изменяют положение шаров на экране. Параметры
vl,v2,v3 определяют стартовую позицию каждого из шаров. Скорость перемещения шаров различна и определяется коэффициентом при i. Максимальную среди шаров скорость перемещения имеет красный шар. Общий темп изменения параметра i задает параметр j цикла задержки. Чем меньше этот параметр, тем быстрее движутся шары.
На рис. 1 показаны некоторые параметры движения шаров.
В данном случае ввиду прямолинейности движения легко определить форму остающегося шлейфа. Затирка шлейфа обусловливает отсутствие мерцания на экране и последовательное наложение цветов друг на друга без установки промежуточных цветов. Во многих случаях (например, при вращении или сложном движении) форму шлейфа определить трудно. Тогда прибегают к следующим вариантам действий.
1. Минимизируют площадь элементов, изменяющих свое положение в пространстве и затираемых фоновым цветом.
2. Разбивают последовательность изображений на кадры (прямоугольные или полигональные), каждый из которых отрабатывается целиком и полностью графическими командами.
Например изобразим 3 кадра вращения треугольника внутри круга
Равномерность вращения будет зависеть от количества кадров за один оборот.
Вариант 2.
Создадим движущийся по кругу и мерцающий полигон используя перерисовку отдельной зоны экрана на которой расположен сам объект.
Для данного варианта необходимо воспользоваться сообщением wm_Timer, при отработке которого будет происходит перерисовка невсего экрана, а только той части, которая изменяется. Естественно включается программный таймер, интервал дискрет которого определяется в интервале 1..100 миллисекунд. Параллельно будет написана процедура реакции на нажатие каких-либо клавиш wmKeyDown. Для корректного выхода из программы при нажатии на Esc или применении команды close (кнопка в правом верхнем углу Windows-окна или нажатие комбинации клавиш Alt+F4) будет использована процедура wmDestroy.
Декларации включают все требуемые процедуры:
Раскроем содержание каждой из дополнительных процедур.
Данная процедура выполняется во время запуска программы (ее первичное появление обозначено словом inherited). В ней определяются переменные изображения (Rad - радиус круга вращения. Angle-начальный угол, хо,уо - координаты базовой точки, а - параметр масштабирования). Также включается программный таймер с интервалом 1 мс и идентификатором 1. Таким программных таймеров можно включить несколько (с разными интервалами и для разных зон, клипов), например:
Процедура закрытия окна программы включает остановку всех работающих программных таймеров.
Функция PostQuitMessage (0) помещает в очередь сообщение wm_Quit. Когда функция PeekMessage функции Кеург получает это сообщение из очереди, цикл обработки сообщений завершает свою работу и программа завершается с кодом TMsg.wParam (в нашем случае 0 - это успешное завершение).
Реализация процедуры для выхода из программы при нажатии
на клавишу Esc будет выглядеть так:
Инструкция closewindow позволяет отобразить курсор после закрытия окна программы. Функция кеуРг немного видоизменилась.
Оформим процедуру прорисовки звезды отдельно, используя параметры: контекст устройства, координаты базовой точки и цвет.
Оформим процедуру отработки сообщения wm_Timer. В начале временных дискрет первого таймера вычисляются координаты прямоугольника - зоны клипа, который фиксируется функцией invalidateRect. Цвет полигона изменяется в начале временных дискрет третьего и четвертого таймеров с использования генератора случайных чисел.
Сама процедура отработки сообщения wm_Paint выглядит довольно компактно, по сравнению с первым вариантом.
Вариант 3.
Создадим перемещение по экрану закрашенного круга под действием активации клавиш со стрелками используя функцию скроллинга экрана.
В процедуре wmKeyDown для захвата контекста устройства с дальнейшей дорисовкой с помощью графических функций может использоваться getdc. Далее контекст устройства может быть освобожден от использования. Скроллинг выполняется функцией scrollwindow, которая выполняется в процедуре отработки нажатия клавиш управления wmKeyDown. Аргументами функции является величина прокрутки (в данном случае 5 пикселей).
Процедура отработки сообщения wm_Paint выглядит также компактно, по сравнению с первым вариантом. Параметры b и с определяют коэффициенты сжатия по горизонтали и вертикали (если необходимо отобразить эллипс).
Приведем виртуальные коды некоторых клавиш:
vk_left - клавиша Влево <—
vk_right - клавиша Вправо —»
vk_up - клавиша Вверх Т
vk_down - клавиша Вниз I
vk_add - клавиша Серый плюс
vk_subtract - клавиша Серый минус
vk_next - клавиша PageDown
vk_prior - клавиша PageUp
vk_escape - клавиша Esc
vk_lbutton - левая кнопка мыши
vk_rbutton - правая кнопка мыши
vk_re turn - клавиша Enter
vk_shift - клавиша Shift
vk_control - клавиша Ctrl
vk_space - клавиша Пробел
vk f l,…, vk f10 - клавишиF1...F10
ЛИСТИНГ ПРОГРАМЫ
Дата добавления: 2015-11-13; просмотров: 42 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Course assessment | | | Типи хвиль та їх годографи. |