123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- package main
- import (
- "fmt"
- "strconv"
- "strings"
- )
- type Vec2 struct {
- X int64
- Y int64
- }
- func NewVec2(axis ...int64) *Vec2 {
- if len(axis) == 0 {
- return &Vec2{X: 0, Y: 0}
- } else if len(axis) == 1 {
- return &Vec2{X: axis[0], Y: axis[0]}
- } else {
- return &Vec2{X: axis[0], Y: axis[1]}
- }
- }
- func (v *Vec2) Clone() *Vec2 {
- if v == nil {
- return nil
- }
- return &Vec2{X: v.X, Y: v.Y}
- }
- func (v *Vec2) Add(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) Sub(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) Mul(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) Div(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) Rem(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) Set(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) AddBy(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) SubBy(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) MulBy(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) DivBy(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) RemBy(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) SetTo(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) Abs() *Vec2 {
- if v == nil {
- return nil
- }
- v.X = I64Abs(v.X)
- v.Y = I64Abs(v.Y)
- return v
- }
- func I64Abs(i int64) int64 {
- if i < 0 {
- return -i
- }
- return i
- }
- func (v *Vec2) Negate() *Vec2 {
- if v == nil {
- return nil
- }
- v.X = -v.X
- v.Y = -v.Y
- return v
- }
- func (v *Vec2) Less(axis ...int64) bool {
- if v == nil || len(axis) == 0 {
- return false
- }
- 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) Great(axis ...int64) bool {
- if v == nil || len(axis) == 0 {
- return false
- }
- 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) Eq(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 || o == nil {
- return false
- }
- return v.X < o.X && v.Y < o.Y
- }
- func (v *Vec2) GreatThan(o *Vec2) bool {
- if v == nil || o == nil {
- return false
- }
- return v.X > o.X && v.Y > o.Y
- }
- func (v *Vec2) EqTo(o *Vec2) bool {
- if v == nil || o == nil {
- return false
- }
- return v.X == o.X && v.Y == o.Y
- }
- func (v *Vec2) Dist(axis ...int64) int64 {
- if v == nil {
- return -1
- }
- if len(axis) == 0 {
- return I64Abs(v.X) + I64Abs(v.Y)
- } else if len(axis) == 1 {
- a := I64Abs(v.X) + I64Abs(v.Y)
- b := I64Abs(axis[0]) + I64Abs(axis[0])
- return I64Abs(a - b)
- } else {
- a := I64Abs(v.X) + I64Abs(v.Y)
- b := I64Abs(axis[0]) + I64Abs(axis[1])
- return I64Abs(a - b)
- }
- }
- func (v *Vec2) DistTo(o *Vec2) int64 {
- if v == nil || o == nil {
- return -1
- }
- a := I64Abs(v.X) + I64Abs(v.Y)
- b := I64Abs(o.X) + I64Abs(o.Y)
- return I64Abs(a - b)
- }
- func (v *Vec2) String() string {
- return fmt.Sprintf("(%d, %d)", v.X, v.Y)
- }
- var (
- ErrVec2Format error = fmt.Errorf("missing parentheses and/or comma")
- ErrTooManyCommas error = fmt.Errorf("missing or too many commas")
- ErrInvalidAxisX error = fmt.Errorf("missing or invalid X-axis")
- ErrInvalidAxisY error = fmt.Errorf("missing or invalid Y-axis")
- )
- func StrToVec2(s string) (*Vec2, error) {
- if !strings.Contains(s, "(") || !strings.Contains(s, ")") || !strings.Contains(s, ",") {
- return nil, ErrVec2Format
- }
- work := strings.ReplaceAll(s, "(", "")
- work = strings.ReplaceAll(work, ")", "")
- commas := strings.Count(work, ",")
- if commas != 1 {
- return nil, ErrTooManyCommas
- }
- parts := strings.Split(work, ",")
- for idx, part := range parts {
- parts[idx] = strings.TrimSpace(part)
- }
- if len(parts) != 2 {
- return nil, ErrTooManyCommas
- }
- x, err := strconv.ParseInt(parts[0], 10, 64)
- if err != nil {
- return nil, ErrInvalidAxisX
- }
- y, err := strconv.ParseInt(parts[1], 10, 64)
- if err != nil {
- return nil, ErrInvalidAxisY
- }
- return &Vec2{X: x, Y: y}, nil
- }
|