- •Московский институт электронной техники
- •Аффинные преобразования на плоскости.
- •Два взгляда на аффинные преобразования.
- •Элементарные аффинные преобразования.
- •Однородные координаты.
- •Композиция элементарных аффинных преобразований.
- •Класс Matrix2d для реализации аффинных преобразований в 2d графике.
- •Пример использования аффинных преобразований для моделирования движения в 2d-графике.
- •Пример программы моделирования движения в Windows.
- •Уничтожение следа за движущимся объектом повторным рисованием объекта в Windows программах.
- •Использование режима xor для моделирования движения в Windows программах.
- •Использование видеостраниц для моделирования движения в однопользовательских операционных системах, например в dos.
- •Использование оперативной памяти для моделирования движения в Windows программах.
- •Примеры анимации в Windows программах.
- •Задание к выполнению лабораторной работы.
- •Задание к выполнению второго пункта работы.
Уничтожение следа за движущимся объектом повторным рисованием объекта в Windows программах.
В программе mov02.cppубирается шлейф, остающийся за движущимся объектом. Используется прием вторичного рисования графического объекта на старом месте цветом фона. Программа рисует движущуюся стрелку и убирает предыдущее изображение стрелки, рисую стрелку на старом месте цветом фона.
Здесь алгоритм следующий. В ответ на сообщение таймера WM_TIMERвызывается функция Move_OnTimer, в которой сначала рисуется старое изображение стрелки цветом фона, а затем в новом положении рисуется стрелка своим цветом.
//функция обрабатывает сообщение WM_TIMER
void Move_OnTimer(HWND hwnd)
{
HDC hdcWin;
hdcWin = GetDC(hwnd); //получаем контекст экрана
//рисуем фигуру цветом фона
Arrow(hdcWin,PtA,7,xA1,yA1,xA1,yA1,0,1,1,0);
//рисуем фигуру цветом объекта
Arrow(hdcWin,PtA,7,xA1,yA1,xA2,yA2,fiA,kxA,kyA,1);
xA1 = xA2; yA1 = yA2;
ReleaseDC(hwnd,hdcWin); //освобождаем контекст экрана
}
Компилируем, запускаем программу mov02.exe, и результат работы этой программы показан на Рис.16.
Рис. 16.
Результат работы программы mov02.cpp.
Анализ Рис.16 показывает недостатки указанного метода. Как видно из этого рисунка, при движении графического объекта, стираются другие объекты встречаемые движущимся объектом на своем пути.
Обычно от этого недостатка избавляются с помощью использования специального режима окрашивания пикселей на экране. Это режим задается параметром XOR_PUT- исключающее или.
Использование режима xor для моделирования движения в Windows программах.
Если установить режим отображения XOR, то начинает работать механизм ИСКЛЮЧАЮЩЕГО ИЛИ (XOR) при рисовании фигур, окрашенных одним цветом, когда они рисуются поверх фигур окрашенных другим цветом. Самое главное в этом методе, это то, что при повторном рисовании фигуры на одном и том же месте, одним и тем же цветом, изображение фигуры пропадает и восстанавливается первоначальное изображение.
Для выбора режима рисования предназначена функция SetROP2(). Приведем ее прототип.
int SetROP2(HDC hdc, int fnDrawMode);
Первый параметр hdc– это идентификатор контекста устройства, в котором необходимо установить новый режим рисования. Второй параметр fnDrawMode– это идентификатор режима рисования.
Нас будет интересовать значение второго параметра равное R2_XORPEN. В этом случае при определении цвета пикселя выполняется операция ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) между цветом подложки и цветом пера.
Функция выбора режима рисования SetROP2() вызывается перед рисованием стрелки в функцииMove_OnTimer(), которая обрабатывает сообщениеWM_TIMER, приходящее от таймера.
//функция обрабатывает сообщение WM_TIMER
void Move_OnTimer(HWND hwnd)
{
HDC hdcWin;
hdcWin = GetDC(hwnd); //получаем контекст окна на экране
//устанавливаем режим XOR
SetROP2(hdcWin,R2_XORPEN);
//рисуем фигуру в старом положении в режиме XOR
Arrow(hdcWin,PtA,7,xA1,yA1,xA1,yA1,0,1,1);
//рисуем фигуру в новом положении
Arrow(hdcWin,PtA,7,xA1,yA1,xA2,yA2,fiA,kxA,kyA);
xA1 = xA2; yA1 = yA2;
ReleaseDC(hwnd,hdcWin); //освобождаем контекст окна на экране
}
Напомним действие ИСКЛЮЧАЮЩЕГО ИЛИ (XOR) на отдельные биты числа. Для битовой операцииXORимеет место следующая таблица.
-
XOR
0
1
0
0
1
1
1
0
Пусть стрелка окрашена в красный цвет. Тогда в модели RGBэтот цвет будет представлен следующим числом.
Red = FF 00 00 = 11111111 00000000 00000000
Статический объект эллипс пусть будет окрашен в зеленый цвет. Зеленый цвет будет представлен следующим числом.
Green = 00 FF 00 = 00000000 11111111 00000000
При наложении красной стрелки на зеленый эллипс, цвет стрелки будет равен числу, полученному после применения операции XORк красному и зеленному цвету.
Red XOR Green
Проведем эту операцию детально.
11111111 00000000 00000000
XOR
00000000 11111111 00000000
--------------------------------------
11111111 11111111 00000000
Полученное число в модели RGBсоответствует желтому цвету.
Yellow = FF FF 00 = 11111111 11111111 00000000
Таким образом, в режиме XORрисуя красную стрелку на зеленом эллипсе, реально будем получать стрелку, окрашенную в желтый цвет. Далее легко проверить, что повторное рисование красной стрелки на желтой стрелке даст зеленый цвет, и зеленый эллипс будет восстановлен.
Компилируем, запускаем программу mov03.exe, и результат работы этой программы показан на Рис.17.
Рис. 17.
Результат работы программы mov03.cpp.
Анализ Рис.17 показывает особенности режима XOR. Как видно из этого рисунка, при движении графического объекта, объекты встречаемые движущимся объектом на своем пути, с одной стороны восстанавливаются. Однако с другой стороны меняется цвет самого движущегося объекта, когда он встречает другой объект на своем пути.
Если необходимо, чтобы цвет движущегося объекта оставался неизменным, то нужно использовать другие методы вывода изображения на экран монитора.