123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- package main
- import (
- "fmt"
- "strconv"
- "strings"
- )
- type Vec2 struct {
- X int64
- Y int64
- }
- func NewVec2(axis ...int64) *Vec2 {
- if len(axis) == 0 {
- return &Vec2{}
- } else if len(axis) == 1 {
- return &Vec2{axis[0], axis[0]}
- } else {
- return &Vec2{axis[0], axis[1]}
- }
- }
- func (v *Vec2) Clone() *Vec2 {
- if v == nil {
- return nil
- }
- return &Vec2{v.X, v.Y}
- }
- func (v *Vec2) Translate(axis ...int64) *Vec2 {
- if v == nil {
- return nil
- }
- if len(axis) == 0 {
- return v
- } else if len(axis) == 1 {
- v.X += axis[0]
- v.Y += axis[0]
- return v
- } else {
- v.X += axis[0]
- v.Y += axis[1]
- return v
- }
- }
- func (v *Vec2) TranslateBy(o *Vec2) *Vec2 {
- if v == nil {
- return nil
- }
- if o == nil {
- return v
- }
- v.X += o.X
- v.Y += o.Y
- return v
- }
- func (v *Vec2) Assign(axis ...int64) *Vec2 {
- if v == nil {
- return nil
- }
- if len(axis) == 0 {
- v.X = 0
- v.Y = 0
- return v
- } else if len(axis) == 1 {
- v.X = axis[0]
- v.Y = axis[0]
- return v
- } else {
- v.X = axis[0]
- v.Y = axis[1]
- return v
- }
- }
- func (v *Vec2) AssignTo(o *Vec2) *Vec2 {
- if v == nil {
- return nil
- }
- if o == nil {
- return v
- }
- v.X = o.X
- v.Y = o.Y
- return v
- }
- func (v *Vec2) Equal(axis ...int64) bool {
- if v == nil {
- return false
- }
- if len(axis) == 0 {
- return v.X == 0 && v.Y == 0
- } else if len(axis) == 1 {
- return v.X == axis[0] && v.Y == axis[0]
- } else {
- return v.X == axis[0] && v.Y == axis[1]
- }
- }
- func (v *Vec2) EqualTo(o *Vec2) bool {
- if v == nil {
- return false
- }
- if o == nil {
- return v.X == 0 && v.Y == 0
- }
- return v.X == o.X && v.Y == o.Y
- }
- func (v *Vec2) Less(axis ...int64) bool {
- if v == nil {
- return false
- }
- if len(axis) == 0 {
- return v.X <= 0 && v.Y <= 0
- } else if len(axis) == 1 {
- return v.X <= axis[0] && v.Y == axis[0]
- } else {
- return v.X <= axis[0] && v.Y == axis[1]
- }
- }
- func (v *Vec2) LessThan(o *Vec2) bool {
- if v == nil {
- return false
- }
- if o == nil {
- return v.Less()
- }
- return v.X <= o.X && v.Y <= o.Y
- }
- func (v *Vec2) Greater(axis ...int64) bool {
- if v == nil {
- return false
- }
- if len(axis) == 0 {
- return v.X >= 0 && v.Y >= 0
- } else if len(axis) == 1 {
- return v.X >= axis[0] && v.Y >= axis[0]
- } else {
- return v.X >= axis[0] && v.Y >= axis[1]
- }
- }
- func (v *Vec2) GreaterThan(o *Vec2) bool {
- if v == nil {
- return false
- }
- if o == nil {
- return v.Greater()
- }
- return v.X >= o.X && v.Y >= o.Y
- }
- func SortVec2(v1, v2 *Vec2) (*Vec2, *Vec2) {
- if v1.GreaterThan(v2) {
- return v2, v1
- }
- return v1, v2
- }
- func (v *Vec2) Distance(axis ...int64) int64 {
- if v == nil {
- return 0
- }
- if len(axis) == 0 {
- return v.X + v.Y
- } else if len(axis) == 1 {
- x := v.X - axis[0]
- y := v.Y - axis[0]
- if x < 0 {
- x = -x
- }
- if y < 0 {
- y = -y
- }
- return x + y
- } else {
- x := v.X - axis[0]
- y := v.Y - axis[1]
- if x < 0 {
- x = -x
- }
- if y < 0 {
- y = -y
- }
- return x + y
- }
- }
- func (v *Vec2) DistanceTo(o *Vec2) int64 {
- if v == nil {
- return 0
- }
- if o == nil {
- return v.Distance()
- }
- x := v.X - o.X
- y := v.Y - o.Y
- if x < 0 {
- x = -x
- }
- if y < 0 {
- y = -y
- }
- return x + y
- }
- func (v *Vec2) Abs() *Vec2 {
- if v == nil {
- return nil
- }
- if v.X < 0 {
- v.X = -v.X
- }
- if v.Y < 0 {
- v.Y = -v.Y
- }
- return v
- }
- func (v *Vec2) Negate() *Vec2 {
- if v == nil {
- return nil
- }
- v.X = -v.X
- v.Y = -v.Y
- return v
- }
- func (v *Vec2) String() string {
- if v == nil {
- return "nil"
- }
- return fmt.Sprintf("(%d, %d)", v.X, v.Y)
- }
- func Vec2FromString(s string) (*Vec2, string) {
- if !strings.ContainsAny(s, "(),") {
- return nil, "missing '(),' characters"
- }
- work := strings.Split(strings.ReplaceAll(strings.ReplaceAll(s, ")", ""), "(", ""), ", ")
- if len(work) != 2 {
- return nil, fmt.Sprintf("missing parts, got %d, need 2", len(work))
- }
- x, err := strconv.ParseInt(work[0], 10, 64)
- if err != nil {
- return nil, fmt.Sprintf("failed parsing x axis, %v", err)
- }
- y, err := strconv.ParseInt(work[1], 10, 64)
- if err != nil {
- return nil, fmt.Sprintf("failed parsing y axis, %v", err)
- }
- return NewVec2(x, y), ""
- }
|