@thi.ng/math
Version: 
Assorted common math functions & utilities
386 lines • 10.1 kB
TypeScript
import type { FnN, FnN2, FnN3, FnN4, FnN5, FnN6 } from "@thi.ng/api";
/**
 * Linear interpolation without clamping. Computes `a + (b - a) * t`
 *
 * @param a - start value
 * @param b - end value
 * @param t - interpolation factor `[0,1]`
 */
export declare const mix: FnN3;
/**
 * Bilinear interpolation of given values (`a`,`b`,`c`,`d`).
 *
 * @example
 * ```text
 * c    d
 * +----+
 * |    |
 * +----+
 * a    b
 * ```
 *
 * @param a - BL value
 * @param b - BR value
 * @param c - TL value
 * @param d - TR value
 * @param u - 1st interpolation factor
 * @param v - 2nd interpolation factor
 */
export declare const mixBilinear: FnN6;
/**
 * Computes quadratic bezier interpolation for normalized value `t`.
 *
 * @param a
 * @param b
 * @param c
 * @param t
 */
export declare const mixQuadratic: FnN4;
/**
 * Computes cubic bezier interpolation for normalized value `t`.
 *
 * @param a
 * @param b
 * @param c
 * @param d
 * @param t
 */
export declare const mixCubic: FnN5;
/**
 * Returns hermite interpolation of `a, b, c, d` at normalized position `t`,
 * where `a` and `d` are used as predecessor/successor of `b` / `c` and only
 * inform the tangent of the interpolation curve. The interpolated result is
 * that of `b` and `c`.
 *
 * Assumes all inputs are uniformly spaced. If that's not the case, use
 * {@link mixCubicHermite} with one of the tangent generators supporting
 * non-uniform spacing of points.
 *
 * [Interactive graph](https://www.desmos.com/calculator/j4gf8g9vkr)
 *
 * Source:
 * https://www.musicdsp.org/en/latest/Other/93-hermite-interpollation.html
 *
 * - {@link mixCubicHermite}
 * - {@link tangentCardinal}
 * - {@link tangentDiff3}
 *
 * @param a -
 * @param b -
 * @param c -
 * @param d -
 * @param t -
 */
export declare const mixHermite: FnN5;
/**
 * Computes cubic-hermite interpolation between `a` / `b` at normalized
 * time `t` and using respective tangents `ta` / `tb`.
 *
 * https://en.wikipedia.org/wiki/Cubic_Hermite_spline
 *
 * - {@link mixHermite}
 * - {@link tangentCardinal}
 * - {@link tangentDiff3}
 *
 * @param a -
 * @param ta -
 * @param b -
 * @param tb -
 * @param t -
 */
export declare const mixCubicHermite: FnN5;
/**
 * Similar to {@link mixCubicHermite}, but takes 4 control values (uniformly
 * spaced) and computes tangents automatically. Returns `b` iff `t=0` and `c`
 * iff `t=1.0`.
 *
 * @param a -
 * @param b -
 * @param c -
 * @param d -
 * @param t -
 */
export declare const mixCubicHermiteFromPoints: FnN5;
/**
 * Bicubic interpolation of given 4x4 sample values (in row major order, i.e.
 * `s00..s03` = 1st row).
 *
 * @remarks
 * Result will not be clamped and might fall outside the total range of the
 * input samples.
 *
 * @param s00 -
 * @param s01 -
 * @param s02 -
 * @param s03 -
 * @param s10 -
 * @param s11 -
 * @param s12 -
 * @param s13 -
 * @param s20 -
 * @param s21 -
 * @param s22 -
 * @param s23 -
 * @param s30 -
 * @param s31 -
 * @param s32 -
 * @param s33 -
 * @param u -
 * @param v -
 */
