30 lines
628 B
Go
30 lines
628 B
Go
package color
|
|
|
|
import "math"
|
|
|
|
// HSV represents a color using hue, saturation and value.
|
|
func HSV(hue Value, saturation Value, value Value) Color {
|
|
hue = math.Mod(hue, 360)
|
|
c := value * saturation
|
|
x := c * (1 - math.Abs(math.Mod(hue/60, 2)-1))
|
|
var r, g, b Value
|
|
|
|
switch {
|
|
case hue >= 0 && hue < 60:
|
|
r, g, b = c, x, 0
|
|
case hue >= 60 && hue < 120:
|
|
r, g, b = x, c, 0
|
|
case hue >= 120 && hue < 180:
|
|
r, g, b = 0, c, x
|
|
case hue >= 180 && hue < 240:
|
|
r, g, b = 0, x, c
|
|
case hue >= 240 && hue < 300:
|
|
r, g, b = x, 0, c
|
|
case hue >= 300 && hue < 360:
|
|
r, g, b = c, 0, x
|
|
}
|
|
|
|
m := value - c
|
|
return RGB(r+m, g+m, b+m)
|
|
}
|