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


Вращающиеся цвета

Поворот в четырехмерном цветовом пространстве трудно визуализировать. Мы можем упростить визуализацию поворота, согласившись сохранять один из компонентов цвета фиксированным. Предположим, мы согласились сохранять альфа-компонент равным в 1 (полностью непрозрачным). После этого можно визуализировать трехмерное цветовое пространство с осями, соответствующими красному, зеленому и синему компонентам, как показано на рисунке ниже.

Изображение перспективы трехмерного цветового пространства с осями, помеченными красным, зеленым и синим

Цвет можно рассматривать как точку в трехмерном пространстве. Например, точка с координатами (1, 0, 0) в пространстве представляет красный цвет, а точка с координатами (0, 1, 0) — зеленый цвет.

На рисунке ниже показано, что означает поворот цвета (1, 0, 0) на 60 градусов в плоскости "красный-зеленый". Поворот в плоскости, параллельной плоскости "красный-зеленый", можно рассматривать как поворот вокруг оси синего компонента.

Иллюстрация, показывающая точку (1, 0, 0) с поворотом на 60 градусов до (0,5, 0,866, 0)

На следующем рисунке показано, как инициализировать цветовую матрицу для выполнения поворотов вокруг каждой из трех осей координат (красная, зеленая, синяя).

Иллюстрация, показывающая цветовые матрицы, выполняющие повороты вокруг каждой из трех осей координат

В следующем примере берется изображение, состоящее полностью из одного цвета (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);

На следующем рисунке показано исходное изображение слева и изображение с повернутой цветом справа.

иллюстрация с прямоугольниками, заполненными исходным изображением (фиолетовый красный) и изображением с повернутым цветом (морской зеленый)

Поворот цвета, выполненный в предыдущем примере кода, можно визуализировать следующим образом.

Иллюстрация, показывающая объемное цветовое пространство и точка (1, 0, 0,6) повернута на 60 градусов до (0,5, 0,866, 0,6)