-
Notifications
You must be signed in to change notification settings - Fork 0
/
vec2.go
147 lines (122 loc) · 2.13 KB
/
vec2.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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package sprec
import (
"fmt"
"math"
)
func NewVec2(x, y float32) Vec2 {
return Vec2{
X: x,
Y: y,
}
}
func ZeroVec2() Vec2 {
return Vec2{}
}
func BasisXVec2() Vec2 {
return Vec2{
X: 1.0,
Y: 0.0,
}
}
func BasisYVec2() Vec2 {
return Vec2{
X: 0.0,
Y: 1.0,
}
}
func Vec2Sum(a, b Vec2) Vec2 {
return Vec2{
X: a.X + b.X,
Y: a.Y + b.Y,
}
}
func Vec2MultiSum(first Vec2, others ...Vec2) Vec2 {
result := first
for _, other := range others {
result.X += other.X
result.Y += other.Y
}
return result
}
func Vec2Diff(a, b Vec2) Vec2 {
return Vec2{
X: a.X - b.X,
Y: a.Y - b.Y,
}
}
func Vec2MultiDiff(first Vec2, others ...Vec2) Vec2 {
result := first
for _, other := range others {
result.X -= other.X
result.Y -= other.Y
}
return result
}
func Vec2Prod(vector Vec2, value float32) Vec2 {
return Vec2{
X: vector.X * value,
Y: vector.Y * value,
}
}
func Vec2Quot(vector Vec2, value float32) Vec2 {
return Vec2{
X: vector.X / value,
Y: vector.Y / value,
}
}
func Vec2Dot(a, b Vec2) float32 {
return a.X*b.X + a.Y*b.Y
}
func Vec2Lerp(a, b Vec2, t float32) Vec2 {
return Vec2{
X: (1-t)*a.X + t*b.X,
Y: (1-t)*a.Y + t*b.Y,
}
}
func UnitVec2(vector Vec2) Vec2 {
return Vec2Quot(vector, vector.Length())
}
func ResizedVec2(vector Vec2, newLength float32) Vec2 {
ratio := newLength / vector.Length()
return Vec2Prod(vector, ratio)
}
func InverseVec2(vector Vec2) Vec2 {
return Vec2{
X: -vector.X,
Y: -vector.Y,
}
}
func NormalVec2(vector Vec2) Vec2 {
return UnitVec2(Vec2{
X: -vector.Y,
Y: vector.X,
})
}
func ArrayToVec2(array [2]float32) Vec2 {
return Vec2{
X: array[0],
Y: array[1],
}
}
type Vec2 struct {
X float32
Y float32
}
func (v Vec2) IsNaN() bool {
return math.IsNaN(float64(v.X)) || math.IsNaN(float64(v.Y))
}
func (v Vec2) IsInf() bool {
return math.IsInf(float64(v.X), 0) || math.IsInf(float64(v.Y), 0)
}
func (v Vec2) IsZero() bool {
return Eq(v.X, 0.0) && Eq(v.Y, 0.0)
}
func (v Vec2) SqrLength() float32 {
return Vec2Dot(v, v)
}
func (v Vec2) Length() float32 {
return Sqrt(Vec2Dot(v, v))
}
func (v Vec2) GoString() string {
return fmt.Sprintf("(%f, %f)", v.X, v.Y)
}