package math import ( "f1-game/internal/types" "math" ) func Max[E types.Ordered](val E, others ...E) E { maxVal := val for _, v := range others { if v > maxVal { maxVal = v } } return maxVal } func Min[E types.Ordered](val E, others ...E) E { minVal := val for _, v := range others { if v < minVal { minVal = v } } return minVal } func Round[E types.FloatType, T types.Number](val E) T { return T(math.Round(float64(val))) } func Ceil[E types.FloatType, T types.Number](val E) T { return T(math.Ceil(float64(val))) } func Floor[E types.FloatType, T types.Number](val E) T { return T(math.Floor(float64(val))) } // GetPointDistance 获取两点之间的距离(格子数) // 采用odd-q offset坐标系(奇数列向下偏移) // 使用cube坐标计算六边形网格距离 func GetPointDistance(x1, y1, x2, y2 int32) int32 { // 转换为cube坐标 // cube.x = offset.x // cube.z = offset.y - (offset.x + (offset.x&1)) / 2 // cube.y = -cube.x - cube.z c1x := x1 c1z := y1 - (x1+(x1&1))/2 c1y := -c1x - c1z c2x := x2 c2z := y2 - (x2+(x2&1))/2 c2y := -c2x - c2z // cube坐标下的距离公式: (|dx| + |dy| + |dz|) / 2 dx := c1x - c2x dy := c1y - c2y dz := c1z - c2z if dx < 0 { dx = -dx } if dy < 0 { dy = -dy } if dz < 0 { dz = -dz } return (dx + dy + dz) / 2 }