//
// COLOR SPACE CONVERTER

public class ColorSpace
{
   public static void rgb2hsv(double[] rgb, double[] hsv) {
      double r = rgb[0];
      double g = rgb[1];
      double b = rgb[2];

      double max = Math.max(r,Math.max(g,b));
      double min = Math.min(r,Math.min(g,b));
      double range = max - min;

      double v = max;
      double s = range==0 ? 0 : range / max;
      double h = r==max ? (g-b)/range     : // yellow thru magenta
                 g==max ? (b-r)/range + 2 : // cyan thru yellow
                          (r-g)/range + 4 ; // magenta thru cyan

      hsv[0] = (h < 0 ? h+6 : h) / 6;
      hsv[1] = s;
      hsv[2] = v;
   }

   public static void hsv2rgb(double[] hsv, double[] rgb) {
      double h = 6 * hsv[0];
      double s = hsv[1];
      double v = hsv[2];

      int i = (int)(h%6);
      double x = v * (1 - s);
      double y = v * (1 - s * (h%1));
      double z = v * (1 - s * (1 - h%1));

      double r=0, g=0, b=0;
      switch (i) {
      case 0: r = v; g = z; b = x; break;
      case 1: r = y; g = v; b = x; break;
      case 2: r = x; g = v; b = z; break;
      case 3: r = x; g = y; b = v; break;
      case 4: r = z; g = x; b = v; break;
      case 5: r = v; g = x; b = y; break;
      }

      rgb[0] = r;
      rgb[1] = g;
      rgb[2] = b;
   }
}