All Downloads are FREE. Search and download functionalities are using the official Maven repository.

package.lib.composables.touch.mjs.map Maven / Gradle / Ivy

{"version":3,"file":"touch.mjs","names":["CircularBuffer","HORIZON","HISTORY","kineticEnergyToVelocity","work","sqrt2","Math","sqrt","abs","calculateImpulseVelocity","samples","length","t","d","i","vprev","vcurr","useVelocity","touches","addMovement","e","Array","from","changedTouches","forEach","touch","identifier","push","timeStamp","endTouch","getVelocity","id","values","reverse","Error","newest","x","y","val","clientX","clientY","direction","absX","absY","oops"],"sources":["../../src/composables/touch.ts"],"sourcesContent":["// Utilities\nimport { CircularBuffer } from '@/util'\n\nconst HORIZON = 100 // ms\nconst HISTORY = 20 // number of samples to keep\n\nexport interface Sample {\n  t: number\n  d: number\n}\n\n/** @see https://android.googlesource.com/platform/frameworks/native/+/master/libs/input/VelocityTracker.cpp */\nfunction kineticEnergyToVelocity (work: number) {\n  const sqrt2 = 1.41421356237\n  return (work < 0 ? -1.0 : 1.0) * Math.sqrt(Math.abs(work)) * sqrt2\n}\n\n/**\n * Returns pointer velocity in px/s\n */\nexport function calculateImpulseVelocity (samples: Sample[]) {\n  // The input should be in reversed time order (most recent sample at index i=0)\n  if (samples.length < 2) {\n    // if 0 or 1 points, velocity is zero\n    return 0\n  }\n  // if (samples[1].t > samples[0].t) {\n  //   // Algorithm will still work, but not perfectly\n  //   consoleWarn('Samples provided to calculateImpulseVelocity in the wrong order')\n  // }\n  if (samples.length === 2) {\n    // if 2 points, basic linear calculation\n    if (samples[1].t === samples[0].t) {\n      // consoleWarn(`Events have identical time stamps t=${samples[0].t}, setting velocity = 0`)\n      return 0\n    }\n    return (samples[1].d - samples[0].d) / (samples[1].t - samples[0].t)\n  }\n  // Guaranteed to have at least 3 points here\n  // start with the oldest sample and go forward in time\n  let work = 0\n  for (let i = samples.length - 1; i > 0; i--) {\n    if (samples[i].t === samples[i - 1].t) {\n      // consoleWarn(`Events have identical time stamps t=${samples[i].t}, skipping sample`)\n      continue\n    }\n    const vprev = kineticEnergyToVelocity(work) // v[i-1]\n    const vcurr = (samples[i].d - samples[i - 1].d) / (samples[i].t - samples[i - 1].t) // v[i]\n    work += (vcurr - vprev) * Math.abs(vcurr)\n    if (i === samples.length - 1) {\n      work *= 0.5\n    }\n  }\n  return kineticEnergyToVelocity(work) * 1000\n}\n\nexport function useVelocity () {\n  const touches: Record | undefined> = {}\n\n  function addMovement (e: TouchEvent) {\n    Array.from(e.changedTouches).forEach(touch => {\n      const samples = touches[touch.identifier] ?? (touches[touch.identifier] = new CircularBuffer(HISTORY))\n      samples.push([e.timeStamp, touch])\n    })\n  }\n\n  function endTouch (e: TouchEvent) {\n    Array.from(e.changedTouches).forEach(touch => {\n      delete touches[touch.identifier]\n    })\n  }\n\n  function getVelocity (id: number) {\n    const samples = touches[id]?.values().reverse()\n\n    if (!samples) {\n      throw new Error(`No samples for touch id ${id}`)\n    }\n\n    const newest = samples[0]\n    const x: Sample[] = []\n    const y: Sample[] = []\n    for (const val of samples) {\n      if (newest[0] - val[0] > HORIZON) break\n\n      x.push({ t: val[0], d: val[1].clientX })\n      y.push({ t: val[0], d: val[1].clientY })\n    }\n\n    return {\n      x: calculateImpulseVelocity(x),\n      y: calculateImpulseVelocity(y),\n      get direction () {\n        const { x, y } = this\n        const [absX, absY] = [Math.abs(x), Math.abs(y)]\n\n        return absX > absY && x >= 0 ? 'right'\n          : absX > absY && x <= 0 ? 'left'\n          : absY > absX && y >= 0 ? 'down'\n          : absY > absX && y <= 0 ? 'up'\n          : oops()\n      },\n    }\n  }\n\n  return { addMovement, endTouch, getVelocity }\n}\n\nfunction oops (): never {\n  throw new Error()\n}\n"],"mappings":"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","ignoreList":[]}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy