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


/* rgb2hsv, Chapter 15, p 578 */

/* EXAMPLE STARTS HERE */
#include 

#define MIN(a,b) (ab?a:b)
#define NO_HUE   -1

/* Input:   r, g, b in range [0..1]
   Outputs: h, s, v in range [0..1] 
*/
void rgbToHsv (float r, float g, float b, float * h, float * s, float * v)
{
  float max = MAX (r, MAX (g, b)), min = MIN (r, MIN (g, b));
  float delta = max - min;

  *v = max;
  if (max != 0.0)
    *s = delta / max;
  else
    *s = 0.0;
  if (*s == 0.0) *h = NO_HUE;
  else {
    if (r == max)
      *h = (g - b) / delta;
    else if (g == max)
      *h = 2 + (b - r) / delta;
    else if (b == max)
      *h = 4 + (r - g) / delta;
    *h *= 60.0;
    if (*h < 0) *h += 360.0;
    *h /= 360.0;
  }
}
/* EXAMPLE ENDS HERE */


#define N_COLORS 6

void main ()
{
  char * colorNames[] =
    { "red", "green", "blue", "cyan", "magenta", "yellow" };
  float rgb[][3] = {  1.0, 0.0, 0.0,
		      0.0, 1.0, 0.0,
		      0.0, 0.0, 1.0,
		      0.0, 1.0, 1.0,
		      1.0, 0.0, 1.0,
		      1.0, 1.0, 0.0,

		      0.75, 0.00, 0.00,
		      0.00, 0.75, 0.00,
		      0.00, 0.00, 0.75,
		      0.00, 0.75, 0.75,
		      0.75, 0.00, 0.75,
		      0.75, 0.75, 0.00,

		      1.00, 0.30, 0.30,
		      0.30, 1.00, 0.30,
		      0.30, 0.30, 1.00,
		      0.30, 1.00, 1.00,
		      1.00, 0.30, 1.00,
		      1.00, 1.00, 0.30 };
  float h, s, v;
  int i, j;

  for (i=0; i