File size: 1,025 Bytes
5e0e982
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/** Gesture helpers: Apple projection, rubber-band, velocity samples. */

export function project(
  vPxPerSec: number,
  decelerationRate = 0.998,
): number {
  return ((vPxPerSec / 1000) * decelerationRate) / (1 - decelerationRate);
}

export function rubberband(
  overshoot: number,
  dimension: number,
  constant = 0.55,
): number {
  if (dimension <= 0) return 0;
  const sign = Math.sign(overshoot) || 1;
  const magnitude = Math.abs(overshoot);
  return (
    (sign * dimension * constant * magnitude) /
    (dimension + constant * magnitude)
  );
}

export type PointerSample = { t: number; y: number; x: number };

export function velocityFromSamples(
  samples: PointerSample[],
  axis: "x" | "y" = "y",
): number {
  if (samples.length < 2) return 0;
  const recent = samples.slice(-5);
  const first = recent[0];
  const last = recent[recent.length - 1];
  const dt = last.t - first.t;
  if (dt <= 0) return 0;
  const delta = axis === "y" ? last.y - first.y : last.x - first.x;
  return (delta / dt) * 1000;
}