math.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package math
  2. import (
  3. "f1-game/internal/types"
  4. "math"
  5. )
  6. func Max[E types.Ordered](val E, others ...E) E {
  7. maxVal := val
  8. for _, v := range others {
  9. if v > maxVal {
  10. maxVal = v
  11. }
  12. }
  13. return maxVal
  14. }
  15. func Min[E types.Ordered](val E, others ...E) E {
  16. minVal := val
  17. for _, v := range others {
  18. if v < minVal {
  19. minVal = v
  20. }
  21. }
  22. return minVal
  23. }
  24. func Round[E types.FloatType, T types.Number](val E) T {
  25. return T(math.Round(float64(val)))
  26. }
  27. func Ceil[E types.FloatType, T types.Number](val E) T {
  28. return T(math.Ceil(float64(val)))
  29. }
  30. func Floor[E types.FloatType, T types.Number](val E) T {
  31. return T(math.Floor(float64(val)))
  32. }
  33. // GetPointDistance 获取两点之间的距离(格子数)
  34. // 采用odd-q offset坐标系(奇数列向下偏移)
  35. // 使用cube坐标计算六边形网格距离
  36. func GetPointDistance(x1, y1, x2, y2 int32) int32 {
  37. // 转换为cube坐标
  38. // cube.x = offset.x
  39. // cube.z = offset.y - (offset.x + (offset.x&1)) / 2
  40. // cube.y = -cube.x - cube.z
  41. c1x := x1
  42. c1z := y1 - (x1+(x1&1))/2
  43. c1y := -c1x - c1z
  44. c2x := x2
  45. c2z := y2 - (x2+(x2&1))/2
  46. c2y := -c2x - c2z
  47. // cube坐标下的距离公式: (|dx| + |dy| + |dz|) / 2
  48. dx := c1x - c2x
  49. dy := c1y - c2y
  50. dz := c1z - c2z
  51. if dx < 0 {
  52. dx = -dx
  53. }
  54. if dy < 0 {
  55. dy = -dy
  56. }
  57. if dz < 0 {
  58. dz = -dz
  59. }
  60. return (dx + dy + dz) / 2
  61. }