/
linear.go
69 lines (60 loc) · 1.38 KB
/
linear.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package intrange
import "math/rand"
// NewLinear returns a linear range
// between min and max
func NewLinear(min, max int) Range {
if max == min {
return Constant(min)
}
flipped := false
if max < min {
max, min = min, max
flipped = true
}
return linear{min, max, nowRand(), flipped}
}
// NewSpread returns a linear range from base - s to base + s
func NewSpread(base, s int) Range {
if s == 0 {
return Constant(base)
}
if s < 0 {
s *= -1
}
return linear{base - s, base + s, nowRand(), false}
}
// Linear polls on a linear scale
// between a minimum and a maximum
// linear is private so that the maximum cannot
// be changed to be less than the minimum.
type linear struct {
Min, Max int
rng *rand.Rand
flipped bool
}
func (lir linear) Poll() int {
return lir.rng.Intn((lir.Max+1)-lir.Min) + lir.Min
}
func (lir linear) Mult(i float64) Range {
lir.Max = int(float64(lir.Max) * i)
lir.Min = int(float64(lir.Min) * i)
return lir
}
func (lir linear) InRange(i int) bool {
return (i > lir.Min) == (i < lir.Max)
}
func (lir linear) EnforceRange(i int) int {
if i < lir.Min {
return lir.Min
} else if i > lir.Max {
return lir.Max
}
return i
}
func (lir linear) Percentile(f float64) int {
diff := float64(lir.Max-lir.Min) * f // 0 - 255 * .1 = -25 + 255 = 230 // 255 - 0 * .1 = 25
if lir.flipped {
return lir.Max - int(diff)
}
return lir.Min + int(diff)
}