Add more maths functions for the Vectors
This commit is contained in:
parent
14977de5bc
commit
e81ceecffc
2 changed files with 195 additions and 0 deletions
|
@ -1,5 +1,7 @@
|
||||||
package game
|
package game
|
||||||
|
|
||||||
|
import "math"
|
||||||
|
|
||||||
// Vector desribes a 3D vector
|
// Vector desribes a 3D vector
|
||||||
type Vector struct {
|
type Vector struct {
|
||||||
X float64 `json:"x"`
|
X float64 `json:"x"`
|
||||||
|
@ -11,3 +13,25 @@ func (v *Vector) Add(v2 Vector) {
|
||||||
v.X += v2.X
|
v.X += v2.X
|
||||||
v.Y += v2.Y
|
v.Y += v2.Y
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Added calculates a new vector
|
||||||
|
func (v Vector) Added(v2 Vector) Vector {
|
||||||
|
v.Add(v2)
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Negated returns a negated vector
|
||||||
|
func (v Vector) Negated() Vector {
|
||||||
|
return Vector{-v.X, -v.Y}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Length returns the length of the vector
|
||||||
|
func (v Vector) Length() float64 {
|
||||||
|
return math.Sqrt(v.X*v.X + v.Y*v.Y)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Distance returns the distance between two vectors
|
||||||
|
func (v Vector) Distance(v2 Vector) float64 {
|
||||||
|
// Negate the two vectors and calciate the length
|
||||||
|
return v.Added(v2.Negated()).Length()
|
||||||
|
}
|
||||||
|
|
171
pkg/game/geom_test.go
Normal file
171
pkg/game/geom_test.go
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
package game
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
type VectorTest struct {
|
||||||
|
name string
|
||||||
|
vec Vector
|
||||||
|
arg Vector
|
||||||
|
want Vector
|
||||||
|
}
|
||||||
|
|
||||||
|
var additionTests = []VectorTest{
|
||||||
|
{
|
||||||
|
name: "Basic addition 1",
|
||||||
|
vec: Vector{
|
||||||
|
X: 0.0,
|
||||||
|
Y: 0.0,
|
||||||
|
},
|
||||||
|
arg: Vector{
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
},
|
||||||
|
want: Vector{
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Basic addition 2",
|
||||||
|
vec: Vector{
|
||||||
|
X: 1.0,
|
||||||
|
Y: 2.0,
|
||||||
|
},
|
||||||
|
arg: Vector{
|
||||||
|
3.0,
|
||||||
|
4.0,
|
||||||
|
},
|
||||||
|
want: Vector{
|
||||||
|
4.0,
|
||||||
|
6.0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVector_Add(t *testing.T) {
|
||||||
|
|
||||||
|
for _, tt := range additionTests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
v := Vector{
|
||||||
|
X: tt.vec.X,
|
||||||
|
Y: tt.vec.Y,
|
||||||
|
}
|
||||||
|
v.Add(tt.arg)
|
||||||
|
assert.Equal(t, tt.want, v, "Add did not produce expected result")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVector_Added(t *testing.T) {
|
||||||
|
for _, tt := range additionTests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
v := Vector{
|
||||||
|
X: tt.vec.X,
|
||||||
|
Y: tt.vec.Y,
|
||||||
|
}
|
||||||
|
assert.Equal(t, tt.want, v.Added(tt.arg), "Added didn't return expected value")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVector_Negated(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
vec Vector
|
||||||
|
want Vector
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Simple check 1",
|
||||||
|
vec: Vector{1, 1},
|
||||||
|
want: Vector{-1, -1},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Simple check 2",
|
||||||
|
vec: Vector{1, -1},
|
||||||
|
want: Vector{-1, 1},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
v := Vector{
|
||||||
|
X: tt.vec.X,
|
||||||
|
Y: tt.vec.Y,
|
||||||
|
}
|
||||||
|
if got := v.Negated(); !reflect.DeepEqual(got, tt.want) {
|
||||||
|
t.Errorf("Vector.Negated() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVector_Length(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
vec Vector
|
||||||
|
want float64
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Simple length 1",
|
||||||
|
vec: Vector{1, 0},
|
||||||
|
want: 1,
|
||||||
|
}, {
|
||||||
|
name: "Simple length 2",
|
||||||
|
vec: Vector{1, -1},
|
||||||
|
want: math.Sqrt(2),
|
||||||
|
}, {
|
||||||
|
name: "Simple length 3",
|
||||||
|
vec: Vector{0, 0},
|
||||||
|
want: 0,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
v := Vector{
|
||||||
|
X: tt.vec.X,
|
||||||
|
Y: tt.vec.Y,
|
||||||
|
}
|
||||||
|
if got := v.Length(); got != tt.want {
|
||||||
|
t.Errorf("Vector.Length() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVector_Distance(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
vec Vector
|
||||||
|
arg Vector
|
||||||
|
want float64
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Simple distance 1",
|
||||||
|
vec: Vector{0, 0},
|
||||||
|
arg: Vector{1, 0},
|
||||||
|
want: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Simple distance 2",
|
||||||
|
vec: Vector{1, 1},
|
||||||
|
arg: Vector{-1, -1},
|
||||||
|
want: math.Sqrt(8),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
v := Vector{
|
||||||
|
X: tt.vec.X,
|
||||||
|
Y: tt.vec.Y,
|
||||||
|
}
|
||||||
|
if got := v.Distance(tt.arg); got != tt.want {
|
||||||
|
t.Errorf("Vector.Distance() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue