func (c *ColorM) ChangeHSV(hueTheta float64, saturationScale float32, valueScale float32) *ColorM {
	sin, cos := math.Sincos(hueTheta)
	s32, c32 := float32(sin), float32(cos)
	c = c.Concat(rgbToYCbCr)
	c = c.Concat(&ColorM{
		body: []float32{
			1, 0, 0, 0,
			0, c32, s32, 0,
			0, -s32, c32, 0,
			0, 0, 0, 1,
		},
	})
	s := saturationScale
	v := valueScale
	c = c.Scale(v, s*v, s*v, 1)
	c = c.Concat(yCbCrToRgb)
	return c
}
func (c *ColorM) ChangeHSV(hueTheta float64, saturationScale float32, valueScale float32) *ColorM {
	sin, cos := math.Sincos(hueTheta)
	s32, c32 := float32(sin), float32(cos)
	c = c.Concat(rgbToYCbCr)
	c = c.Concat(&ColorM{
		body: []float32{
			1, 0, 0, 0,
			0, c32, s32, 0,
			0, -s32, c32, 0,
			0, 0, 0, 1,
		},
	})
	s := saturationScale
	v := valueScale
	c = c.Scale(v, s*v, s*v, 1)
	c = c.Concat(yCbCrToRgb)
	return c
}
func ( c * ColorM ) ChangeHSV ( hueTheta float64 , saturationScale float32 , valueScale float32 ) * ColorM { sin , cos := math . Sincos ( hueTheta ) s32 , c32 := float32 ( sin ) , float32 ( cos ) c = c . Concat ( rgbToYCbCr ) c = c . Concat ( & ColorM { body : [ ] float32 { 1 , 0 , 0 , 0 , 0 , c32 , s32 , 0 , 0 , - s32 , c32 , 0 , 0 , 0 , 0 , 1 , } , } ) s := saturationScale v := valueScale c = c . Scale ( v , s * v , s * v , 1 ) c = c . Concat ( yCbCrToRgb ) return c }
// ChangeHSV changes HSV (Hue-Saturation-Value) elements.
// hueTheta is a radian value to ratate hue.
// saturationScale is a value to scale saturation.
// valueScale is a value to scale value (a.k.a. brightness).
//
// This conversion uses RGB to/from YCrCb conversion.
ChangeHSV changes HSV ( Hue - Saturation - Value ) elements . hueTheta is a radian value to ratate hue . saturationScale is a value to scale saturation . valueScale is a value to scale value ( a . k . a . brightness ) . This conversion uses RGB to / from YCrCb conversion .