@footgun/math-gap
v0.2.0
Published
math functions that are missing or lacking from the standard javascript library
Readme
math-gap
math functions that are missing or lacking from the standard javascript library
clamp
It's 2024 and Javascript still doesn't have clamp...
Usage
clamp(value, a, b)
Returns value, if it is between a and b. Otherwise, returns the number
it's gone past.
lerp
Linearly interpolate between 2 values
Usage
lerp(a, b, amount)
amount should be a value between 0 and 1, indicating how far to interpolate from a to b
const val = lerp(10, 20, 0.5) // val === 15lerp-degrees
Linearly interpolate between 2 angles in degrees
Usage
lerpDegrees(a, b, amount)
amount should be a value between 0 and 1, indicating how far to interpolate from a to b
const val = lerpDegrees(120, 340, 0.5) // val === 230sign
Math.sign was added to Javascript somewhat recently. It's behavior regarding 0 is to not give it
a positive or negative sign:
Math.sign(1) // returns 1
Math.sign(0) // returns 0
Math.sign(-1) // returns -1In some cases, we want want to consider 0 as a positive value, and alias 0 to 1. This comes up in games and simulations, e.g., a 2d sprite can only face left or right (-1 or 1)
That's what this module does:
sign(1) // returns 1
sign(0) // returns 1
sign(-1) // returns -1to-degrees
Converts radians to its corresponding value in degrees.
const d1 = toDegrees(0.5235987755982988) // d1 === 29.999999999999996
const d2 = toDegrees(0.5235987755982989) // d2 === 30.000000000000004to-radians
Converts degrees to its corresponding value in radians.
const val = toRadians(30) // val === 0.5235987755982988bitfield
get and set bits
let flags = 0 // a byte (contains 8 bits)
flags = bitfield.set(flags, 0, true) // flags === 00000001
flags = bitfield.set(flags, 2, true) // flags === 00000101
console.log(bitfield.get(flags, 2)) // true
console.log(bitfield.get(flags, 1)) // false
flags = bitfield.set(flags, 0, false) // flags === 00000100quantize-angle
pack/unpack an angle expressed in radians to/frame a byte
const angle = Math.PI * 0.3
const u = new Uint8Array(1)
u[0] = quantizeAngle.pack(angle)
const angle2 = quantizeAngle.unpack(u[0])
console.log(angle === angle2) // true