From e81ceecffc4107ac2fc1fdc797d76c1cc5d1b07b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 15:48:44 +0100 Subject: [PATCH] Add more maths functions for the Vectors --- pkg/game/geom.go | 24 ++++++ pkg/game/geom_test.go | 171 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 pkg/game/geom_test.go diff --git a/pkg/game/geom.go b/pkg/game/geom.go index 7d45198..f65680b 100644 --- a/pkg/game/geom.go +++ b/pkg/game/geom.go @@ -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() +} diff --git a/pkg/game/geom_test.go b/pkg/game/geom_test.go new file mode 100644 index 0000000..af24cc5 --- /dev/null +++ b/pkg/game/geom_test.go @@ -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) + } + }) + } +}