interpolate.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. export function normalize (value: number, min: number, max: number) {
  7. return (value - min) / (max - min);
  8. }
  9. export function clamp (value: number, min: number, max: number) {
  10. return Math.max(min, Math.min(max, value));
  11. }
  12. export function pclamp (value: number) {
  13. return clamp(value, 0, 100);
  14. }
  15. export function saturate (value: number) {
  16. return clamp(value, 0, 1);
  17. }
  18. export function damp (value: number, dampingFactor: number) {
  19. const dampedValue = value * dampingFactor;
  20. return Math.abs(dampedValue) < 0.1 ? 0 : dampedValue;
  21. }
  22. export function lerp (start: number, stop: number, alpha: number) {
  23. return start + (stop - start) * alpha;
  24. }
  25. /** Catmul-Rom spline */
  26. export function spline (p0: number, p1: number, p2: number, p3: number, t: number, tension: number) {
  27. const v0 = (p2 - p0) * tension;
  28. const v1 = (p3 - p1) * tension;
  29. const t2 = t * t;
  30. const t3 = t * t2;
  31. return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;
  32. }
  33. export function quadraticBezier(p0: number, p1: number, p2: number, t: number) {
  34. const k = 1 - t;
  35. return (k * k * p0) + (2 * k * t * p1) + (t * t * p2);
  36. }
  37. export function smoothstep (min: number, max: number, x: number) {
  38. x = saturate(normalize(x, min, max));
  39. return x * x * (3 - 2 * x);
  40. }
  41. export function smootherstep (min: number, max: number, x: number) {
  42. x = saturate(normalize(x, min, max));
  43. return x * x * x * (x * (x * 6 - 15) + 10);
  44. }
  45. export function smootheststep (min: number, max: number, x: number) {
  46. x = saturate(normalize(x, min, max));
  47. return -20 * Math.pow(x, 7) + 70 * Math.pow(x, 6) - 84 * Math.pow(x, 5) + 35 * Math.pow(x, 4);
  48. }
  49. export function almostIdentity (value: number, start: number, stop: number) {
  50. if (value > start) return value;
  51. const a = 2 * stop - start;
  52. const b = 2 * start - 3 * stop;
  53. const t = value / start;
  54. return (a * t + b) * t * t + stop;
  55. }