netlib.narod.ru | < Назад | Оглавление | Далее > |
Матричное преобразование инкапсулировано в классе Matrix, определенном в пространстве имен System.Drawing.Drawing2D. Объект Matrix может быть создан с помощью одного из четырех конструкторов, два из которых таковы:
Конструкторы Matrix (выборочно)
Matrix() |
Matrix(float sx, float ry, float rx, float sy, float dx, float dy) |
Второй конструктор позволяет задавать все шесть констант, определяющих матричное преобразование. Коэффициенты масштабирования sx и sy должны быть отличными от 0, иначе вы получите исключение!
У класса Graphics есть изменяемое свойство Transform, куда заносится объект Matrix:
Свойства Graphics (выборочно)
Тип | Свойство | Доступ |
Matrix | Transform | Чтение/запись |
Любой вызов методов TranslateTransform, ScaleTransform, RotateTransform и ResetTransform действует на свойство Transform. Это свойство можно установить и напрямую. Вызов:
grfx.Transform = new Matrix(1, 0, 0, 1, 0, 0);
действует, как метод ResetTransform.
У класса Matrix 5 свойств, и все неизменяемые:
Свойства Matrix
Тип | Свойство | Доступ | Описание |
float[] | Elements | Чтение | Шесть констант преобразования |
float | OffsetX | Чтение | Константа dx |
float | OffsetY | Чтение | Константа dy |
bool | IsIdentity | Чтение | Показывает, является ли матрица единичной |
bool | IsInvertible | Чтение | Показывает, обратима ли матрица |
А теперь рассмотрим пример объединенных преобразований. Пусть сначала был вызван метод
grfx.ScaleTransform(2, 2);
После этого программа может изучить результирующую матрицу, вызвав
float[] afElements = grfx.Transform.Elements;
В результате вы увидите значения 2, 0, 0, 2, 0, 0, которые можно представить матрицей
|
2 0 0 |
0 2 0 |
0 0 1 |
|
Теперь вызовем
grfx.TranslateTransform(100, 100);
Если вызвать его отдельно, этот метод даст такую матрицу:
|
1 0 100 |
0 1 100 |
0 0 1 |
|
Однако новое преобразование — это объединенный результат вызова двух методов. Матрица, определяемая вторым методом, умножается на текущее значение свойства Transform (определенное первым методом), в итоге значение этого свойства изменится:
|
× |
|
= |
|
А теперь вызовем методы ScaleTransform и TranslateTransform в обратном порядке:
grfx.TranslateTransform(100, 100); grfx.ScaleTransform(2, 2);
И в этом случае результирующее преобразование рассчитывается путем умножения второй матрицы на первую:
|
× |
|
= |
|
Это преобразование также можно получить, вызвав:
grfx.ScaleTransform(2, 2); grfx.TranslateTransform(100, 100, MatrixOrder.Append);
Аргумент MatrixOrder.Append указывает, что следует объединить новое преобразование с существующим. По умолчанию задан аргумент MatrixOrder.Prepend.
У класса Graphics есть еще один метод преобразования глобальных координат:
Методы Graphics (выборочно)
void MultiplyTransform(Matrix mat) |
void MultiplyTransform(Matrix mat, MatrixOrder mo) |
Этот метод позволяет умножить существующую матрицу на новую.
В главе 15 мы продолжим обсуждение класса Matrix.
netlib.narod.ru | < Назад | Оглавление | Далее > |