1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2026-05-09 22:59:10 -04:00
Files
gravestench 0472233949 update to d2math, changed/added components, scenes
* animation renamed to sprite
* renderable/surface renamed to texture
* added in d2math: Vector2, Vector3, Vector4, Matrix3, Matrix4, Quaternion
* worked a bit on the loading scene, main menu scene
2020-12-07 12:44:11 -08:00

163 lines
3.0 KiB
Go

package d2math
import "math"
// EqualsApprox returns true if the difference between a and b is less than Epsilon.
func EqualsApprox(a, b float64) bool {
return Abs(a-b) < Epsilon
}
// CompareApprox returns an integer between -1 and 1 describing the comparison of floats a and b. 0 will be returned if
// the absolute difference between a and b is less than Epsilon.
func CompareApprox(a, b float64) int {
delta := a - b
if Abs(delta) < Epsilon {
return 0
}
if delta > 0 {
return 1
}
return -1
}
// Abs returns the absolute value of a. It is a less CPU intensive version of the standard library math.Abs().
func Abs(a float64) float64 {
if a < 0 {
return -a
}
return a
}
// Clamp returns a clamped to min and max.
func Clamp(a, min, max float64) float64 {
if a > max {
return max
} else if a < min {
return min
}
return a
}
// Sign returns the sign of a.
func Sign(a float64) int {
switch {
case a < 0:
return -1
case a > 0:
return +1
}
return 0
}
// Lerp returns the linear interpolation from a to b using interpolator x.
func Lerp(a, b, x float64) float64 {
return a + x*(b-a)
}
// Unlerp returns the intepolator Lerp would require to return x when given
// a and b. The x argument of this function can be thought of as the return
// value of lerp. The return value of this function can be used as x in
// Lerp.
func Unlerp(a, b, x float64) float64 {
return (x - a) / (b - a)
}
// WrapInt wraps x to between 0 and max. For example WrapInt(450, 360) would return 90.
func WrapInt(x, max int) int {
wrapped := x % max
if wrapped < 0 {
return max + wrapped
}
return wrapped
}
// MinInt returns the minimum of the given values
func MinInt(a, b int) int {
if a < b {
return a
}
return b
}
// MaxInt returns the maximum of the given values
func MaxInt(a, b int) int {
if a > b {
return a
}
return b
}
// Min returns the lower of two values
func Min(a, b uint32) uint32 {
if a < b {
return a
}
return b
}
// Max returns the higher of two values
func Max(a, b uint32) uint32 {
if a > b {
return a
}
return b
}
// MaxInt32 returns the higher of two values
func MaxInt32(a, b int32) int32 {
if a > b {
return a
}
return b
}
// AbsInt32 returns the absolute of the given int32
func AbsInt32(a int32) int32 {
if a < 0 {
return -a
}
return a
}
// MinInt32 returns the higher of two values
func MinInt32(a, b int32) int32 {
if a < b {
return a
}
return b
}
// BytesToInt32 converts 4 bytes to int32
// IsoToScreen converts isometric coordinates to screenspace coordinates
// ScreenToIso converts screenspace coordinates to isometric coordinates
// GetRadiansBetween returns the radians between two points. 0rad is facing to the right.
func GetRadiansBetween(p1X, p1Y, p2X, p2Y float64) float64 {
deltaY := p2Y - p1Y
deltaX := p2X - p1X
return math.Atan2(deltaY, deltaX)
}
// ClampInt ensures that the given value is between or equal to the given min or max
func ClampInt(value, min, max int) int {
return int(math.Min(math.Max(float64(value), float64(min)), float64(max)))
}