Метод Matrix::TransformVectors(Point*,INT) (gdiplusmatrix.h)
Метод Matrix::TransformVectors умножает каждый вектор в массиве на эту матрицу. Элементы смещения данной матрицы (третья строка) игнорируются. Каждый вектор обрабатывается как матрица строк. Умножение выполняется с матрицей строк слева и этой матрицей справа.
Синтаксис
Status TransformVectors(
[in, out] Point *pts,
[in] INT count
);
Параметры
[in, out] pts
Тип: Point*
Указатель на массив объектов Point , который на входных данных содержит преобразуемые векторы, а на выходных данных получает преобразованные векторы. Каждый вектор в массиве преобразуется (умножается на эту матрицу) и обновляется с учетом результата преобразования.
[in] count
Тип: INT
Необязательный элемент. Целое число, указывающее количество векторов для преобразования. Значение по умолчанию — 1.
Возвращаемое значение
Тип: Состояние
В случае успешного выполнения метода возвращается ОК, который является элементом перечисления Status .
Если метод завершается ошибкой, он возвращает один из других элементов перечисления Status .
Комментарии
В то время как точка представляет позицию, вектор представляет сущность (например, скорость или ускорение), которая имеет направление и величину. Таким образом, конечными точками сегмента линии являются точки, но их различие является вектором — длиной и направлением этого сегмента линии.
Векторы во многом похожи на точки. Как и точки, они представлены координатами x и y, поэтому GDI+ использует те же классы (Point и PointF) для представления векторов, как и для представления точек. Незначительное различие между векторами и точками заключается в том, как на них влияют преобразования. В физическом мире перемещение системы координат изменяет координаты всех точек положения, но не изменяет векторы скорости. Векторы можно масштабировать, поворачивать, сдвигать или переворачивать, но не переводить (перемещать). Таким образом, при применении аффинного преобразования к вектору компонент преобразования (последняя строка матрицы) игнорируется.
Примеры
В следующем примере создаются вектор и точка. Кончик вектора и точка находятся в одном расположении: (100, 50). Код создает объект Matrix и инициализирует его элементы таким образом, чтобы он представлял поворот по часовой стрелке, за которым следует преобразование 100 единиц вправо. Код вызывает метод Matrix::TransformPoints матрицы для преобразования точки и вызывает метод Matrix::TransformVectors матрицы для преобразования вектора. Все преобразование (поворот с последующим преобразованием) выполняется в точке, но только часть поворота преобразования выполняется в векторе. Элементы матрицы, представляющие перевод, игнорируются методом Matrix::TransformVectors .
VOID Example_TransVectors(HDC hdc)
{
Graphics graphics(hdc);
Pen pen(Color(255, 0, 0, 255), 7);
pen.SetEndCap(LineCapArrowAnchor);
SolidBrush brush(Color(255, 0, 0, 255));
// A point and a vector, same representation but different behavior
Point point(100, 50);
Point vector(100, 50);
// Draw the original point and vector in blue.
graphics.FillEllipse(&brush, point.X - 5, point.Y - 5, 10, 10);
graphics.DrawLine(&pen, Point(0, 0), vector);
// Transform.
Matrix matrix(0.8f, 0.6f, -0.6f, 0.8f, 100.0f, 0.0f);
matrix.TransformPoints(&point);
matrix.TransformVectors(&vector);
// Draw the transformed point and vector in red.
pen.SetColor(Color(255, 255, 0, 0));
brush.SetColor(Color(255, 255, 0, 0));
graphics.FillEllipse(&brush, point.X - 5, point.Y - 5, 10, 10);
graphics.DrawLine(&pen, Point(0, 0), vector);
}
Требования
Минимальная версия клиента | Windows XP, Windows 2000 Профессиональная [только классические приложения] |
Минимальная версия сервера | Windows 2000 Server [только классические приложения] |
Целевая платформа | Windows |
Header | gdiplusmatrix.h (включая Gdiplus.h) |
Библиотека | Gdiplus.lib |
DLL | Gdiplus.dll |
См. также раздел
Глобальные и локальные преобразования