This method converts a `Color`

object into the
three parameters of the HSV model, each in the range [0,`MAX_PARAM`

]. The algorithm is Foley & van Dam's
“`RGB_To_HSV`

”; see Section 2, “References”.

huey

# - - - H S V M o d e l . c o l o r T o P a r a m s def colorToParams ( self, color ): """Convert a Color to the three HSV parameters. """

First we normalize the three RGB parameters to [0.0, 1.0].
See Section 7.4, “`ColorModel.normalize()`

: Normalize an integer
color parameter”.

huey

rNorm = ColorModel.normalize(color.r) gNorm = ColorModel.normalize(color.g) bNorm = ColorModel.normalize(color.b)

The value parameter `v`

is the maximum of the three
values. We also calculate their minimum.

huey

v = maxColor = max ( rNorm, gNorm, bNorm ) minColor = min ( rNorm, gNorm, bNorm )

Next, calculate the saturation. If all the colors are zero, the saturation is zero.

huey

if maxColor == 0.0: s = 0.0 else: s = ( maxColor - minColor ) / maxColor

Next, find the hue. If the saturation is zero, arbitrarily use a value of zero (red) for the hue.

huey

if s == 0.0: h = 0.0 # Hue is undefined; use red arbitrarily

These three cases are: colors between Y and M; colors between C and Y; and colors between M and C. Negative values are then rotated to the range [0,6]. Finally, the hue is normalized to [0.0, 1.0].

huey

else: delta = maxColor - minColor if rNorm == maxColor: # Between Y and M h = ( gNorm - bNorm ) / delta elif gNorm == maxColor: # Between C and Y h = 2.0 + ( bNorm - rNorm ) / delta else: # Between M and C h = 4.0 + ( rNorm - gNorm ) / delta if h < 0.0: h = h + 6.0 h = h / 6.0 # Normalize to [0,1]

Finally, return the three parameters, discretized back to
[0,`MAX_PARAM`

]. See Section 7.5, “`ColorModel.discretize()`

: Discretize an
integer color parameter”.

huey

return ( ColorModel.discretize ( h ), ColorModel.discretize ( s ), ColorModel.discretize ( v ) )