logo search
CSharp_Graphics

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

Матрица m×n — это набор чисел, распределенных по m строкам и по n столбцам. На приведенном ниже рисунке изображены различные матрицы.

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

Матрицу размера m×n можно умножить на матрицу размера n×p, в результате чего получится матрица размера m×p. Число столбцов в первой из перемножаемых матриц должно совпадать с числом строк во второй из перемножаемых матриц. Например, матрицу размером 4×2 можно умножить на матрицу размером 2×3, в результате чего получится матрица размером 4×3.

Points in the plane and rows and columns of a matrix can be thought of as vectors. For example, (2, 5) is a vector with two components, and (3, 7, 1) is a vector with three components. The dot product of two vectors is defined as follows:

(a, b) • (c, d) = ac + bd

(a, b, c) • (d, e, f) = ad + be + cf

For example, the dot product of (2, 3) and (5, 4) is (2)(5) + (3)(4) = 22. The dot product of (2, 5, 1) and (4, 3, 1) is (2)(4) + (5)(3) + (1)(1) = 24. Note that the dot product of two vectors is a number, not another vector. Also note that you can calculate the dot product only if the two vectors have the same number of components.

Let A(i, j) be the entry in matrix A in the ith row and the jth column. For example A(3, 2) is the entry in matrix A in the 3rd row and the 2nd column. Suppose A, B, and C are matrices, and AB = C. The entries of C are calculated as follows:

C(i, j) = (row i of A) • (column j of B)

The following illustration shows several examples of matrix multiplication.

Точки на плоскости, а также строки и столбцы матрицы можно рассматривать как векторы. Например, (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, расположенному на пересечении i-ой строки и j-го столбца. Например, запись A(3, 2) обозначает элемент матрицы A, расположенный на пересечении 3-ей строки и 2-го столбца. Предположим, что A, B и C — это матрицы, причем AB = C. Элементы матрицы C вычисляются следующим образом:

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

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

----------------

If you think of a point in a plane as a 1×2 matrix, you can transform that point by multiplying it by a 2×2 matrix. The following illustration shows several transformations applied to the point (2, 1).

All of the transformations shown in the preceding figure are linear transformations. Certain other transformations, such as translation, are not linear, and cannot be expressed as multiplication by a 2×2 matrix. Suppose you want to start with the point (2, 1), rotate it 90 degrees, translate it 3 units in the x direction, and translate it 4 units in the y direction. You can accomplish this by using a matrix multiplication followed by a matrix addition.

Если рассматривать точки на плоскости в качестве матриц размером 1×2, эти точки можно подвергать преобразованиям, умножая их матрицы на матрицу размером 2×2. На приведенном ниже рисунке изображены результаты применения различных преобразований к точке с координатами (2, 1).

Все преобразования, показанные на приведенном ранее рисунке, являются линейными преобразованиями. Некоторые другие преобразования, такие как сдвиг, не являются линейными и не могут быть осуществлены путем умножения на матрицу размером 2×2. Предположим, что нужно взять точку с координатами (2, 1), повернуть ее на 90 градусов относительно начала координат, сдвинуть на 3 единицы вдоль оси X и на 4 единицы вдоль оси Y. Такое преобразование можно выполнить путем выполнения умножения и сложения матриц.

A linear transformation (multiplication by a 2×2 matrix) followed by a translation (addition of a 1×2 matrix) is called an affine transformation. An alternative to storing an affine transformation in a pair of matrices (one for the linear part and one for the translation) is to store the entire transformation in a 3×3 matrix. To make this work, a point in the plane must be stored in a 1×3 matrix with a dummy 3rd coordinate. The usual technique is to make all 3rd coordinates equal to 1. For example, the point (2, 1) is represented by the matrix [2 1 1]. The following illustration shows an affine transformation (rotate 90 degrees; translate 3 units in the x direction, 4 units in the y direction) expressed as multiplication by a single 3×3 matrix.

In the preceding example, the point (2, 1) is mapped to the point (2, 6). Note that the third column of the 3×3 matrix contains the numbers 0, 0, 1. This will always be the case for the 3×3 matrix of an affine transformation. The important numbers are the six numbers in columns 1 and 2. The upper-left 2×2 portion of the matrix represents the linear part of the transformation, and the first two entries in the 3rd row represent the translation.

Линейное преобразование (умножение на матрицу размером 2×2) и сдвиг (прибавление матрицы размером 1×2), вместе называются аффинным преобразованием. Альтернативой заданию аффинного преобразования через пару матриц (одна для линейного преобразования и одна для сдвига) является запись всего преобразования в виде одной матрицы размером 3×3. Чтобы можно было использовать такие матрицы преобразований, точки плоскости нужно хранить в виде матриц размером 1×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, задающих аффинные преобразования. Смысловую нагрузку несут только шесть чисел в первом и втором столбцах матрицы преобразования. Верхняя левая часть матрицы размером 2×2 задает линейную часть преобразования, а первые два числа в третьей строке матрицы задают сдвиг.

In GDI+ you can store an affine transformation in a Matrix object. Because the third column of a matrix that represents an affine transformation is always (0, 0, 1), you specify only the six numbers in the first two columns when you construct a Matrix object. The statement Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4) constructs the matrix shown in the preceding figure.

Composite Transformations

A composite transformation is a sequence of transformations, one followed by the other. Consider the matrices and transformations in the following list:

Matrix A

Rotate 90 degrees

Matrix B

Scale by a factor of 2 in the x direction

Matrix C

Translate 3 units in the y direction

If we start with the point (2, 1) — represented by the matrix [2 1 1] — and multiply by A, then B, then C, the point (2, 1) will undergo the three transformations in the order listed.

[2 1 1]ABC = [-2 5 1]

Rather than store the three parts of the composite transformation in three separate matrices, you can multiply A, B, and C together to get a single 3×3 matrix that stores the entire composite transformation. Suppose ABC = D. Then a point multiplied by D gives the same result as a point multiplied by A, then B, then C.

[2 1 1]D = [-2 5 1]

The following illustration shows the matrices A, B, C, and D.

Интерфейс GDI+ позволяет хранить аффинные преобразования в объекте Matrix. Так как третий столбец матрицы, задающей аффинное преобразование, всегда равен (0, 0, 1), при создании объекта Matrix нужно задавать только шесть чисел в первых двух столбцах. Инструкция Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4) создает матрицу, изображенную на приведенном выше рисунке.