mirror of
https://github.com/spark-store-project/spark-store-abyss
synced 2025-12-16 20:31:38 +08:00
Co-authored-by: Sylvanysc <Sylvanysc@users.noreply.github.com> Co-authored-by: xudeyu444 <xudeyu444@users.noreply.github.com> Co-authored-by: 奕 <a18355849597@outlook.com>
42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
export function range(start: number, end: number, x: number): number {
|
|
return Math.min(end, Math.max(start, x));
|
|
}
|
|
|
|
export function getCubicBezier(x1: number, y1: number, x2: number, y2: number) {
|
|
return (t: number) => {
|
|
const oneMinusT = 1 - t;
|
|
const oneMinusTSquared = oneMinusT * oneMinusT; // (1-t)^2
|
|
const oneMinusTCubed = oneMinusTSquared * oneMinusT; // (1-t)^3
|
|
|
|
const tSquared = t * t; // t^2
|
|
const tCubed = tSquared * t; // t^3
|
|
|
|
// Y(t) = P0y*(1-t)^3 + 3*P1y*t*(1-t)^2 + 3*P2y*t^2*(1-t) + P3y*t^3
|
|
const y =
|
|
0 * oneMinusTCubed +
|
|
3 * y2 * t * oneMinusTSquared +
|
|
3 * y1 * tSquared * oneMinusT +
|
|
1 * tCubed;
|
|
|
|
return y;
|
|
};
|
|
}
|
|
|
|
export function mergeTimingFunctions(
|
|
fn1: (t: number) => number,
|
|
fn2: (t: number) => number
|
|
): (t: number) => number {
|
|
return (t: number) => {
|
|
if (t < 0.5) {
|
|
return fn1(t * 2) / 2; // Scale down for first half
|
|
}
|
|
return fn2((t - 0.5) * 2) / 2 + 0.5; // Scale down for second half and offset
|
|
};
|
|
}
|
|
|
|
export const eieo = getCubicBezier(0.5, 0.0, 0.5, 1.0);
|
|
|
|
export const eieo2 = mergeTimingFunctions(eieo, eieo);
|
|
|
|
export const riro = getCubicBezier(0.0, 0.5, 1.0, 0.5);
|