export declare const mixBicubic: (s00: number, s01: number, s02: number, s03: number, s10: number, s11: number, s12: number, s13: number, s20: number, s21: number, s22: number, s23: number, s30: number, s31: number, s32: number, s33: number, u: number, v: number) => number;
/**
 * Helper function for {@link mixCubicHermite}. Computes cardinal tangents based
 * on point neighbors of a point B (not given), i.e. `a` (predecessor) and `c`
 * (successor) and their times (defaults to uniformly spaced). The optional
 * `tension` parameter can be used to scale the tangent where 0.0 produces a
 * Cardinal spline tangent and 1.0 a Catmull-Rom (opposite to the Wikipedia
 * ref).
 *
 * https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Cardinal_spline
 *
 * @param prev -
 * @param next -
 * @param scale -
 * @param ta -
 * @param tc -
 */
export declare const tangentCardinal: (prev: number, next: number, scale?: number, ta?: number, tc?: number) => number;
/**
 * Helper function for {@link mixCubicHermite}. Computes tangent for `curr`,
 * based on 3-point finite difference, where `prev` & `next` are `curr`'s
 * neighbors and the `tX` the three points' respective time values. The latter
 * are equally spaced by default (each 1.0 apart).
 *
 * Using this function with equal spacing of 1.0 and together with
 * {@link mixCubicHermite} will produce same results as the somewhat optimized
 * variant {@link mixHermite}.
 *
 * https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference
 *
 * @param prev -
 * @param curr -
 * @param next -
 * @param ta -
 * @param tb -
 * @param tc -
 */
export declare const tangentDiff3: (prev: number, curr: number, next: number, ta?: number, tb?: number, tc?: number) => number;
/**
 * HOF interpolator. Takes a timing function `f` and interval `[from,to]`.
 * Returns function which takes normalized time (in `[0,1]` range) as single arg
 * and returns interpolated value.
 *
 * @example
 * ```ts tangle:../export/tween.ts
 * import { easeInOut2, tween } from "@thi.ng/math";
 *
 * // create tweening function
 * const anim = tween(easeInOut2, 100, 200);
 *
 * for(let i=0; i<=10; i++) console.log(anim(i / 10));
 * // 100
 * // 102
 * // 108
 * // 118
 * // 132
 * // 150
 * // 168
 * // 182
 * // 192
 * // 198
 * // 200
 * ```
 *
 * @param f -
 * @param from -
 * @param to -
 */
export declare const tween: (f: (t: number) => number, from: number, to: number) => (t: number) => number;
/**
 * Circular interpolation (ease out): `sqrt(1 - (1 - t)^2)`
 *
 * @remarks
 * [Interactive graph](https://www.desmos.com/calculator/tisoiazdrw)
 *
 * @param t - interpolation factor `[0,1]`
 */
export declare const circular: FnN;
/**
 * Inverse/flipped version of {@link circular} (ease in).
 *
 * @remarks
 * [Interactive graph](https://www.desmos.com/calculator/tisoiazdrw)
 *
 * @param t - interpolation factor `[0,1]`
 */
export declare const invCircular: FnN;
/**
 * Zoomlens interpolation with customizable lens position, behavior and
 * strength.
 *
 * @remarks
 * Lens position must be given in `(0,1)` interval. Lens strength must be in
 * `[-1,1]` range. If negative, the lens will be bundling values near `pos`, if
 * positive the lens has dilating characteristics and will spread values near
 * `pos` towards the edges.
 *
 * Also see {@link schlick} for an alternative approach and {@link tween} for
 * reference to below example.
 *
 * @example
 * ```ts tangle:../export/lens.ts
 * import { mix, lens, tween } from "@thi.ng/math";
 * import { partial } from "@thi.ng/compose";
 *
 * // interpolated position in [100..400] interval for given `t`
 * // const y = mix(100, 400, lens(0.5, 1, t));
 *
 * // or compose tween function via `tween()` & `partial()`
 * const f = tween(partial(lens, 0.75, 1), 100, 400);
 *
 * for(let i=0; i<=10; i++) console.log(f(i / 10));
 * // 100.0
 * // 102.0
 * // 108.1
 * // 118.7
 * // 134.6
 * // 157.2
 * // 190.0
 * // 244.2
 * // 370.0
 * // 393.7
 * // 400.0
 * ```
 *
 * @param pos - lens pos
 * @param strength - lens strength
 * @param t - interpolation factor `[0,1]`
 */
