Класс System.Drawing.Drawing2D.Matrix
В этой статье приводятся дополнительные замечания к справочной документации по этому API.
Класс Matrix инкапсулирует матрицу аффина 3-3, представляющую геометрическое преобразование.
В GDI+можно сохранить аффинное преобразование в объекте Matrix . Так как третий столбец матрицы, представляющей аффинное преобразование, всегда содержит значения (0, 0, 1), при создании объекта Matrix указываются только шесть чисел в первых двух столбцах. Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4)
Инструкция создает матрицу, показанную на следующем рисунке.
Примечание.
В .NET 6 и более поздних версиях пакет System.Drawing.Common, который включает этот тип, поддерживается только в операционных системах Windows. Использование этого типа в кроссплатформенных приложениях вызывает предупреждения во время компиляции и исключения во время выполнения. Дополнительные сведения см. в статье System.Drawing.Common, поддерживаемой только в Windows.
Составные преобразования
Составное преобразование — это последовательность преобразований, которые следуют друг за другом. Рассмотрим матрицы и преобразования из следующего списка:
«Матрица» | Преобразование |
---|---|
Матрица A | Повернуть на 90 градусов |
Матрица B | Масштабирование с коэффициентом 2 по оси x |
Матрица C | Сдвиг на 3 единицы по оси y |
Если начать с точки (2, 1) - представленную матрицой [2 1 1] - и умножить на A, то B, то C, точка (2, 1) будет проходить три преобразования в указанном порядке.
[2 1 1]ABC = [-2 5 1]
Вместо хранения трех частей составного преобразования в трех отдельных матрицах можно перемножить A, B и C, чтобы получить одну матрицу размера 3×3, в которой хранится все составное преобразование. Предположим ABC = D
. Затем точка, умноженная на D, дает тот же результат, что и точка, умноженная на A, а затем B, а затем C.
[2 1 1]D = [-2 5 1]
На рисунке ниже показаны матрицы A, B, C и D.
Тот факт, что матрица составного преобразования может быть получена путем перемножения матриц отдельных преобразований, означает, что любая последовательность аффинных преобразований может храниться в одном объекте Matrix.
Внимание
Важен порядок составного преобразования. Как правило, поворот, масштабирование и сдвиг не равносильны масштабированию, повороту и сдвигу. Точно так же важен порядок перемножения матриц. Как правило, ABC — это не то же самое, что BAC.
Класс Matrix предоставляет несколько методов для создания составных преобразований: Multiply, Rotate, RotateAt, Scale, Shear и Translate. В следующем примере создается матрица составного преобразования, которое сначала выполняет поворот на 30 градусов, затем масштабирование с коэффициентом 2 по оси y, а затем сдвиг на 5 единиц по оси x:
Matrix myMatrix = new Matrix();
myMatrix.Rotate(30);
myMatrix.Scale(1, 2, MatrixOrder.Append);
myMatrix.Translate(5, 0, MatrixOrder.Append);
Dim myMatrix As New Matrix()
myMatrix.Rotate(30)
myMatrix.Scale(1, 2, MatrixOrder.Append)
myMatrix.Translate(5, 0, MatrixOrder.Append)