Матрица представления преобразований
Матрица m×n — это набор чисел, расположенных в строках m и n столбцах. На следующем рисунке показано несколько матриц.
Можно добавить две матрицы одного размера, добавив отдельные элементы. На следующем рисунке показаны два примера добавления матрицы.
Матрица m×n может быть умножена на матрицу n×p, а результатом является матрица m×p. Число столбцов в первой матрице должно совпадать с числом строк во второй матрице. Например, матрица 4×2 может быть умножена на матрицу 2×3 для создания матрицы 4×3.
Точки в плоскости и строках и столбцах матрицы можно рассматривать как векторы. Например, (2, 5) является вектором с двумя компонентами, и (3, 7, 1) является вектором с тремя компонентами. Точечный продукт двух векторов определяется следующим образом:
(a, b) • (c, d) = ac + bd
(a, b, c) • (d, e, f) = ad + be + cf
Например, точечный продукт (2, 3) и (5, 4) равен (2)(5) + (3)(4) = 22. Точечный продукт (2, 5, 1) и (4, 3, 1) равен (2)(4) + (5)(3) + (1)(1) = 24. Обратите внимание, что точечный продукт двух векторов является числом, а не другим вектором. Следует также отметить, что вы можете вычислить скалярное произведение только в том случае, если два вектора имеют одинаковое количество компонентов.
Пусть A(i, j) будет записью в матрице A в строке ith и столбце jth. Например, A(3, 2) — это запись в матрице A в 3-й строке и 2-м столбце. Предположим, A, B и C являются матрицами и AB = C. Записи C вычисляются следующим образом:
C(i, j) = (строка i матрицы A) • (столбец j матрицы B)
На следующем рисунке показано несколько примеров умножения матрицы.
Если вы считаете точку в плоскости матрицей 1×2, можно преобразовать эту точку, умножив ее на матрицу 2×2. На следующем рисунке показано несколько преобразований, примененных к точке (2, 1).
Все преобразования, показанные на предыдущем рисунке, являются линейными преобразованиями. Некоторые другие преобразования, такие как перевод, не являются линейными и не могут быть выражены как умножение на матрицу 2×2. Предположим, вы хотите начать с точки (2, 1), повернуть его на 90 градусов, перевести его 3 единицы в направлении x и перевести его 4 единицы в направлении y. Это можно сделать с помощью умножения матрицы, за которым следует добавление матрицы.
Линейное преобразование (умножение на матрицу 2×2), за которым следует перевод (добавление матрицы 1×2) называется преобразованием аффина. Альтернатива хранению аффинного преобразования в паре матриц (одна для линейной части и одна для перевода) заключается в сохранении всего преобразования в матрице 3×3. Чтобы сделать эту работу, точка в плоскости должна храниться в матрице 1×3 с фиктивной 3-й координатой. Обычная техника заключается в том, чтобы сделать все 3-е координаты равными 1. Например, точка (2, 1) представлена матрицей [2 1 1]. На следующем рисунке показано аффинное преобразование (поворот 90 градусов; преобразование 3 единиц в направлении x, 4 единицы в направлении y), выраженное как умножение на одну матрицу 3×3.
В предыдущем примере точка (2, 1) сопоставляется с точкой (2, 6). Обратите внимание, что третий столбец матрицы 3×3 содержит числа 0, 0, 1. Это всегда будет случаем для 3×3 матрицы аффинного преобразования. Важными числами являются шесть чисел в столбцах 1 и 2. Верхняя левая часть матрицы 2×2 представляет линейную часть преобразования, а первые две записи в 3-й строке представляют перевод.
В GDI+ можно сохранить преобразование аффина в объекте Matrix. Так как третий столбец матрицы, представляющий преобразование аффина, всегда равен (0, 0, 1), при создании объекта Matrix указывается только шесть чисел в первых двух столбцах. Утверждение Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4)
создает матрицу, показанную на предыдущем рисунке.
Составные преобразования
Составное преобразование — это последовательность преобразований, выполняемых одно за другим. Рассмотрим матрицы и преобразования в следующем списке:
Матрица | Преобразование |
---|---|
Матрица 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)
На следующем рисунке показана матрица.
См. также
.NET Desktop feedback