Поделиться через


Общие сведения о классах Transform

В этом разделе рассматриваются основы преобразований Direct2D и приведены примеры различных преобразований. Он содержит следующие части:

Что такое преобразование Direct2D?

Преобразование указывает, как сопоставлять точки объекта из одного координатного пространства в другое или из одной позиции в другую в пределах одного координатного пространства. Это сопоставление описывается матрицей преобразования, определяемой как коллекция из трех строк с тремя столбцами значений FLOAT, как показано в следующей таблице.

     
M11Default: 1.0 M12Default: 0.0 0,0
M21Default: 0.0 M22Default: 1.0 0,0
M31OffsetX: 0.0 M32OffsetY: 0,0 1,0

 

В этой матрице члены M11, M12, M21 и M22 определяют линейное преобразование, которое может масштабировать, поворачивать или исказить объект; Члены OffsetX и OffsetY определяют преобразование, которое будет применяться после выполнения линейного преобразования. Для аффинных преобразований значения в третьем столбце всегда имеют значение 0,0, 0,0 и 1,0.

Так как Direct2D поддерживает только аффинные (линейные) преобразования, его матрица преобразования определяется как матрица 3 на 2, пропуская третий столбец из предыдущей матрицы преобразования. В следующей таблице показан макет матрицы преобразования Direct2D.

   
M11Default: 1.0 M12Default: 0.0
M21Default: 0.0 M22Default: 1.0
M31OffsetX: 0.0 M32OffsetY: 0,0

 

В Direct2D эта матрица 3 на 2 представлена структурой D2D1_MATRIX_3X2 . Чтобы упростить распространенные матричные операции, Direct2D также предоставляет класс Matrix3x2F, производный от структуры D2D1_MATRIX_3X2 .

Конструктор по умолчанию для Matrix3x2F оставляет объект неинициализированным. Чтобы получить матрицу удостоверений, используйте Matrix3x2F::Identity.

Когда к объекту применяется преобразование идентификатора, оно не изменяет положение, форму или размер объекта. Это похоже на то, что умножение числа на 1 не изменяет число. Другими словами, преобразование идентификатора оставляет координаты точек в покое и не перемещает точки на новое положение. Любое преобразование, отличное от преобразования идентификатора, изменит положение, фигуру и (или) размер объектов.

Преобразования связаны с координатами, и понимание координатного пространства Direct2D важно для понимания использования преобразований.

Координатное пространство Direct2D

Direct2D использует левостороннюю координатную область; то есть положительные значения оси X увеличиваются вправо, а положительные значения оси Y — вниз. Все элементы на экране расположены относительно источника, то есть точки пересечения оси X и Y (0, 0), как показано на следующем рисунке. Целевые объекты отрисовки Direct2D используют это пространство координат.

Иллюстрация оси X и Y левосторонней координатной области

Управляя значениями в матрице преобразования, можно повернуть, масштабировать, исказить и перемещать (переводить) объект. Например, если параметр OffsetX имеет значение 100, а OffsetY — 200, объект перемещается вправо на 100 пикселей и вниз на 200 пикселей.

Чтобы показать эффект перемещения объекта, необходимо применить преобразование преобразования для отрисовки целевых объектов, кистей или геометрических объектов. Применение преобразования для целевых объектов отрисовки влияет на весь экран, а применение преобразования к кисти или геометрии влияет только на конкретную кисть или геометрию. Чтобы создать матрицу преобразования, используйте класс Matrix3x2F .

Создание матриц преобразования

Для создания преобразований поворота, масштабирования, неравномерного распределения и преобразования класс Matrix3x2F предоставляет статические методы, показанные в следующей таблице. В столбце Пример таблицы содержатся ссылки на практические руководства, демонстрирующие использование каждого метода преобразования.

Метод Описание Пример Иллюстрация
matrix3x2f::rotate создает преобразование поворота, которое имеет указанный угол и центральную точку. как повернуть объект изображение квадрата, повернутого на 45 градусов по часовой стрелке относительно центра исходного квадрата
matrix3x2f::scale создает преобразование масштабирования, которое имеет указанные коэффициенты масштабирования и центральную точку. масштабирование объекта иллюстрация квадрата с масштабом 130 %
matrix3x2f::неравномерное распределение создает преобразование неравномерного распределения, которое имеет указанные значения оси X и Y, а также центральную точку. сведения о неравномерном распределении объекта Иллюстрация квадратного наклона на 30 градусов против часовой стрелки от оси Y
matrix3x2f::translation создает преобразование преобразования и задает смещения в направлении оси X и оси Y. преобразование объекта Иллюстрация квадрата, перемещенного на 20 единиц вдоль положительной оси X и 10 единиц вдоль положительной оси Y

 

Преобразование целевых целей отрисовки

Целевой объект отрисовки — это ресурс, который наследуется от интерфейса ID2D1RenderTarget . Он создает ресурсы для рисования и выполняет фактические операции рисования. Он также предоставляет методы для преобразования координатного пространства. Чтобы применить указанное преобразование к целевому объекту отрисовки, можно вызвать метод ID2D1RenderTarget::SetTransform . Все последующие операции рисования происходят в преобразованном пространстве.

