Вращающиеся цвета
Поворот в четырехмерном цветовом пространстве трудно визуализировать. Мы можем упростить визуализацию поворота, согласившись сохранять один из компонентов цвета фиксированным. Предположим, мы согласились сохранять альфа-компонент равным в 1 (полностью непрозрачным). После этого можно визуализировать трехмерное цветовое пространство с осями, соответствующими красному, зеленому и синему компонентам, как показано на рисунке ниже.
Цвет можно рассматривать как точку в трехмерном пространстве. Например, точка с координатами (1, 0, 0) в пространстве представляет красный цвет, а точка с координатами (0, 1, 0) — зеленый цвет.
На рисунке ниже показано, что означает поворот цвета (1, 0, 0) на 60 градусов в плоскости "красный-зеленый". Поворот в плоскости, параллельной плоскости "красный-зеленый", можно рассматривать как поворот вокруг оси синего компонента.
На следующем рисунке показано, как инициализировать цветовую матрицу для выполнения поворотов вокруг каждой из трех осей координат (красная, зеленая, синяя).
В следующем примере берется изображение, состоящее полностью из одного цвета (1, 0, 0,6), и к нему применяется поворот на 60 градусов вокруг оси синего компонента. Угол поворота смеется в плоскости, параллельной плоскости Red-Green.
Image image(L"RotationInput.bmp");
ImageAttributes imageAttributes;
UINT width = image.GetWidth();
UINT height = image.GetHeight();
REAL degrees = 60;
REAL pi = acos(-1); // the angle whose cosine is -1.
REAL r = degrees * pi / 180; // degrees to radians
ColorMatrix colorMatrix = {
cos(r), sin(r), 0.0f, 0.0f, 0.0f,
-sin(r), cos(r), 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
imageAttributes.SetColorMatrix(
&colorMatrix,
ColorMatrixFlagsDefault,
ColorAdjustTypeBitmap);
graphics.DrawImage(&image, 10, 10, width, height);
graphics.DrawImage(
&image,
Rect(130, 10, width, height), // destination rectangle
0, 0, // upper-left corner of source rectangle
width, // width of source rectangle
height, // height of source rectangle
UnitPixel,
&imageAttributes);
На следующем рисунке показано исходное изображение слева и изображение с повернутой цветом справа.
Поворот цвета, выполненный в предыдущем примере кода, можно визуализировать следующим образом.