export declare const lens: FnN3;
export declare const cosine: FnN;
export declare const decimated: FnN2;
/**
 * Spring oscillator with damping.
 *
 * @remarks
 * [Interactive graph](https://www.desmos.com/calculator/tywbpw8pck)
 *
 * @param k
 * @param amp
 * @param t
 */
export declare const bounce: FnN3;
/**
 * Exponential easing.
 *
 * - `ease = 1` -> linear
 * - `ease > 1` -> ease in
 * - `ease < 1` -> ease out
 *
 * @param ease - easing behavior [0.0 .. ∞]
 * @param t -
 */
export declare const ease: FnN2;
/**
 * Impulse generator. Peaks at `t = 1/k`
 *
 * @param k - impulse width (higher values => shorter impulse)
 */
export declare const impulse: FnN2;
export declare const gain: FnN2;
export declare const parabola: FnN2;
export declare const cubicPulse: FnN3;
/**
 * Unnormalized Sinc function: sin(x)/x. Returns 1 for t=0.
 *
 * @remarks
 * https://en.wikipedia.org/wiki/Sinc_function
 *
 * @param k -
 * @param t -
 */
export declare const sinc: FnN;
/**
 * Normalized Sinc function, returns sinc(π*k*t).
 *
 * @remarks
 * https://en.wikipedia.org/wiki/Sinc_function
 *
 * See {@link sinc}
 *
 * @param k -
 * @param t -
 */
export declare const sincNormalized: FnN2;
/**
 * Lanczos filter. Returns `sinc(πt)sinc(πt/a)` iff `t` in (-a,a) interval, else
 * returns 0.
 *
 * @remarks
 * [Interactive graph](https://www.desmos.com/calculator/pmypqgefle)
 *
 * @param a -
 * @param t -
 */
export declare const lanczos: FnN2;
/**
 * Sigmoid function for inputs arounds center bias.
 *
 * @remarks
 * Updated in v3.0.0 to add bias value to satisfy more use cases. Use
 * {@link sigmoid01} for old behavior.
 *
 * @param bias - center value (for which result = 0.5)
 * @param k - steepness
 * @param t - input value
 */
export declare const sigmoid: FnN3;
/**
 * Sigmoid function for inputs in `[0,1]` interval. Center bias = 0.5.
 *
 * @param k - steepness
 * @param t - input value
 */
export declare const sigmoid01: FnN2;
/**
 * Sigmoid function for inputs in `[-1,1]` interval. Center bias = 0
 *
 * @param k -
 * @param t -
 */
export declare const sigmoid11: FnN2;
/**
 * Generalized Schlick bias gain curve, based on:
 * https://arxiv.org/abs/2010.09714
 *
 * @remarks
 * [Interactive graph](https://www.desmos.com/calculator/u6bkm5rb7t)
 *
 * @param a - curve strength. recommended `(0,64]`
 * @param b - pivot position `[0,1]`
 * @param t - input val `[0,1]`
 */
export declare const schlick: FnN3;
/**
 * Computes exponential factor to interpolate from `a` to `b` over `num` steps.
 * I.e. multiplying `a` with the returned factor will yield `b` after `num`
 * steps. All args must be > 0.
 *
 * @param a -
 * @param b -
 * @param num -
 */
export declare const expFactor: FnN3;
/**
 * Computes gaussian bell curve for given center `bias` and `sigma` (spread).
 *
 * @remarks
 * [Interactive graph](https://www.desmos.com/calculator/aq6hdzxprv)
 *
 * @param bias -
 * @param sigma -
 * @param t -
 */
export declare const gaussian: FnN3;
//# sourceMappingURL=mix.d.ts.map