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


Класс 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.

Матрицы 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)