Snapping (v3)

Revision 3 of this benchmark created on


Setup

function posMod(a, b) { return (a % b + b) % b; }
    var step = 50;
    var distance = 5;
    var axis = 'x';
    var ret = {point: {}};

Test runner

Ready to run.

Testing in
TestOps/sec
Using if's
for (var value = -1000; value < 1000; value++) {
  var delta = 0;
  var mod = posMod(value, step);
  if (mod <= step / 2 && mod <= distance) {
    delta = -mod;
  } else if (mod >= step - distance) {
    delta = step - mod;
  }
}
ready
Using Math.round
for (var value = -1000; value < 1000; value++) {
  var nearest = Math.round(value / step) * step;
  var delta = Math.abs(value - nearest) <= distance ? nearest - value : 0;
}
ready
Original
for (var value = -1000; value < 1000; value++) {
  var upperAxis = axis.toUpperCase();
  var snap = value;
  var modulo = value % step;
  if (Math.abs(modulo) <= step / 2 && Math.abs(modulo) <= distance) {
    snap -= modulo;
  } else if (step - Math.abs(modulo) <= distance) {
    var change = modulo > 0 ? step - modulo : -step - modulo;
    snap += change;
  }
  ret.point[axis] = snap;
  ret['delta' + upperAxis] = snap - value;
  ret['didSnap' + upperAxis] = (snap % step === 0);
}
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.