scratch-vm/src/util/math-util.js
2017-04-17 19:42:48 -04:00

68 lines
1.9 KiB
JavaScript

class MathUtil {
/**
* Convert a value from degrees to radians.
* @param {!number} deg Value in degrees.
* @return {!number} Equivalent value in radians.
*/
static degToRad (deg) {
return deg * Math.PI / 180;
}
/**
* Convert a value from radians to degrees.
* @param {!number} rad Value in radians.
* @return {!number} Equivalent value in degrees.
*/
static radToDeg (rad) {
return rad * 180 / Math.PI;
}
/**
* Clamp a number between two limits.
* If n < min, return min. If n > max, return max. Else, return n.
* @param {!number} n Number to clamp.
* @param {!number} min Minimum limit.
* @param {!number} max Maximum limit.
* @return {!number} Value of n clamped to min and max.
*/
static clamp (n, min, max) {
return Math.min(Math.max(n, min), max);
}
/**
* Keep a number between two limits, wrapping "extra" into the range.
* e.g., wrapClamp(7, 1, 5) == 2
* wrapClamp(0, 1, 5) == 5
* wrapClamp(-11, -10, 6) == 6, etc.
* @param {!number} n Number to wrap.
* @param {!number} min Minimum limit.
* @param {!number} max Maximum limit.
* @return {!number} Value of n wrapped between min and max.
*/
static wrapClamp (n, min, max) {
const range = (max - min) + 1;
return n - (Math.floor((n - min) / range) * range);
}
/**
* Convert a value from tan function in degrees.
* @param {!number} angle in degrees
* @return {!number} Correct tan value
*/
static tan (angle) {
angle = angle % 360;
switch (angle) {
case -270:
case 90:
return Infinity;
case -90:
case 270:
return -Infinity;
default:
return parseFloat(Math.tan((Math.PI * angle) / 180).toFixed(10));
}
}
}
module.exports = MathUtil;