Re: RGBColor to Hue?
- To: mathgroup at smc.vnet.net
- Subject: [mg31059] Re: RGBColor to Hue?
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Sat, 6 Oct 2001 03:32:31 -0400 (EDT)
- References: <9pjgk0$3fu$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Ted,
There is a problem with your code when the least two of red, grn, blu are
equal : we get division by zero.
Below, I use a Mathematica version of the code outlined at the URL
http://www.efg2.com/Lab/Graphics/Colors/HSV.htm
provided by Bart van der Wolf :
Unprotect[ToColor];
ToColor[RGBColor[r_,g_,b_], Hue]:=
Module[{v,del,s,h},
v = Max[r,g,b];
del= v- Min[r,g,b];
s= If[v==0,0, del/v];
h=
Which[
s==0, 0,
r==v, (g-b)/(6 del),
g==v, 1/3+ (b-r)/(6 del),
b==v, 2/3+ (r-g)/(6 del)
];
If[h<0, h=1+h];
Hue[h,s,v]
];
ToColor[CMYKColor[r_,g_,b_], Hue]:=
ToColor[ToColor[CMYKColor[r,g,b],RGBColor], Hue];
ToColor[GrayLevel[v_], Hue]:=
ToColor[ToColor[GrayLevel[v],RGBColor], Hue];
Protect[ToColor];
--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565
"Ersek, Ted R" <ErsekTR at navair.navy.mil> wrote in message
news:9pjgk0$3fu$1 at smc.vnet.net...
> Dave Park wanted a transformation that will convert an RGBColor
> specification to Hue[h,s,b].
>
> I spent some time working on this a few years ago, and found that the
> definitions below perform a perfect transformation (as far as I can tell).
> This is an extension of the undocumented function ToColor[ ].
>
> (***********************)
> Unprotect[ToColor];
>
> ToColor[RGBColor[red_,grn_,blu_],Hue]/;red>=grn>=blu:=
> Hue[(grn-blu)/(red-blu)/6, (red-blu)/red, red ]
>
> ToColor[RGBColor[red_,grn_,blu_],Hue]/;grn>=red>=blu:=
> Hue[1/3-(red-blu)/(grn-blu)/6, (grn-blu)/grn, grn ]
>
> ToColor[RGBColor[red_,grn_,blu_],Hue]/;grn>=blu>=red:=
> Hue[1/3+(blu-red)/(grn-red)/6, (grn-red)/grn, grn ]
>
> ToColor[RGBColor[red_,grn_,blu_],Hue]/;blu>=grn>=red:=
> Hue[2/3-(grn-red)/(blu-red)/6, (blu-red)/blu,blu ]
>
> ToColor[RGBColor[red_,grn_,blu_],Hue]/;blu>=red>=grn:=
> Hue[2/3+(red-grn)/(blu-grn)/6, (blu-grn)/blu,blu ]
>
> ToColor[RGBColor[red_,grn_,blu_],Hue]/;red>=blu>=grn:=
> Hue[1-(blu-grn)/(red-grn)/6, (red-grn)/red,red ]
>
> (*********************)
>
> Example:
> In[8]:=
> ToColor[RGBColor[0.76, 1., 0.7], Hue]
>
> Out[8]=
> Hue[0.3, 0.3, 1.]
>
>
> My definitions compute the (RGBColor --> Hue) transformation above.
> The built-in ToColor[ ] definition performs the inverse operation below
and
> gives some indication that my transformation is correct. I think you can
> use either to specify the color of graphics and get the same result.
>
> In[9]:=
> ToColor[Hue[0.3, 0.3, 1], RGBColor]
>
> Out[9]=
> RGBColor[0.76, 1., 0.7]
>
> This enhancement to the undocumented ToColor[ ] function is one of the
handy
> enhancements provided in my ColorPlot package posted at
> http://www.mathsource.com/cgi-bin/msitem?0210-700
>
> ---
> Regards,
> Ted
>
>