Глобальные и локальные преобразования
Глобальное преобразование — это преобразование, которое применяется к каждому элементу, рисуемого заданным объектом 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)
На следующем рисунке показаны матрицы, участвующие в преобразовании.
Заметка
В предыдущем примере эллипс поворачивается вокруг начала системы координат, которая находится в левом верхнем углу клиентской области. Это создает другой результат, чем вращение эллипса вокруг своего центра.
Локальные преобразования
Локальное преобразование применяется к конкретному изображаемому элементу. Например, объект 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, указывающую вниз, поэтому необходимо выполнить отражение по горизонтальной оси. На следующем рисунке показана матрица такого отражения.
Затем предположим, что необходимо выполнить сдвиг на 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)
На следующем рисунке показана новая система координат и два прямоугольника.
См. также
.NET Desktop feedback