Затем следует при помощи преобразования матрицы повернуть треугольник на 90°:
Геометрические преобразования
Рис. 24.1. Вращение треугольника Теперь остается поместить треугольник в окончательное положение сдвигом"images/tmp6745-82.png">
Вычисляя следующую матрицу, можно получить преобразование, позволяющее вычислять новые координаты каждой вершины одним умножением вектора на матрицу:
(24.2)
Преобразования в пространстве Можно самостоятельно убедиться в том, что новые координаты вершин, полученные умножением исходных координат на матрицу Г, соответствуют координатам, приведенным на рис. 24.1.
Использование однородных координат кроме ускорения преобразований позволяет также упростить архитектуру графического ускорителя, построив все преобразования вершин на базе матричного умножения.
В системе Windows (начиная с версии NT) для выполнения двумерных преобразований определена структура типа XF0RM, чей синтаксис приведен ниже:
typedef struct _XF0RM { FLOAT eMll: FLOAT eM12: FLOAT eM21; FLOAT eM22; FLOAT eDx; FLOAT eDy; } XFORM
Эта структура задает коэффициенты вращения и масштабирования еМ^ и сдвига eDx, eDy матрицы геометрических преобразований. Если задать еМ22 = cos (Al pha), а еМ21 = -еМ12 = si n( Al pha), то любой выводимый примитив сначала будет повернут на угол Al pha, а уже потом запишется в видеопамять.
Чтобы осуществлять преобразование примитивов, необходимо выполнить последовательность действий, приведенную в следующем списке: О Задать матрицу, например XFORM Xform = {1.0.0.1.50.0}.
О Установить режим SetGraphi csMode(hdc. GM_ADVANCED). Если передать функции параметр GM_COMPATIBLE, то вращение не будет осуществляться. Если же передать значение GM_ADVANCED, то будет включена поддержка преобразований, задаваемых функциями SetWorl dTransform() и Modi fyWorl dTransform().
О Занести матрицу в контекст устройства при помощи функции SetWorldTrans-form(hdc, &Xform). При ошибке выполнения функция вернет нулевое значение. Если по сигналам таймера необходимо перемещать или вращать изображение, то следует воспользоваться функцией Modi fyWorl dTransform(hdc, &Xform, i Mode). Она использует параметр Xform для изменения той матрицы, которая уже находится в контексте. Если параметр i Mode имеет значение MWT_IDENTITY, то функция просто заносит в контекст единичную матрицу. Значение MWT_LEFTMULTIPLY приведет к умножению матриц, причем в этой операции новая матрица будет расположена слева. Значение MWT_RIGHTMULTIPLY тоже предназначено для перемножения матриц, но в этом случае новая матрица будет располагаться справа.