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

Преобразования контуров

В классе GraphicsPath есть несколько методов, позволяющих программе модифицировать контур. Первый из них может легко запутать программиста (по крайней мере со мной так и было, когда я столкнулся с этим методом впервые).


Метод Transform класса GraphicsPath



void Transform(Matrix matrix)


Как сказано в главе 7, у класса Graphics есть свойство Transform типа Matrix. Свойство Transform объекта Graphics влияет на всю графику, которая будет выводиться после его определения.

Но Transform из класса GraphicsPath — это совсем другое дело. В классе GraphicsPath это не свойство объекта GraphicsPath, а метод, и это очень важно. Свойство — это, как правило, характеристика объекта, а метод обычно выполняет какое-либо действие. Иначе говоря, свойство можно сравнить с прилагательным, а метод — с глаголом.

Метод Transform из класса GraphicsPath изменяет координаты контура, применяя к ним заданное преобразование, эффект которого становится постоянным. Метод Transform не влияет на координаты точек, добавленных к контуру после вызова этого метода. Кроме того, объект GraphicsPath не сохраняет сведений о преобразовании. Так, если задан объект matrix типа Matrix, описывающий удвоение координат всех точек, то при вызове:

  grfx.Transform(matrix);

результат будет тот же, что при рисовании контура на основе массива модифицированных точек, полученного путем удвоения координат точек из массива PathPoints.

Transform — единственный метод в классе GraphicsPath, имеющий отношение к матричным преобразованиям. Чтобы задействовать его, надо воспользоваться классом Matrix, определяемым в пространстве имен System.Drawing.Drawing2D. С этим классом мы встречались в конце главы 7. Проще всего применить класс Matrix, создав сначала единичную матрицу конструктором по умолчанию:

  Matrix matrix = new Matrtx();

Затем это преобразование можно изменить, используя различные методы класса Matrix. Translate — это практически полная копия метода TranslateTransform класса Graphics. (He удивительно, если на самом деле метод TranslateTransform объекта Graphics реализован просто вызовом соответствующего метода Translate свойства Transform этого объекта.)


Методы Translate класса Matrix



void Translate(float dx, float dy)
void Translate(float dx, float dy, MatrixOrder mo)


Перечисление MatrixOrder состоит из двух членов: Append и Prepend.

Метод Scale очень похож на метод ScaleTransform из класса Graphics:


Методы Scale класса Matrix



void Scale(float sx, float sy)
void Scale(float sx, float sy, MatrixOrder mo)


Выше я привел пример с удвоением координат точек контура. То же позволяет сделать код:

  Matrix matrix = new Matrix();
  matrix.Scale(2, 2);
  path.Transform(matrix);

В класс Matrix также входит метод Rotate:


Методы Rotate класса Matrix



void Rotate(float fAngle)
void Rotate(float fAngle, MatrixOrder mo)


Можно изменить программу Flower, чтобы вместо метода RotateTransform из класса Graphics она использовала метод Rotate из класса Matrix. В этом случае после создания контура следует создать объект Matrix, описывающий поворот на 45°:

  Matrix matrix = new Matrix();
  matrix.Rotate(45);

Далее вместо RotateTransform цикл for будет вызывать метод Transform контура:

  path.Transform(matrix);

В исходной версии программы Flower координаты контура не изменяются, a метод RotateTransform меняет способ преобразования координат во время визуализации контура при помощи объекта Graphics. Модифицированная же версия программы выполняет поворот, изменяя значения координат, хранящиеся в контуре. К завершению цикла for (после восьми поворотов на 45°) восстанавливаются исходные значения координат контура.

Вот интересные методы класса Matrix, у которых нет двойников в классе Graphics:


Методы RotateAt класса Matrix



void RotateAt(float fAngle, PointF ptf)
void RotateAt(float fAngle, PointF ptf, MatrixOrder mo)


Обычно матричное преобразование вращает изображение вокруг точки с координатами (0, 0). Этот метод позволяет указать точку, вокруг которой осуществляется поворот. Пусть создается контур

  GraphicsPath path = new GraphicsPath();
  path.AddRectangle(new Rectangle(0, 0, 100, 100));

с точками (0, 0), (100, 0), (100, 100) и (0, 100). Если после этого создать объект Matrix, вызвать метод Rotate для поворота на 45° и применить к контуру преобразование:

  Matrix matrix = new Matrix();
  matrix.Rotate(45);
  path.Transform(matrix);

координаты контура примут значения (округленно) (0, 0), (70.7, 70.7), (0, 141.4) и (–70, 70). Если вместо этого вызвать метод RotateAt, задающий вращение вокруг центра прямоугольника:

  Matrix matrix = new Matrix();
  matrix.RotateAt(45, new Point(50, 50));
  path.Transform(matrix);

координаты точек контура примут значения (50, –20.7), (120.7, 50), (50, 120.7) и (–20.7, 50).

В классе Matrix тоже есть методы, выполняющие сдвиг:


Методы Shear класса Matrix



void Shear(float xShear, float yShear)
void Shear(float xShear, float yShear, MatrixOrder mo)


Результат применения этого метода к преобразованию по умолчанию можно описать формулами:


x' = x + xShear · y

y' = yShear · x + y



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

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