Rotation des couleurs
La rotation dans un espace de couleurs à quatre dimensions est difficile à visualiser. Nous pouvons faciliter la visualisation de la rotation en acceptant de conserver l’un des composants de couleur fixe. Supposons que nous acceptions de conserver le composant alpha fixe à 1 (entièrement opaque). Ensuite, nous pouvons visualiser un espace de couleurs à trois dimensions avec des axes rouge, vert et bleu, comme indiqué dans l’illustration suivante.

Une couleur peut être considérée comme un point dans l’espace 3D. Par exemple, le point (1,0, 0) dans l’espace représente la couleur rouge et le point (0, 1, 0) de l’espace représente la couleur verte.
L’illustration suivante montre ce que cela signifie pour faire pivoter la couleur (1, 0, 0) à l’aide d’un angle de 60 degrés dans le plan Red-Green. La rotation d’un plan parallèle au plan de Red-Green peut être considérée comme une rotation autour de l’axe bleu.

L’illustration suivante montre comment initialiser une matrice de couleurs pour effectuer des rotations sur chacun des trois axes de coordonnées (rouge, vert, bleu).

L’exemple suivant prend une image qui est une seule couleur (1, 0, 0,6) et applique une rotation de 60 degrés autour de l’axe bleu. L’angle de rotation est balayé dans un plan parallèle au plan de 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);
L’illustration suivante montre l’image d’origine sur la gauche et l’image de rotation de couleur à droite.

La rotation des couleurs effectuée dans l’exemple de code précédent peut être visualisée comme suit.
