Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
function findKeyIndex(keys, row) {
  var lo = 0, hi = keys.length;
  while (lo < hi) {
    var mi = ((hi + lo) / 2) | 0;
    if (keys[mi] < row) 
      lo = mi + 1;
    else if (keys[mi] > row)
      hi = mi;
    else
      return mi;
  }
  return lo - 1;
}
function getValue(track, row) {
  var keys = Object.keys(track);
  
  if (!keys.length)
    return 0.0;
  
  var idx = findKeyIndex(keys, Math.floor(row));
  if (idx < 0)
    return track[keys[0]].value;
  if (idx > keys.length - 2)
    return track[keys[keys.length - 1]].value;
  // lookup keys and values
  var k0 = keys[idx], k1 = keys[idx + 1];
  var a = track[k0].value;
  var b = track[k1].value;
  // interpolate
  var t = (row - k0) / (k1 - k0);
  switch (track[k0].interpolation) {
  case 0:
    return a;
  case 1:
    return a + (b - a) * t;
  case 2:
    return a + (b - a) * t * t * (3 - 2 * t);
  case 3:
    return a + (b - a) * Math.pow(t, 2.0);
  }
}
track = {
  "2" : { "value" : 1.0, "interpolation" : 1 },
  "3" : { "value" : 2.0, "interpolation" : 1 },
  "4" : { "value" : 3.0, "interpolation" : 1 },
  "5" : { "value" : 4.0, "interpolation" : 1 },
  "10" : { "value" : 5.0, "interpolation" : 1 }
};
// insert key
track[20] = { "value" : 6.0, "interpolation" : 1 };
// remove key
delete track[20];
// get interpolated values
var rows = [ -1.0, 2.0, 2.5, 3.0, 7.5, 10.0, 11.0 ];
for (var r in rows)
  console.log(rows[r] + ' = ' + getValue(track, rows[r]));
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
kusmapro
0viewers