Глобальные и локальные преобразования
Обновлен: Ноябрь 2007
Глобальными преобразованиями называются преобразования, которые применяются ко всем элементам, нарисованным с помощью данного объекта Graphics. Локальным преобразованием называется преобразование, применяемое к определенному рисуемому элементу.
Глобальные преобразования
Чтобы создать глобальное преобразование, нужно создать объект Graphics и нужным образом изменить значение его свойства Transform. Значением свойства Transform является объект Matrix, который может содержать любую последовательность аффинных преобразований. Преобразование, заданное свойством Transform, называется объемным преобразование. Класс Graphics содержит несколько методов, осуществляющих составные объемные преобразования: MultiplyTransform, RotateTransform, ScaleTransform и TranslateTransform. В приведенном ниже примере дважды демонстрируется рисование эллипса: один раз перед заданием объемных преобразований и один раз после. Преобразование заключается в масштабировании вдоль оси Y с масштабным коэффициентом 0,5, после которого выполняется сдвиг на 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, позволяющий выполнять преобразования над точками, задающими контур. В приведенном ниже примере демонстрируется рисование прямоугольника без преобразования и рисование контура с применением поворота. (Предполагается, что объемные преобразования отсутствуют.)
Dim myMatrix As New Matrix()
myMatrix.Rotate(45)
myGraphicsPath.Transform(myMatrix)
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50)
myGraphics.DrawPath(myPen, myGraphicsPath)
Matrix myMatrix = 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.
Dim myMatrix As New Matrix(1, 0, 0, -1, 0, 0)
myGraphics.Transform = myMatrix
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append)
Matrix myMatrix = new Matrix(1, 0, 0, -1, 0, 0);
myGraphics.Transform = myMatrix;
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append);
Приведенный ниже код (который должен следовать сразу после кода из примера, приведенного выше) создает контур, состоящий из одного прямоугольника, нижний левый угол которого расположен в начале новой системы координат. Прямоугольник заливается один раз без применения локальных преобразований и один раз с применением локального преобразования. Локальное преобразование заключается в масштабировании по горизонтали с коэффициентом 2, после которого применяется поворот на 30 градусов.
' 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)
// 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);
На приведенном ниже рисунке изображена полученная новая система координат и два прямоугольника.