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


Матрица представления преобразований

Матрица m×n — это набор чисел, расположенных в строках и 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. Обратите внимание, что точечный продукт двух векторов является числом, а не другим вектором. Кроме того, обратите внимание, что вы можете вычислить продукт dot только в том случае, если два вектора имеют одинаковое количество компонентов.

Пусть A(i, j) будет записью в матрице A в строке ith и столбце jth. Например, A(3, 2) — это запись в матрице A в строкеrd 3 и 2nd столбце. Предположим, A, B и C являются матрицами и AB = C. Записи C вычисляются следующим образом:

C(i, j) = (строка A) • (столбец j)

На следующем рисунке показано несколько примеров умножения матрицы.

иллюстрация, показывающая, как выполнять умножение матрицы

Если вы считаете точку в плоскости матрицей 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 матрицы.

иллюстрация, показывающая, как умножение матрицы может выполнять аффинное преобразование

В предыдущем примере точка (2, 1) сопоставляется с точкой (2, 6). Обратите внимание, что третий столбец матрицы 3 × 3 содержит числа 0, 0, 1. Это всегда будет делом для 3 × 3 матрицы аффинного преобразования. Важными числами являются шесть чисел в столбцах 1 и 2. Верхняя левая часть матрицы × 2 представляет линейную часть преобразования, а первые две записи в 3-й строке представляют перевод.

иллюстрация, показывающая, что первые два столбца наиболее важны для матрицы 3x3 преобразования аффинного преобразования

В Windows GDI+ можно сохранить преобразование аффина в объекте Matrix. Так как третий столбец матрицы, представляющий преобразование аффина, всегда (0, 0, 1), при создании объекта Matrix указывается только шесть чисел в первых двух столбцах. Оператор Matrix myMatrix(0.0f, 1.0f, -1.0f, 0.0f, 3.0f, 4.0f); создает матрицу, показанную на предыдущем рисунке.

Составные преобразования

Составное преобразование — это последовательность преобразований, а затем другая. Рассмотрим матрицы и преобразования в следующем списке:

  • Матрица поворота 90 градусов
  • Матрица B Масштабирование по коэффициенту 2 в направлении x
  • Матрица C Translate 3 единицы в направлении y

Если начать с точки (2, 1) — представленную матрицой [2 1 1] — и умножить на A, то В, то точка (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 предоставляет несколько методов создания составного преобразования: Matrix::Умножение, Матрица::Поворот, Matrix::RotateAt, Matrix::Scale, Matrix::Shear, и Matrix::Translate. В следующем примере создается матрица составного преобразования, которая сначала поворачивает 30 градусов, а затем масштабируется по коэффициенту 2 в направлении y, а затем преобразует 5 единиц в направлении x.

Matrix myMatrix;
myMatrix.Rotate(30.0f);
myMatrix.Scale(1.0f, 2.0f, MatrixOrderAppend);
myMatrix.Translate(5.0f, 0.0f, MatrixOrderAppend);

На следующем рисунке показана матрица.

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