Created
February 13, 2019 20:14
-
-
Save xposedbones/9c08897ad1cafef60208faac9c39e487 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export default class Easing { | |
// Based on https://github.com/danro/jquery-easing/blob/master/jquery.easing.js | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInQuad(t: number, b: number, c: number, d: number): number { | |
return c * (t /= d) * t + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeOutQuad(t: number, b: number, c: number, d: number): number { | |
return -c * (t /= d) * (t - 2) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInOutQuad(t: number, b: number, c: number, d: number): number { | |
if ((t /= d / 2) < 1) return c / 2 * t * t + b; | |
return -c / 2 * ((--t) * (t - 2) - 1) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInCubic(t: number, b: number, c: number, d: number): number { | |
return c * (t /= d) * t * t + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeOutCubic(t: number, b: number, c: number, d: number): number { | |
return c * ((t = t / d - 1) * t * t + 1) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInOutCubic(t: number, b: number, c: number, d: number): number { | |
if ((t /= d / 2) < 1) return c / 2 * t * t * t + b; | |
return c / 2 * ((t -= 2) * t * t + 2) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInQuart(t: number, b: number, c: number, d: number): number { | |
return c * (t /= d) * t * t * t + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeOutQuart(t: number, b: number, c: number, d: number): number { | |
return -c * ((t = t / d - 1) * t * t * t - 1) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInOutQuart(t: number, b: number, c: number, d: number): number { | |
if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b; | |
return -c / 2 * ((t -= 2) * t * t * t - 2) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInQuint(t: number, b: number, c: number, d: number): number { | |
return c * (t /= d) * t * t * t * t + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeOutQuint(t: number, b: number, c: number, d: number): number { | |
return c * ((t = t / d - 1) * t * t * t * t + 1) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInOutQuint(t: number, b: number, c: number, d: number): number { | |
if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b; | |
return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInSine(t: number, b: number, c: number, d: number): number { | |
return -c * Math.cos(t / d * (Math.PI / 2)) + c + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeOutSine(t: number, b: number, c: number, d: number): number { | |
return c * Math.sin(t / d * (Math.PI / 2)) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInOutSine(t: number, b: number, c: number, d: number): number { | |
return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInExpo(t: number, b: number, c: number, d: number): number { | |
return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeOutExpo(t: number, b: number, c: number, d: number): number { | |
return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInOutExpo(t: number, b: number, c: number, d: number): number { | |
if (t == 0) return b; | |
if (t == d) return b + c; | |
if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b; | |
return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInCirc(t: number, b: number, c: number, d: number): number { | |
return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeOutCirc(t: number, b: number, c: number, d: number): number { | |
return c * Math.sqrt(1 - (t = t / d - 1) * t) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInOutCirc(t: number, b: number, c: number, d: number): number { | |
if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b; | |
return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInElastic(t: number, b: number, c: number, d: number): number { | |
let s: number = 1.70158; | |
let p: number = 0; | |
let a: number = c; | |
if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!p) p = d * .3; | |
if (a < Math.abs(c)) { a = c; s = p / 4; } | |
else s = p / (2 * Math.PI) * Math.asin(c / a); | |
return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeOutElastic(t: number, b: number, c: number, d: number): number { | |
let s: number = 1.70158; | |
let p: number = 0; | |
let a: number = c; | |
if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!p) p = d * .3; | |
if (a < Math.abs(c)) { a = c; s = p / 4; } | |
else s = p / (2 * Math.PI) * Math.asin(c / a); | |
return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInOutElastic(t: number, b: number, c: number, d: number): number { | |
let s: number = 1.70158; | |
let p: number = 0; | |
let a: number = c; | |
if (t == 0) return b; if ((t /= d / 2) == 2) return b + c; if (!p) p = d * (.3 * 1.5); | |
if (a < Math.abs(c)) { a = c; s = p / 4; } | |
else s = p / (2 * Math.PI) * Math.asin(c / a); | |
if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; | |
return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInBack(t: number, b: number, c: number, d: number): number { | |
let s: number = 1.70158; | |
return c * (t /= d) * t * ((s + 1) * t - s) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeOutBack(t: number, b: number, c: number, d: number): number { | |
let s: number = 1.70158; | |
return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInOutBack(t: number, b: number, c: number, d: number): number { | |
let s: number = 1.70158; | |
if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; | |
return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInBounce(t: number, b: number, c: number, d: number): number { | |
return c - Easing.easeOutBounce(d - t, 0, c, d) + b; | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeOutBounce(t: number, b: number, c: number, d: number): number { | |
if ((t /= d) < (1 / 2.75)) { | |
return c * (7.5625 * t * t) + b; | |
} else if (t < (2 / 2.75)) { | |
return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b; | |
} else if (t < (2.5 / 2.75)) { | |
return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b; | |
} else { | |
return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b; | |
} | |
} | |
/** | |
* @param {number} t - Current Time | |
* @param {number} b - Start Value | |
* @param {number} c - Target Value | |
* @param {number} d - Duration | |
*/ | |
static easeInOutBounce(t: number, b: number, c: number, d: number): number { | |
if (t < d / 2) return Easing.easeInBounce(t * 2, 0, c, d) * .5 + b; | |
return Easing.easeOutBounce(t * 2 - d, 0, c, d) * .5 + c * .5 + b; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment