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.
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.
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 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.
La rotation des couleurs effectuée dans l’exemple de code précédent peut être visualisées comme suit.