- •Московский институт электронной техники
- •Аффинные преобразования на плоскости.
- •Два взгляда на аффинные преобразования.
- •Элементарные аффинные преобразования.
- •Однородные координаты.
- •Композиция элементарных аффинных преобразований.
- •Класс Matrix2d для реализации аффинных преобразований в 2d графике.
- •Пример использования аффинных преобразований для моделирования движения в 2d-графике.
- •Пример программы моделирования движения в Windows.
- •Уничтожение следа за движущимся объектом повторным рисованием объекта в Windows программах.
- •Использование режима xor для моделирования движения в Windows программах.
- •Использование видеостраниц для моделирования движения в однопользовательских операционных системах, например в dos.
- •Использование оперативной памяти для моделирования движения в Windows программах.
- •Примеры анимации в Windows программах.
- •Задание к выполнению лабораторной работы.
- •Задание к выполнению второго пункта работы.
Пример программы моделирования движения в Windows.
Пусть код программы находится в файле mov01.cpp. Отметим особенности работы программы, написанной дляWindows, и описывающей движение графических объектов. Во-первых, для моделирования движения используется специальный математический аппарат, это аппарат аффинных преобразований.
Во-вторых, движение происходит в некотором цикле изменения координат движущейся фигуры. Наиболее просто было бы использовать, например цикл do{}while, где для задержки используется функцияdelay(). Действительно в однопользовательских операционных системах прошлого, таких какDOS, для анимации использовались простые циклы.
В Windowsпрограммах роль цикла движения выполняет цикл обработки сообщений, а для задержки используется системный таймер. Таймер создается вызовом функцииSetTimer().
UINT SetTimer(HWND hWnd, UINT nIDEvent,
UINT uElapse, TIMERPROC lpTimerFunc );
Первый параметр hWnd– это идентификатор окна, в котором создан таймер. Второй параметр nIDEvent– это идентификатор таймера. Дело в том для данного окна можно создать несколько таймеров. Третий параметрuElapse– это период следования сообщений от таймера в миллисекундах. Четвертый параметр должен быть равенNULL.
После создания таймера, таймер начинает периодически посылать в окно сообщениеWM_TIMER. Чтобы прекратить работу таймера его надо уничтожить функциейKillTimer().
BOOL KillTimer( HWND hWnd, UINT uIDEvent);
Создание и уничтожение таймера в программе mov01.cppследует следующей схеме. В начале работы программы после нажатия любой клавиши, создается таймер и начинается движение графических объектов. При следующем нажатии любой клавиши таймер уничтожается и движение приостанавливается. При очередном нажатии любой клавиши движение возобновляется вновь. Поэтому создание и уничтожение таймера происходит в функцииMove_OnKeydown().
//функция, обрабатывающая сообщение WM_KEYDOWN
void Move_OnKeydown(HWND hwnd)
{
if(MoveStop == 0)
{
KillTimer(hwnd, 1);
MoveStop = 1;
}
else
{
SetTimer(hwnd, 1, uElapse, NULL);
MoveStop = 0;
}
}
Эта функция вызывается в ответ на сообщение WM_KEYDOWN, Поэтому в функции окнаWndProc()должны быть соответствующие строчки кода.
switch(msg)
{
case WM_KEYDOWN:
Move_OnKeydown(hwnd);
break;
}
Когда таймер создан, он регулярно посылает в окно сообщение WM_TIMER. Это сообщение обрабатывается в функции окнаWndProc(), вызовом другой функцииMove_OnTimer().
switch(msg)
{
case WM_TIMER:
Move_OnTimer(hwnd);
break;
}
В-третьих, отметим особенности работы программы с контекстом окна на экране монитора. Отметим следующие моменты. Начальное расположение графических объектов рисуется в ответ на сообщение WM_PAINT, с помощью функцииMove_OnPaint(). В этой функции получение контекста и освобождение контекста производится с помощью функцийBeginPaint()и EndPaint().
Рисование движущихся объектов происходит в ответ на сообщение WM_TIMER, с помощью функцииMove_OnTimer(). В этой функции получение контекста и освобождение контекста производится с помощью другой пары функцийGetDC()и ReleaseDC().
Компилируем, запускаем программу mov01.exe, и результат работы этой программы показан на Рис.15.
Рис. 15.
Результат работы программы mov01.cpp.