Add more maths functions for the Vectors

This commit is contained in:
Marc Di Luzio 2020-06-05 15:48:44 +01:00
parent 14977de5bc
commit e81ceecffc
2 changed files with 195 additions and 0 deletions

View file

@ -1,5 +1,7 @@
package game
import "math"
// Vector desribes a 3D vector
type Vector struct {
X float64 `json:"x"`
@ -11,3 +13,25 @@ func (v *Vector) Add(v2 Vector) {
v.X += v2.X
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
View 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)
}
})
}
}