animejs
Version:
JavaScript animation engine
65 lines (55 loc) • 1.58 kB
JavaScript
/**
* Anime.js - easings - CJS
* @version v4.5.0
* @license MIT
* @copyright 2026 - Julian Garnier
*/
;
var helpers = require('../../core/helpers.cjs');
var none = require('../none.cjs');
/**
* @import {
* EasingFunction,
* } from '../../types/index.js'
*/
/**
* Cubic Bezier solver adapted from https://github.com/gre/bezier-easing
* (c) 2014 Gaëtan Renaudeau
*/
/**
* @param {Number} aT
* @param {Number} aA1
* @param {Number} aA2
* @return {Number}
*/
const calcBezier = (aT, aA1, aA2) => (((1 - 3 * aA2 + 3 * aA1) * aT + (3 * aA2 - 6 * aA1)) * aT + (3 * aA1)) * aT;
/**
* @param {Number} aX
* @param {Number} mX1
* @param {Number} mX2
* @return {Number}
*/
const binarySubdivide = (aX, mX1, mX2) => {
let aA = 0, aB = 1, currentX, currentT, i = 0;
do {
currentT = aA + (aB - aA) / 2;
currentX = calcBezier(currentT, mX1, mX2) - aX;
if (currentX > 0) {
aB = currentT;
} else {
aA = currentT;
}
} while (helpers.abs(currentX) > .0000001 && ++i < 100);
return currentT;
};
/**
* @param {Number} [mX1] The x coordinate of the first point
* @param {Number} [mY1] The y coordinate of the first point
* @param {Number} [mX2] The x coordinate of the second point
* @param {Number} [mY2] The y coordinate of the second point
* @return {EasingFunction}
*/
const cubicBezier = (mX1 = 0.5, mY1 = 0.0, mX2 = 0.5, mY2 = 1.0) => (mX1 === mY1 && mX2 === mY2) ? none.none :
t => t === 0 || t === 1 ? t :
calcBezier(binarySubdivide(t, mX1, mX2), mY1, mY2);
exports.cubicBezier = cubicBezier;