Преобразование хранится в виде матрицы 3х3, и трудно сказать, интуитивно, что каждый из компонентов матрицы делает. Вот почему вам предоставляется набор функций для работы, которые вы можете объединить. Например, если вы хотите, чтобы повернуть изображение на 90 градусов по часовой стрелке, а затем сделать его в два раза больше, вы можете использовать
Matrix myMatrix = new Matrix();
myMatrix.Rotate(90);
myMatrix.Scale(2, 2, MatrixOrder.Append);
MatrixOrder.Append
указывает на то, что масштабирование должно быть сделано после того, как предыдущие преобразования (порядок здесь важно).
Основные функции, которые вы хотите использовать, являются:
RotateAt(Single a, Point o)
поворачивает изображение по часовой стрелке вокруг точки
Scale(Single a, Single b)
масштабирует изображение в X и Y осей - в основном, (х, у) становится (ax, by)
Translate(Single a, Single b)
преобразует изображение по осям X и Y - в основном, (x, y) становится (a + x, b + y).
Чтобы перевернуть изображение по вертикали, вам просто нужен Scale(-1, 1)
. Каждая точка (x, y) будет преобразована в (-x, y). Если вам нужно перевернуть изображение вокруг другой вертикальной оси, чем ось y = 0, вам необходимо объединить его с Translate
.
Отметим, что математически говоря, любое аффинное преобразование можно разложить в произведение матриц трансляции, вращения и масштабирования. API, который вы используете, также предоставляет несколько дополнительных функций, таких как Shear
, если вы не хотите проходить вычисления.
Here - более подробное объяснение. Он включает в себя некоторый код в конце.