diff --git a/src/ol/rotationconstraint.js b/src/ol/rotationconstraint.js index 72500f9ec7..c297e13608 100644 --- a/src/ol/rotationconstraint.js +++ b/src/ol/rotationconstraint.js @@ -37,3 +37,23 @@ ol.RotationConstraint.createSnapToN = function(n) { } }; }; + + +/** + * @param {number=} opt_tolerance Tolerance. + * @return {ol.RotationConstraintType} Rotation constraint. + */ +ol.RotationConstraint.createSnapToZero = function(opt_tolerance) { + var tolerance = opt_tolerance || 0.1; + return function(rotation, delta) { + if (goog.isDef(rotation)) { + if (Math.abs(rotation + delta) <= tolerance) { + return 0; + } else { + return rotation + delta; + } + } else { + return undefined; + } + }; +}; diff --git a/src/ol/view2d.js b/src/ol/view2d.js index 8772f363ca..77062aad97 100644 --- a/src/ol/view2d.js +++ b/src/ol/view2d.js @@ -387,6 +387,6 @@ ol.View2D.createConstraints_ = function(view2DOptions) { zoomFactor, maxResolution, numZoomLevels - 1); } // FIXME rotation constraint is not configurable at the moment - var rotationConstraint = ol.RotationConstraint.none; + var rotationConstraint = ol.RotationConstraint.createSnapToZero(); return new ol.Constraints(resolutionConstraint, rotationConstraint); }; diff --git a/test/spec/ol/rotationconstraint.test.js b/test/spec/ol/rotationconstraint.test.js new file mode 100644 index 0000000000..950a8892e4 --- /dev/null +++ b/test/spec/ol/rotationconstraint.test.js @@ -0,0 +1,36 @@ +goog.provide('ol.test.RotationConstraint'); + +describe('ol.RotationConstraint', function() { + + describe('SnapToZero', function() { + + it('returns expected rotation value', function() { + var rotationConstraint = ol.RotationConstraint.createSnapToZero(0.3); + + expect(rotationConstraint(0.1, 0)).toEqual(0); + expect(rotationConstraint(0.2, 0)).toEqual(0); + expect(rotationConstraint(0.3, 0)).toEqual(0); + expect(rotationConstraint(0.4, 0)).toEqual(0.4); + + expect(rotationConstraint(-0.1, 0)).toEqual(0); + expect(rotationConstraint(-0.2, 0)).toEqual(0); + expect(rotationConstraint(-0.3, 0)).toEqual(0); + expect(rotationConstraint(-0.4, 0)).toEqual(-0.4); + + expect(rotationConstraint(1, -0.9)).toEqual(0); + expect(rotationConstraint(1, -0.8)).toEqual(0); + // floating-point arithmetic + expect(rotationConstraint(1, -0.7)).not.toEqual(0); + expect(rotationConstraint(1, -0.6)).toEqual(0.4); + + expect(rotationConstraint(-1, 0.9)).toEqual(0); + expect(rotationConstraint(-1, 0.8)).toEqual(0); + // floating-point arithmetic + expect(rotationConstraint(-1, 0.7)).not.toEqual(0); + expect(rotationConstraint(-1, 0.6)).toEqual(-0.4); + }); + + }); +}); + +goog.require('ol.RotationConstraint'); diff --git a/test/spec/ol/view2d.test.js b/test/spec/ol/view2d.test.js index d78e17dad4..efed46163b 100644 --- a/test/spec/ol/view2d.test.js +++ b/test/spec/ol/view2d.test.js @@ -49,6 +49,16 @@ describe('ol.View2D', function() { }); }); + + describe('create rotation constraint', function() { + it('gives a correct rotation constraint function', function() { + var options = {}; + var fn = ol.View2D.createConstraints_(options).rotation; + expect(fn(0.01, 0)).toEqual(0); + expect(fn(0.15, 0)).toEqual(0.15); + }); + }); + }); });