Глобальные и локальные преобразования
Глобальное преобразование — это преобразование, которое применяется к каждому элементу, нарисованном заданным объектом графических. Чтобы создать глобальное преобразование, создайте объект графики и вызовите метод Graphics::SetTransform. Метод Graphics::SetTransform управляет объектом Matrix, связанным с объектом Graphics. Преобразование, хранящееся в этом объекте матрицы, называется преобразования мира. Преобразование мира может быть простым аффинным преобразованием или сложной последовательностью аффинных преобразований, но независимо от ее сложности, преобразование мира хранится в одном объекте Matrix.
Классграфикипредоставляет несколько методов для создания составного преобразования мира: графики::MultiplyTransform, графики::Поворота, графики::ScaleTransformи графики::TranslateTransform. В следующем примере дважды рисуется многоточие: один раз перед созданием преобразования мира и один раз после. Преобразование сначала масштабируется на коэффициент 0,5 в направлении y, а затем преобразует 50 единиц в направлении x, а затем поворачивает 30 градусов.
myGraphics.DrawEllipse(&myPen, 0, 0, 100, 50);
myGraphics.ScaleTransform(1.0f, 0.5f);
myGraphics.TranslateTransform(50.0f, 0.0f, MatrixOrderAppend);
myGraphics.RotateTransform(30.0f, MatrixOrderAppend);
myGraphics.DrawEllipse(&myPen, 0, 0, 100, 50);
На следующем рисунке показан исходный многоточие и преобразованный многоточие.
Заметка
В предыдущем примере многоточие поворачивается о происхождении системы координат, которая находится в левом верхнем углу клиентской области. Это создает другой результат, чем поворот многоточия о своем собственном центре.
Локальное преобразование — это преобразование, которое применяется к конкретному элементу для рисования. Например, объект GraphicsPath имеет метод GraphicsPath::Transform, позволяющий преобразовать точки данных этого пути. В следующем примере рисуется прямоугольник без преобразования и пути с преобразованием поворота. (Предположим, что нет преобразования мира.)
Matrix myMatrix;
myMatrix.Rotate(45.0f);
myGraphicsPath.Transform(&myMatrix);
myGraphics.DrawRectangle(&myPen, 10, 10, 100, 50);
myGraphics.DrawPath(&myPen, &myGraphicsPath);
Вы можете объединить преобразование мира с локальными преобразованиями для достижения различных результатов. Например, можно использовать преобразование мира для изменения системы координат и использования локальных преобразований для поворота и масштабирования объектов, нарисованных в новой системе координат.
Предположим, требуется система координат, которая имеет свой источник 200 пикселей с левого края клиентской области и 150 пикселей из верхней части клиентской области. Кроме того, предположим, что вы хотите, чтобы единица измерения была пикселем, а ось x указывает справа и ось Y, указывающую вверх. Система координат по умолчанию имеет ось Y, указывающую вниз, поэтому необходимо выполнить отражение по горизонтальной оси. На следующем рисунке показана матрица такого отражения.
Затем предположим, что необходимо выполнить перевод 200 единиц справа и 150 единиц вниз.
В следующем примере устанавливается только что описанная система координат путем задания преобразования мира объекта графики.
Matrix myMatrix(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
myGraphics.SetTransform(&myMatrix);
myGraphics.TranslateTransform(200.0f, 150.0f, MatrixOrderAppend);
Следующий код (помещенный после кода в предыдущем примере) создает путь, состоящий из одного прямоугольника с его левым нижним углом в источнике новой системы координат. Прямоугольник заполняется один раз без локального преобразования и один раз с локальным преобразованием. Локальное преобразование состоит из горизонтального масштабирования на коэффициент 2, за которым следует поворот 30 градусов.
// Create the path.
GraphicsPath myGraphicsPath;
Rect myRect(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRect);
// Fill the path on the new coordinate system.
// No local transformation
myGraphics.FillPath(&mySolidBrush1, &myGraphicsPath);
// Transform the path.
Matrix myPathMatrix;
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrderAppend);
myGraphicsPath.Transform(&myPathMatrix);
// Fill the transformed path on the new coordinate system.
myGraphics.FillPath(&mySolidBrush2, &myGraphicsPath);
На следующем рисунке показана новая система координат и два прямоугольника.