netlib.narod.ru< Назад | Оглавление | Далее >

Класс Matrix

Матричное преобразование инкапсулировано в классе 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, которые можно представить матрицей

Теперь вызовем

  grfx.TranslateTransform(100, 100);

Если вызвать его отдельно, этот метод даст такую матрицу:

Однако новое преобразование — это объединенный результат вызова двух методов. Матрица, определяемая вторым методом, умножается на текущее значение свойства 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< Назад | Оглавление | Далее >

Сайт управляется системой uCoz