/
gradientcolor.go
53 lines (40 loc) · 1.06 KB
/
gradientcolor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package noiselib
import (
"image/color"
)
type GradientColor struct {
GradientPoints map[float64]color.RGBA
}
func (g *GradientColor) AddGradientPoint(position float64, color color.RGBA) {
g.GradientPoints[position] = color
}
func (g *GradientColor) ClearGradient() {
g.GradientPoints = make(map[float64]color.RGBA)
}
func (g *GradientColor) GetColor(position float64) color.RGBA {
if len(g.GradientPoints) < 2 {
panic("A GradientColor must have at least 2 points.")
}
keys := []float64{}
for k, _ := range g.GradientPoints {
keys = append(keys, k)
}
indexPos := 0
for _, k := range keys {
if position < k {
break
}
indexPos++
}
index0 := ClampValue(indexPos-1, 0, len(g.GradientPoints)-1)
index1 := ClampValue(indexPos, 0, len(g.GradientPoints)-1)
if index0 == index1 {
return g.GradientPoints[keys[index1]]
}
input0 := keys[index0]
input1 := keys[index1]
alpha := (position - input0) / (input1 - input0)
color0 := g.GradientPoints[keys[index0]]
color1 := g.GradientPoints[keys[index1]]
return LinearInterpColor(color0, color1, alpha)
}