Для отрисовки содержимого используйте методы рисования целевого объекта отрисовки. Прежде чем приступить к рисованию, вызовите метод BeginDraw . Чтобы завершить отрисовку содержимого, вызовите метод EndDraw . Пример см. в разделе Применение нескольких преобразований к объекту .

Преобразования кистей

Вы можете настроить преобразование на кисти, вызвав SetTransform. Для этого преобразования кисть можно рассматривать как большой лист бумаги, а различные примитивы отрисовки (текст, геометрию, прямоугольник и т. д.) — как наборы элементов. Когда вы настраиваете преобразование кисти, это как если бы вы скользили большой лист бумаги под трафаретом, не меняя положение самого трафарета. Вы можете использовать этот метод, чтобы заставить текст исчезать от желтого к черному в трехмерном пространстве.

Когда преобразование кисти является преобразованием идентификаторов, кисти отображаются в том же пространстве координат, что и целевой объект отрисовки, в котором они нарисованы. Преобразование кисти позволяет вызывающей объекту изменять, как координаты кисти сопоставляются с этим пространством.

Пространство кисти задается в Direct2D иначе, чем в Windows Presentation Foundation (WPF). В Direct2D пространство кисти не относительно отрисовываемого объекта, а является текущей системой координат целевого объекта отрисовки, преобразованного преобразованием кисти, если таковое имеется. Чтобы кисть заполнила объект, как это было сделано в WPF, необходимо преобразовать исходное пространство кисти в левый верхний угол ограничивающего прямоугольника объекта, а затем масштабировать пространство кисти таким образом, чтобы базовая плитка заполняла ограничивающий прямоугольник объекта.

Дополнительные сведения о преобразованиях кистей см. в разделе Общие сведения о кисти Direct2D.

Преобразования геометрии

При масштабировании, перемещении, преобразовании или перемещении геометрических объектов можно напрямую применить преобразование к определенной геометрии, а не к целевому преобразованию отрисовки, которое повлияет на весь экран. Преобразование целевого объекта отрисовки обычно влияет на росчерк и заливку геометрии. В отличие от этого, преобразование геометрии влияет только на заливку геометрии, так как преобразование применяется к геометрии перед обводкой.

Примечание

Начиная с Windows 8, преобразование мира не влияет на росчерк, если для типа штриха задано значение D2D1_STROKE_TRANSFORM_TYPE_FIXED или D2D1_STROKE_TRANSFORM_TYPE_HAIRLINE.

 

Вы можете настроить преобразование в геометрии, вызвав ID2D1Factory::CreateTransformedGeometry , чтобы создать объект ID2D1TransformedGeometry . Дополнительные сведения о преобразованиях геометрии см. в статье Общие сведения о геометрии Direct2D.

Влияние преобразования целевого объекта отрисовки на клипы

Преобразование в целевом объекте отрисовки влияет на вычисление ограничивающего прямоугольника выровненного по оси клипа. При вызове PushAxisAlignedClip параметр clipRect преобразуется текущим преобразованием мира, заданным в целевом объекте отрисовки. После применения преобразования к clipRect вычисляется выровненный по оси ограничивающий прямоугольник для clipRect . Для повышения эффективности содержимое обрезается в этот выровненный по оси ограничивающий прямоугольник, а не к исходному объекту clipRect , который передается. На следующих схемах показано, как преобразование поворота применяется к целевому объекту отрисовки, результирующему объекту clipRect и выравниваемой по оси ограничивающей рамке.

  1. Предположим, что прямоугольник на следующем рисунке является целевым объектом отрисовки, выровненным по пикселям экрана.

    иллюстрация прямоугольника (целевой объект отрисовки)

  2. Примените преобразование поворота к целевому объекту отрисовки. На следующем рисунке черный прямоугольник представляет исходный целевой объект отрисовки, а красный пунктирный прямоугольник представляет преобразованный целевой объект отрисовки.

    иллюстрация исходного прямоугольника и повернутого прямоугольника (преобразованный целевой объект отрисовки)

  3. После вызова PushAxisAlignedClip к clipRect применяется преобразование поворота. На следующем рисунке синий прямоугольник представляет преобразованный clipRect.

    иллюстрация меньшего синего прямоугольника (вырезания) внутри повернутого прямоугольника (преобразованный целевой объект отрисовки)

  4. Вычисляется ограничивающий прямоугольник, выровненный по оси. На следующем рисунке зеленый пунктирный прямоугольник представляет ограничивающий прямоугольник. Все содержимое обрезается в ограничивающий прямоугольник, выровненный по оси.

    Изображение зеленого ограничивающего прямоугольника на маленьком синем прямоугольнике (вырезка)

Сводка

Direct2D упрощает преобразование двумерных объектов с упрощенными пространствами координат и связанными классами. Используя различные типы преобразований, можно преобразовывать, поворачивать, наклонять и масштабировать объекты для достижения множества впечатляющих визуальных эффектов.

Справочник по Direct2D