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


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

Глобальное преобразование — это преобразование, которое применяется к каждому элементу, нарисованном заданным объектом графических. Чтобы создать глобальное преобразование, создайте объект графики и вызовите метод 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);

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

снимок экрана оси x и y, а синий квадрат, наложенный полупрозрачным прямоугольником, вращался вокруг левого нижнего угла