www.pudn.com > CG2Programs.rar > hsv2rgb.c


/*  hsv2Rgb, Chapter 15, p 578-9  */

/* EXAMPLE STARTS HERE */
#include 

/* Input:   h, s, v in range [0..1]
   Outputs: r, g, b in range [0..1] */
void hsvToRgb (float h, float s, float v, float * r, float * g, float * b)
{
  int i;
  float aa, bb, cc, f;

  if (s == 0) /* Grayscale */
    *r = *g = *b = v;
  else {
    if (h == 1.0) h = 0;
    h *= 6.0;
    i = ffloor (h);
    f = h - i;
    aa = v * (1 - s);
    bb = v * (1 - (s * f));
    cc = v * (1 - (s * (1 - f)));
    switch (i) {
    case 0: *r = v;  *g = cc; *b = aa; break;
    case 1: *r = bb; *g = v;  *b = aa; break;
    case 2: *r = aa; *g = v;  *b = cc; break;
    case 3: *r = aa; *g = bb; *b = v;  break;
    case 4: *r = cc; *g = aa; *b = v;  break;
    case 5: *r = v;  *g = aa; *b = bb; break;
    }
  }
}
/* EXAMPLE ENDS HERE */

#define N_COLORS 6

void main ()
{
  char * colorNames[] =
    { "red", "green", "blue", "cyan", "magenta", "yellow" };
  float hsv[][3] = {
    0.000, 1.00, 1.00,
    0.333, 1.00, 1.00,
    0.676, 1.00, 1.00,
    0.500, 1.00, 1.00,
    0.833, 1.00, 1.00,
    0.167, 1.00, 1.00 };

  float r, g, b;
  int i;

  for (i=0; i