97 lines
1.9 KiB
Go
97 lines
1.9 KiB
Go
package maths
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// Bearing describes a compass direction
|
|
type Bearing int
|
|
|
|
const (
|
|
// North describes a 0,1 vector
|
|
North Bearing = iota
|
|
// NorthEast describes a 1,1 vector
|
|
NorthEast
|
|
// East describes a 1,0 vector
|
|
East
|
|
// SouthEast describes a 1,-1 vector
|
|
SouthEast
|
|
// South describes a 0,-1 vector
|
|
South
|
|
// SouthWest describes a -1,-1 vector
|
|
SouthWest
|
|
// West describes a -1,0 vector
|
|
West
|
|
// NorthWest describes a -1,1 vector
|
|
NorthWest
|
|
)
|
|
|
|
// bearingString simply describes the strings associated with a direction
|
|
type bearingString struct {
|
|
Long string
|
|
Short string
|
|
}
|
|
|
|
// bearingStrings is the set of strings for each direction
|
|
var bearingStrings = []bearingString{
|
|
{"North", "N"},
|
|
{"NorthEast", "NE"},
|
|
{"East", "E"},
|
|
{"SouthEast", "SE"},
|
|
{"South", "S"},
|
|
{"SouthWest", "SW"},
|
|
{"West", "W"},
|
|
{"NorthWest", "NW"},
|
|
}
|
|
|
|
// String converts a Direction to a String
|
|
func (d Bearing) String() string {
|
|
return bearingStrings[d].Long
|
|
}
|
|
|
|
// ShortString converts a Direction to a short string version
|
|
func (d Bearing) ShortString() string {
|
|
return bearingStrings[d].Short
|
|
}
|
|
|
|
// BearingFromString gets the Direction from a string
|
|
func BearingFromString(s string) (Bearing, error) {
|
|
for i, d := range bearingStrings {
|
|
if strings.EqualFold(d.Long, s) || strings.EqualFold(d.Short, s) {
|
|
return Bearing(i), nil
|
|
}
|
|
}
|
|
return -1, fmt.Errorf("unknown bearing: %s", s)
|
|
}
|
|
|
|
var bearingVectors = []Vector{
|
|
{X: 0, Y: 1}, // N
|
|
{X: 1, Y: 1}, // NE
|
|
{X: 1, Y: 0}, // E
|
|
{X: 1, Y: -1}, // SE
|
|
{X: 0, Y: -1}, // S
|
|
{X: -1, Y: -1}, // SW
|
|
{X: -1, Y: 0}, // W
|
|
{X: -1, Y: 1}, // NW
|
|
}
|
|
|
|
// Vector converts a Direction to a Vector
|
|
func (d Bearing) Vector() Vector {
|
|
return bearingVectors[d]
|
|
}
|
|
|
|
// IsCardinal returns if this is a cardinal (NESW)
|
|
func (d Bearing) IsCardinal() bool {
|
|
switch d {
|
|
case North:
|
|
fallthrough
|
|
case East:
|
|
fallthrough
|
|
case South:
|
|
fallthrough
|
|
case West:
|
|
return true
|
|
}
|
|
return false
|
|
}
|