-
Notifications
You must be signed in to change notification settings - Fork 0
/
v3.go
127 lines (106 loc) · 2.13 KB
/
v3.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
V3
Same as V2, with the addition of a Z component.
*/
package math
import "math"
type V3 struct {
X Scalar
Y Scalar
Z Scalar
}
func V3Zero() V3 { return V3{X: 0, Y: 0, Z: 0} }
func V3One() V3 { return V3{X: 1, Y: 1, Z: 1} }
func V3Up() V3 { return V3{X: 0, Y: -1, Z: 0} }
func V3Down() V3 { return V3{X: 0, Y: 1, Z: 0} }
func V3Left() V3 { return V3{X: -1, Y: 0, Z: 0} }
func V3Right() V3 { return V3{X: 1, Y: 0, Z: 0} }
// V3Forward, V3Back are intentionally undefined
func (a V3) Add(b V3) V3 {
return V3{
X: a.X + b.X,
Y: a.Y + b.Y,
Z: a.Z + b.Z,
}
}
func (a V3) Sub(b V3) V3 {
return V3{
X: a.X - b.X,
Y: a.Y - b.Y,
Z: a.Z - b.Z,
}
}
func (a V3) Mul(b V3) V3 {
return V3{
X: a.X * b.X,
Y: a.Y * b.Y,
Z: a.Z * b.Z,
}
}
func (a V3) Div(b V3) (c V3) {
return V3{
X: a.X / b.X,
Y: a.Y / b.Y,
Z: a.Z / b.Z,
}
}
func (a V3) Scale(amt Scalar) V3 {
return V3{
X: a.X * amt,
Y: a.Y * amt,
Z: a.Z * amt,
}
}
func (a V3) Normalize() (res V3) {
panic("Todo")
}
func (a V3) Length() Scalar {
panic("Todo")
}
func (a V3) Dot(b V3) Scalar {
panic("Todo")
}
func (a V3) DistanceTo(b V3) Scalar {
panic("Todo")
}
func (a V3) AngleTo(b V3) Scalar {
panic("Todo")
}
func (a V3) Lerp(b V3, t Scalar) (c V3) {
c.X = a.X + t*(b.X-a.X)
c.Y = a.Y + t*(b.Y-a.Y)
c.Z = a.Z + t*(b.Z-a.Z)
return
}
func (a V3) Clamp(min V3, max V3) V3 {
return V3{
X: Clamp[Scalar](a.X, min.X, max.X),
Y: Clamp[Scalar](a.Y, min.Y, max.Y),
Z: Clamp[Scalar](a.Z, min.Z, max.Z),
}
}
func (a V3) Trunc() V3 {
return V3{
X: Scalar(math.Trunc(a.X)),
Y: Scalar(math.Trunc(a.Y)),
Z: Scalar(math.Trunc(a.Z)),
}
}
func (a V3) Equals(b V3) bool {
ax := float64(a.X)
ay := float64(a.Y)
az := float64(a.Z)
bx := float64(b.X)
by := float64(b.Y)
bz := float64(b.Z)
eps := float64(Epsilon)
xdist := math.Abs(ax - bx)
ydist := math.Abs(ay - by)
zdist := math.Abs(az - bz)
xeps := eps * math.Max(1, math.Max(math.Abs(ax), math.Abs(bx)))
yeps := eps * math.Max(1, math.Max(math.Abs(ay), math.Abs(by)))
zeps := eps * math.Max(1, math.Max(math.Abs(az), math.Abs(bz)))
return xdist <= xeps &&
ydist <= yeps &&
zdist <= zeps
}