vec2.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. )
  7. type Vec2 struct {
  8. X int64
  9. Y int64
  10. }
  11. func NewVec2(axis ...int64) *Vec2 {
  12. if len(axis) == 0 {
  13. return &Vec2{X: 0, Y: 0}
  14. } else if len(axis) == 1 {
  15. return &Vec2{X: axis[0], Y: axis[0]}
  16. } else {
  17. return &Vec2{X: axis[0], Y: axis[1]}
  18. }
  19. }
  20. func (v *Vec2) Clone() *Vec2 {
  21. if v == nil {
  22. return nil
  23. }
  24. return &Vec2{X: v.X, Y: v.Y}
  25. }
  26. func (v *Vec2) Add(axis ...int64) *Vec2 {
  27. if v == nil {
  28. return nil
  29. }
  30. if len(axis) == 0 {
  31. return v
  32. } else if len(axis) == 1 {
  33. v.X += axis[0]
  34. v.Y += axis[0]
  35. return v
  36. } else {
  37. v.X += axis[0]
  38. v.Y += axis[1]
  39. return v
  40. }
  41. }
  42. func (v *Vec2) Sub(axis ...int64) *Vec2 {
  43. if v == nil {
  44. return nil
  45. }
  46. if len(axis) == 0 {
  47. return v
  48. } else if len(axis) == 1 {
  49. v.X -= axis[0]
  50. v.Y -= axis[0]
  51. return v
  52. } else {
  53. v.X -= axis[0]
  54. v.Y -= axis[1]
  55. return v
  56. }
  57. }
  58. func (v *Vec2) Mul(axis ...int64) *Vec2 {
  59. if v == nil {
  60. return nil
  61. }
  62. if len(axis) == 0 {
  63. return v
  64. } else if len(axis) == 1 {
  65. v.X *= axis[0]
  66. v.Y *= axis[0]
  67. return v
  68. } else {
  69. v.X *= axis[0]
  70. v.Y *= axis[1]
  71. return v
  72. }
  73. }
  74. func (v *Vec2) Div(axis ...int64) *Vec2 {
  75. if v == nil {
  76. return nil
  77. }
  78. if len(axis) == 0 {
  79. return v
  80. } else if len(axis) == 1 {
  81. v.X /= axis[0]
  82. v.Y /= axis[0]
  83. return v
  84. } else {
  85. v.X /= axis[0]
  86. v.Y /= axis[1]
  87. return v
  88. }
  89. }
  90. func (v *Vec2) Rem(axis ...int64) *Vec2 {
  91. if v == nil {
  92. return nil
  93. }
  94. if len(axis) == 0 {
  95. return v
  96. } else if len(axis) == 1 {
  97. v.X %= axis[0]
  98. v.Y %= axis[0]
  99. return v
  100. } else {
  101. v.X %= axis[0]
  102. v.Y %= axis[1]
  103. return v
  104. }
  105. }
  106. func (v *Vec2) Set(axis ...int64) *Vec2 {
  107. if v == nil {
  108. return nil
  109. }
  110. if len(axis) == 0 {
  111. v.X = 0
  112. v.Y = 0
  113. return v
  114. } else if len(axis) == 1 {
  115. v.X = axis[0]
  116. v.Y = axis[0]
  117. return v
  118. } else {
  119. v.X = axis[0]
  120. v.Y = axis[1]
  121. return v
  122. }
  123. }
  124. func (v *Vec2) AddBy(o *Vec2) *Vec2 {
  125. if v == nil {
  126. return nil
  127. }
  128. if o == nil {
  129. return v
  130. }
  131. v.X += o.X
  132. v.Y += o.Y
  133. return v
  134. }
  135. func (v *Vec2) SubBy(o *Vec2) *Vec2 {
  136. if v == nil {
  137. return nil
  138. }
  139. if o == nil {
  140. return v
  141. }
  142. v.X -= o.X
  143. v.Y -= o.Y
  144. return v
  145. }
  146. func (v *Vec2) MulBy(o *Vec2) *Vec2 {
  147. if v == nil {
  148. return nil
  149. }
  150. if o == nil {
  151. return v
  152. }
  153. v.X *= o.X
  154. v.Y *= o.Y
  155. return v
  156. }
  157. func (v *Vec2) DivBy(o *Vec2) *Vec2 {
  158. if v == nil {
  159. return nil
  160. }
  161. if o == nil {
  162. return v
  163. }
  164. v.X /= o.X
  165. v.Y /= o.Y
  166. return v
  167. }
  168. func (v *Vec2) RemBy(o *Vec2) *Vec2 {
  169. if v == nil {
  170. return nil
  171. }
  172. if o == nil {
  173. return v
  174. }
  175. v.X -= o.X
  176. v.Y -= o.Y
  177. return v
  178. }
  179. func (v *Vec2) SetTo(o *Vec2) *Vec2 {
  180. if v == nil {
  181. return nil
  182. }
  183. if o == nil {
  184. return v
  185. }
  186. v.X = o.X
  187. v.Y = o.Y
  188. return v
  189. }
  190. func (v *Vec2) Abs() *Vec2 {
  191. if v == nil {
  192. return nil
  193. }
  194. v.X = I64Abs(v.X)
  195. v.Y = I64Abs(v.Y)
  196. return v
  197. }
  198. func I64Abs(i int64) int64 {
  199. if i < 0 {
  200. return -i
  201. }
  202. return i
  203. }
  204. func (v *Vec2) Negate() *Vec2 {
  205. if v == nil {
  206. return nil
  207. }
  208. v.X = -v.X
  209. v.Y = -v.Y
  210. return v
  211. }
  212. func (v *Vec2) Less(axis ...int64) bool {
  213. if v == nil || len(axis) == 0 {
  214. return false
  215. }
  216. if len(axis) == 1 {
  217. return v.X < axis[0] && v.Y < axis[0]
  218. } else {
  219. return v.X < axis[0] && v.Y < axis[1]
  220. }
  221. }
  222. func (v *Vec2) Great(axis ...int64) bool {
  223. if v == nil || len(axis) == 0 {
  224. return false
  225. }
  226. if len(axis) == 1 {
  227. return v.X > axis[0] && v.Y > axis[0]
  228. } else {
  229. return v.X > axis[0] && v.Y > axis[1]
  230. }
  231. }
  232. func (v *Vec2) Eq(axis ...int64) bool {
  233. if v == nil {
  234. return false
  235. }
  236. if len(axis) == 0 {
  237. return v.X == 0 && v.Y == 0
  238. } else if len(axis) == 1 {
  239. return v.X == axis[0] && v.Y == axis[0]
  240. } else {
  241. return v.X == axis[0] && v.Y == axis[1]
  242. }
  243. }
  244. func (v *Vec2) LessThan(o *Vec2) bool {
  245. if v == nil || o == nil {
  246. return false
  247. }
  248. return v.X < o.X && v.Y < o.Y
  249. }
  250. func (v *Vec2) GreatThan(o *Vec2) bool {
  251. if v == nil || o == nil {
  252. return false
  253. }
  254. return v.X > o.X && v.Y > o.Y
  255. }
  256. func (v *Vec2) EqTo(o *Vec2) bool {
  257. if v == nil || o == nil {
  258. return false
  259. }
  260. return v.X == o.X && v.Y == o.Y
  261. }
  262. func (v *Vec2) Dist(axis ...int64) int64 {
  263. if v == nil {
  264. return -1
  265. }
  266. if len(axis) == 0 {
  267. return I64Abs(v.X) + I64Abs(v.Y)
  268. } else if len(axis) == 1 {
  269. a := I64Abs(v.X) + I64Abs(v.Y)
  270. b := I64Abs(axis[0]) + I64Abs(axis[0])
  271. return I64Abs(a - b)
  272. } else {
  273. a := I64Abs(v.X) + I64Abs(v.Y)
  274. b := I64Abs(axis[0]) + I64Abs(axis[1])
  275. return I64Abs(a - b)
  276. }
  277. }
  278. func (v *Vec2) DistTo(o *Vec2) int64 {
  279. if v == nil || o == nil {
  280. return -1
  281. }
  282. a := I64Abs(v.X) + I64Abs(v.Y)
  283. b := I64Abs(o.X) + I64Abs(o.Y)
  284. return I64Abs(a - b)
  285. }
  286. func (v *Vec2) String() string {
  287. return fmt.Sprintf("(%d, %d)", v.X, v.Y)
  288. }
  289. var (
  290. ErrVec2Format error = fmt.Errorf("missing parentheses and/or comma")
  291. ErrTooManyCommas error = fmt.Errorf("missing or too many commas")
  292. ErrInvalidAxisX error = fmt.Errorf("missing or invalid X-axis")
  293. ErrInvalidAxisY error = fmt.Errorf("missing or invalid Y-axis")
  294. )
  295. func StrToVec2(s string) (*Vec2, error) {
  296. if !strings.Contains(s, "(") || !strings.Contains(s, ")") || !strings.Contains(s, ",") {
  297. return nil, ErrVec2Format
  298. }
  299. work := strings.ReplaceAll(s, "(", "")
  300. work = strings.ReplaceAll(work, ")", "")
  301. commas := strings.Count(work, ",")
  302. if commas != 1 {
  303. return nil, ErrTooManyCommas
  304. }
  305. parts := strings.Split(work, ",")
  306. for idx, part := range parts {
  307. parts[idx] = strings.TrimSpace(part)
  308. }
  309. if len(parts) != 2 {
  310. return nil, ErrTooManyCommas
  311. }
  312. x, err := strconv.ParseInt(parts[0], 10, 64)
  313. if err != nil {
  314. return nil, ErrInvalidAxisX
  315. }
  316. y, err := strconv.ParseInt(parts[1], 10, 64)
  317. if err != nil {
  318. return nil, ErrInvalidAxisY
  319. }
  320. return &Vec2{X: x, Y: y}, nil
  321. }