-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathmath.go
More file actions
84 lines (73 loc) · 1.3 KB
/
math.go
File metadata and controls
84 lines (73 loc) · 1.3 KB
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package main
import (
"math"
"math/big"
"github.com/sqweek/sqribe/score"
)
var rZero big.Rat
func ratb(beat int, offset *big.Rat) *big.Rat {
r := big.NewRat(int64(beat), 1)
r.Add(r, offset)
return r
}
func Δb(beat1 *score.BeatRef, offset1 *big.Rat, beat2 *score.BeatRef, offset2 *big.Rat) *big.Rat {
db := beat1.Subtract(beat2)
t := ratb(db, offset1)
t.Sub(t, ratb(0, offset2))
return t
}
func mod(n, d int) int {
r := n % d
if r < 0 {
return d + r
}
return r
}
func ceil(n, d int) int {
q, r := n / d, n % d
if r == 0 {
return q
} else if n < 0 {
return q
}
return q + 1
}
/* divides n by d, rounding away from zero. assumes d is positive */
func divØ(n, d int) int {
q, r := n / d, n % d
if r == 0 {
return q
} else if n < 0 {
return q - 1
}
return q + 1
}
func slog(s int16) float64 {
return float64(s)
if s == 0 {
return 0.0
} else if s < 0 {
return -math.Log(float64(-s))
} else {
return math.Log(float64(s))
}
}
func snapto(x, origin, step int) int {
d := x - origin
var sgn int
if (d < 0) {
sgn = -1
} else {
sgn = 1
}
rem := (sgn * d) % step
if rem < step/2 {
return x - sgn * rem
}
return x + sgn * (step - rem)
}
// returns squared distance between two points
func sqdist(x1, y1, x2, y2 int) int {
dx, dy := x2 - x1, y2 - y1
return dx*dx + dy*dy
}