-
Notifications
You must be signed in to change notification settings - Fork 1
/
mutable.go
86 lines (71 loc) · 1.62 KB
/
mutable.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package hyperrectangle
import (
"github.com/downflux/go-geometry/nd/vector"
)
type M R
func (r M) R() R { return R(r) }
func (r M) Min() vector.M { return R(r).Min().M() }
func (r M) Max() vector.M { return R(r).Max().M() }
func (r M) Copy(s R) {
copy(r.Min(), s.Min())
copy(r.Max(), s.Max())
}
func (r M) Zero() {
r.Min().Zero()
r.Max().Zero()
}
func (r M) Intersect(s R) bool {
if r.Min().Dimension() != s.Min().Dimension() {
panic("mismatching vector dimensions")
}
rmin, rmax := r.Min(), r.Max()
smin, smax := s.Min(), s.Max()
k := rmin.Dimension()
for i := vector.D(0); i < k; i++ {
if rmin[i] < smin[i] {
rmin[i] = smin[i]
}
}
for i := vector.D(0); i < k; i++ {
if rmax[i] > smax[i] {
rmax[i] = smax[i]
}
}
for i := vector.D(0); i < k; i++ {
if rmin[i] > rmax[i] {
return false
}
}
return true
}
func (r M) Union(s R) {
if r.Min().Dimension() != s.Min().Dimension() {
panic("mismatching vector dimensions")
}
rmin, rmax := r.Min(), r.Max()
smin, smax := s.Min(), s.Max()
k := r.Min().Dimension()
for i := vector.D(0); i < k; i++ {
if smin[i] < rmin[i] {
rmin[i] = smin[i]
}
}
for i := vector.D(0); i < k; i++ {
if smax[i] > rmax[i] {
rmax[i] = smax[i]
}
}
}
// Scale will expand or shrink each dimension of the AABB by the given scalar.
//
// If we want to expand or shrink by the total volume instead, we can use
//
// b.Scale(math.Pow(c, 1.0 / b.Min().Dimension()))
func (r M) Scale(c float64) {
rmin, rmax := r.Min(), r.Max()
for i := vector.D(0); i < r.Min().Dimension(); i++ {
min := rmin[i]
max := rmax[i]
r.Max()[i] = min + ((max - min) * c)
}
}