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


Глобальные и локальные преобразования

Глобальное преобразование — это преобразование, которое применяется к каждому элементу, рисуемому объектом Graphics. Локальное преобразование, напротив же, применяется к определенному элементу для рисования.

Глобальные преобразования

Чтобы создать глобальное преобразование, создайте объект Graphics и измените его свойство Transform. Свойство Transform является объектом Matrix, поэтому оно может содержать любую последовательность аффинных преобразований. Преобразование, хранящееся в свойстве Transform, называется преобразованием мировых координат. Класс Graphics предоставляет несколько методов для создания составных преобразований мировых координат: MultiplyTransform, RotateTransform, ScaleTransform, и TranslateTransform. В следующем примере дважды рисуется эллипс: один раз до создания преобразования мировых координат и один раз после. Преобразование сначала масштабируется на коэффициент 0,5 в направлении y, а затем преобразует 50 единиц в направлении x, после чего поворачивает на 30 градусов.

myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);
myGraphics.ScaleTransform(1, 0.5f);
myGraphics.TranslateTransform(50, 0, MatrixOrder.Append);
myGraphics.RotateTransform(30, MatrixOrder.Append);
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50)
myGraphics.ScaleTransform(1, 0.5F)
myGraphics.TranslateTransform(50, 0, MatrixOrder.Append)
myGraphics.RotateTransform(30, MatrixOrder.Append)
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50)

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

Illustration of the Scale, Translate, and Rotate matrices combining to form the global transformation.

Примечание.

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

Локальные преобразования

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

Matrix myMatrix = new Matrix();
myMatrix.Rotate(45);
myGraphicsPath.Transform(myMatrix);
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50);
myGraphics.DrawPath(myPen, myGraphicsPath);
Dim myMatrix As New Matrix()
myMatrix.Rotate(45)
myGraphicsPath.Transform(myMatrix)
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50)
myGraphics.DrawPath(myPen, myGraphicsPath)

Вы можете совмещать преобразование мировых координат с локальными преобразованиями для достижения различных результатов. Например, можно использовать преобразование мировых координат для изменения системы координат, а затем использовать локальные преобразования для поворота и масштабирования объектов, нарисованных в новой системе координат.

Предположим, что вам требуется система координат, имеющая начало в позиции 200 пикселей от левого края клиентской области и 150 пикселей от верхней части клиентской области. Кроме того, предположим, что единица измерения должна быть равна пикселю, а оси x и y — указывать вправо и вверх соответственно. В системе координат по умолчанию ось y указывает вниз, поэтому необходимо выполнить отражение по горизонтальной оси. На следующем рисунке показана матрица такого отражения.

Illustration of a matrix that reflects across the horizontal axis.

Затем предположим, что необходимо выполнить преобразование 200 единиц направо и 150 единиц вниз.

В следующем примере система координат, описанная выше, устанавливается с помощью преобразования мировых координат объекта Graphics.

Matrix myMatrix = new Matrix(1, 0, 0, -1, 0, 0);
myGraphics.Transform = myMatrix;
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append);
Dim myMatrix As New Matrix(1, 0, 0, -1, 0, 0)
myGraphics.Transform = myMatrix
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append)

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

// Create the path.
GraphicsPath myGraphicsPath = new GraphicsPath();
Rectangle myRectangle = new Rectangle(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRectangle);

// Fill the path on the new coordinate system.
// No local transformation
myGraphics.FillPath(mySolidBrush1, myGraphicsPath);

// Set the local transformation of the GraphicsPath object.
Matrix myPathMatrix = new Matrix();
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrder.Append);
myGraphicsPath.Transform(myPathMatrix);

// Fill the transformed path on the new coordinate system.
myGraphics.FillPath(mySolidBrush2, myGraphicsPath);
' Create the path.
Dim myGraphicsPath As New GraphicsPath()
Dim myRectangle As New Rectangle(0, 0, 60, 60)
myGraphicsPath.AddRectangle(myRectangle)

' Fill the path on the new coordinate system.
' No local transformation
myGraphics.FillPath(mySolidBrush1, myGraphicsPath)

' Set the local transformation of the GraphicsPath object.
Dim myPathMatrix As New Matrix()
myPathMatrix.Scale(2, 1)
myPathMatrix.Rotate(30, MatrixOrder.Append)
myGraphicsPath.Transform(myPathMatrix)

' Fill the transformed path on the new coordinate system.
myGraphics.FillPath(mySolidBrush2, myGraphicsPath)

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

Illustration of the new coordinate system and the two rectangles.

См. также