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
|
||||
|
||||
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
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