При вращении точки объекта вращаются вокруг начала отсчета.
Сдвиг — это преобразование прямоугольников в параллелограммы. Сдвиг добавляет смещение к горизонтальной координате точки, пропорциональное вертикальной координате, и наоборот. Это преобразование можно выразить следующими формулами:
Отражение отображает объект относительно горизонтальной или вертикальной оси.
Все эти преобразования можно выразить в матричной форме, используя матрицы размером 3х3. Тогда матричная форма трансляции запишется так:
Хотя любое линейное преобразование можно выразить в форме последовательности пяти перечисленных основных преобразований, обобщенное линейное преобразование может не быть просто трансляцией, масштабированием, вращением, сдвигом или отражением. Обобщенное линейное преобразование выражается следующей матричной формулой:
Именно этот тип матриц приложение может передать функции SetWorldTransform. Вторым параметром этой функции является указатель на структуру XFORM, определенную следующим образом:
typedet struct _XFORM (
FLOAT eM11 ;
FLOAT eM12 ;
FLOAT eM21;
FLOAT eM22;
FLOAT eDx;
FLOAT eDy ;
} XFORM;
Перед тем, как начинать вручную перемножать матрицы, ознакомьтесь с функцией CombineTransform. Действие этой функции как раз заключается в перемножении двух матриц преобразования, выраженных в форме структуры XFORM.
Поскольку преобразование пространств устанавливается для контекста устройства, оно преобразует логические координаты из мирового пространства в пространство страницы. Координаты пространства страницы являются объектом дальнейшего преобразования, определенного режимом отображения, как описано ранее.
В листинге 1 приведена небольшая функция, создающая соответствующее обратное преобразование. Если обратного преобразования не существует, функция возвращает то же преобразование, а ее значение устанавливается в FALSE, указывая на ошибку. Следуя традиции, принятой в других связанных с XFORM функциях, InvertTramsform принимает такие же указатели на входную и выходную структуру XFORM.
Листинг 11.1. Обращение преобразования пространств._______________
BOOLInvertTransform(LPXFORMIpxformResult, CONSTXFORM *lpxform)
{XFORM xformTmp;
FLOAT D;
D = lpxform->eMll*lpxform->eM22 - lpxtorm->eM12*lpxform->eM21;
if (D == 0.0) {
lpxformResult->eM11 = 1.0;
lpxformResult->eM12 = 0.0;
lpxformResult->eM21 = 0.0;
lpxformResult->eM22 = 1.0;
lpxformResult->eDx = 0.0;
lpxformResult->eDy = 0.0;
return FALSE ;
} xfonnTmp. eMIl = lpxfonn->eM22 / D;
xformTmp->eM12 = -lpxform->eM12 / D;
xformTmp->eM21 = -lpxform->eM21 / D;
xformTmp->eM22 = lpxform->eMll / D;
xformTmp->eDx = (lpxtorm->eM21*lpxform->eDy -lpxform->eM22*lpxform->eDx) / D;
xformTmp->eDy = (lpxform->eM12*lpxform->eDx - lpxform->eM11*lpxform->eDy) / D;
*lpxformResult =xformTmp;
returnTRUE;
}
И последнее замечание: функция SetWorldTransform не даст никаких результатов, если сначала не будет установлен графический режим контекста устройства в GM_ADVASNCED с помощью функции SetGraphicMode. Для того, чтобы установить графический режим обратно в GM_COMPATIBLE, приложение должно установить матрицу преобразования мировых координат в тождественную матрицу.
Объекты рисования
Преобразование координат определяет расположение объектов на устройстве вывода, в котором они будут выводиться, а их внешний вид определяется с помощью объектов GDI.
GDI поддерживает множество объектов рисования: перья, кисти, шрифты, палитры и растровые изображения. Приложения, использующие эти объекты, должны выполнить следующее:
1. Создать объект GDI.
2. Выбрать объект GDI в контекст устройства.
3. Вызвать функцию вывода GDI.
4. Выбрать объект вне контекста устройства.
5. Разрушить объект.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.