Partager via


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 maintenir le composant alpha fixe à 1 (entièrement opaque). Ensuite, nous pouvons visualiser un espace de couleurs à trois dimensions avec des axes rouges, verts et bleus, comme illustré dans l’illustration suivante.

illustration d’une vue de perspective d’un espace de couleurs tridimensionnel avec des axes étiquetés rouge, vert et bleu

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) dans l’espace représente la couleur verte.

L’illustration suivante montre ce que signifie faire pivoter la couleur (1, 0, 0) à travers un angle de 60 degrés dans le plan Red-Green. La rotation dans un plan parallèle au plan Red-Green peut être considérée comme une rotation autour de l’axe bleu.

illustration montrant le point (1, 0, 0) pivoté de 60 degrés vers (0,5, 0,866, 0)

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).

illustration montrant des matrices de couleurs qui effectuent des rotations sur chacun des trois axes de coordonnées

L’exemple suivant prend une image de couleur unique (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 à gauche et l’image pivotée en couleur à droite.

illustration montrant des rectangles remplis de l’image d’origine (rouge violet) et une image pivotée en couleur (vert de mer)

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

illustration montrant un espace de couleur 3d et le point (1, 0, 0,6) pivoté de 60 degrés vers (0,5, 0,866, 0,6)