From 92f91816b9a8040f02107df21daaa3d4f558b627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Gir=C3=A3o=20Serr=C3=A3o?= Date: Sat, 4 Sep 2021 22:47:45 +0100 Subject: [PATCH] Add script that generates test data for easings. --- tools/gen_easings_tests.ts | 233 +++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 tools/gen_easings_tests.ts diff --git a/tools/gen_easings_tests.ts b/tools/gen_easings_tests.ts new file mode 100644 index 000000000..ceb5de02a --- /dev/null +++ b/tools/gen_easings_tests.ts @@ -0,0 +1,233 @@ +/* + * Easing functions from http://easings.net; + * This script generates the data points used to test the _easing.py functions. + */ + +function easeInSine(x: number): number { + return 1 - cos((x * PI) / 2); +} + +function easeOutSine(x: number): number { + return sin((x * PI) / 2); +} + +function easeInOutSine(x: number): number { + return -(cos(PI * x) - 1) / 2; +} + + +function easeInQuad(x: number): number { + return x * x; +} + +function easeOutQuad(x: number): number { + return 1 - (1 - x) * (1 - x); +} + +function easeInOutQuad(x: number): number { + return x < 0.5 ? 2 * x * x : 1 - pow(-2 * x + 2, 2) / 2; +} + + +function easeInCubic(x: number): number { + return x * x * x; +} + +function easeOutCubic(x: number): number { + return 1 - pow(1 - x, 3); +} + +function easeInOutCubic(x: number): number { + return x < 0.5 ? 4 * x * x * x : 1 - pow(-2 * x + 2, 3) / 2; +} + + +function easeInQuart(x: number): number { + return x * x * x * x; +} + +function easeOutQuart(x: number): number { + return 1 - pow(1 - x, 4); +} + +function easeInOutQuart(x: number): number { + return x < 0.5 ? 8 * x * x * x * x : 1 - pow(-2 * x + 2, 4) / 2; +} + + +function easeInQuint(x: number): number { + return x * x * x * x * x; +} + +function easeOutQuint(x: number): number { + return 1 - pow(1 - x, 5); +} + +function easeInOutQuint(x: number): number { + return x < 0.5 ? 16 * x * x * x * x * x : 1 - pow(-2 * x + 2, 5) / 2; +} + + +function easeInExpo(x: number): number { + return x === 0 ? 0 : pow(2, 10 * x - 10); +} + +function easeOutExpo(x: number): number { + return x === 1 ? 1 : 1 - pow(2, -10 * x); +} + +function easeInOutExpo(x: number): number { + return x === 0 + ? 0 + : x === 1 + ? 1 + : x < 0.5 ? pow(2, 20 * x - 10) / 2 + : (2 - pow(2, -20 * x + 10)) / 2; +} + + +function easeInCirc(x: number): number { + return 1 - sqrt(1 - pow(x, 2)); +} + +function easeOutCirc(x: number): number { + return sqrt(1 - pow(x - 1, 2)); +} + +function easeInOutCirc(x: number): number { + return x < 0.5 + ? (1 - sqrt(1 - pow(2 * x, 2))) / 2 + : (sqrt(1 - pow(-2 * x + 2, 2)) + 1) / 2; +} + + +function easeInBack(x: number): number { + const c1 = 1.70158; + const c3 = c1 + 1; + + return c3 * x * x * x - c1 * x * x; +} + +function easeOutBack(x: number): number { + const c1 = 1.70158; + const c3 = c1 + 1; + + return 1 + c3 * pow(x - 1, 3) + c1 * pow(x - 1, 2); +} + +function easeInOutBack(x: number): number { + const c1 = 1.70158; + const c2 = c1 * 1.525; + + return x < 0.5 + ? (pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2 + : (pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2; +} + + +function easeInElastic(x: number): number { + const c4 = (2 * Math.PI) / 3; + + return x === 0 + ? 0 + : x === 1 + ? 1 + : -pow(2, 10 * x - 10) * sin((x * 10 - 10.75) * c4); +} + +function easeOutElastic(x: number): number { + const c4 = (2 * Math.PI) / 3; + + return x === 0 + ? 0 + : x === 1 + ? 1 + : pow(2, -10 * x) * sin((x * 10 - 0.75) * c4) + 1; +} + +function easeInOutElastic(x: number): number { + const c5 = (2 * Math.PI) / 4.5; + + return x === 0 + ? 0 + : x === 1 + ? 1 + : x < 0.5 + ? -(pow(2, 20 * x - 10) * sin((20 * x - 11.125) * c5)) / 2 + : (pow(2, -20 * x + 10) * sin((20 * x - 11.125) * c5)) / 2 + 1; + +} + + +function easeInBounce(x: number): number { + return 1 - easeOutBounce(1 - x); +} + +function easeOutBounce(x: number): number { + const n1 = 7.5625; + const d1 = 2.75; + + if (x < 1 / d1) { + return n1 * x * x; + } else if (x < 2 / d1) { + return n1 * (x -= 1.5 / d1) * x + 0.75; + } else if (x < 2.5 / d1) { + return n1 * (x -= 2.25 / d1) * x + 0.9375; + } else { + return n1 * (x -= 2.625 / d1) * x + 0.984375; + } +} + +function easeInOutBounce(x: number): number { + return x < 0.5 + ? (1 - easeOutBounce(1 - 2 * x)) / 2 + : (1 + easeOutBounce(2 * x - 1)) / 2; +} + + +const funcs = [ + easeInSine, easeOutSine, easeInOutSine, easeInQuad, easeOutQuad, easeInOutQuad, + easeInCubic, easeOutCubic, easeInOutCubic, easeInQuart, easeOutQuart, easeInOutQuart, + easeInQuint, easeOutQuint, easeInOutQuint, easeInExpo, easeOutExpo, easeInOutExpo, + easeInCirc, easeOutCirc, easeInOutCirc, easeInBack, easeOutBack, easeInOutBack, + easeInElastic, easeOutElastic, easeInOutElastic, easeInBounce, easeOutBounce, easeInOutBounce +]; + +const points = [ + 0.0, + 0.05, + 0.1, + 0.15, + 0.2, + 0.25, + 0.3, + 0.35, + 0.4, + 0.45, + 0.5, + 0.55, + 0.6, + 0.65, + 0.7, + 0.75, + 0.8, + 0.85, + 0.9, + 0.95, + 1.0 +]; + +let PI = Math.PI; +let cos = Math.cos; +let sin = Math.sin; +let pow = Math.pow; +let sqrt = Math.sqrt; + +for (func of funcs) { + console.log(func.name); + let values = []; + for (point of points) { + values.push(func(point)); + } + console.log(values); +}