From ed787ba79c3c1e7dc9ff25413acc790d060b0aa9 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 10 Mar 2013 14:57:42 +0100 Subject: [PATCH] Add ol.Extent.getForView2DAndSize --- src/ol/extent.js | 26 +++++++++++++++++++ test/spec/ol/extent.test.js | 51 +++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/src/ol/extent.js b/src/ol/extent.js index 5595382e7c..a7a7669d34 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -45,6 +45,32 @@ ol.Extent.boundingExtent = function(var_args) { }; +/** + * @param {ol.Coordinate} center Center. + * @param {number} resolution Resolution. + * @param {number} rotation Rotation. + * @param {ol.Size} size Size. + * @return {ol.Extent} Extent. + */ +ol.Extent.getForView2DAndSize = function(center, resolution, rotation, size) { + var x = resolution * size.width / 2; + var y = resolution * size.height / 2; + var corners = [ + new ol.Coordinate(-x, -y), + new ol.Coordinate(-x, y), + new ol.Coordinate(x, -y), + new ol.Coordinate(x, y) + ]; + var corner; + for (i = 0; i < 4; ++i) { + corner = corners[i]; + corner.rotate(rotation); + corner.add(center); + } + return ol.Extent.boundingExtent.apply(null, corners); +}; + + /** * Checks if the passed coordinate is contained or on the edge * of the extent. diff --git a/test/spec/ol/extent.test.js b/test/spec/ol/extent.test.js index a2c735e6d7..da5a76c6f4 100644 --- a/test/spec/ol/extent.test.js +++ b/test/spec/ol/extent.test.js @@ -97,8 +97,59 @@ describe('ol.Extent', function() { }); }); + + describe('getForView2DAndSize', function() { + + it('works for a unit square', function() { + var extent = ol.Extent.getForView2DAndSize( + new ol.Coordinate(0, 0), 1, 0, new ol.Size(1, 1)); + expect(extent.minX).toBe(-0.5); + expect(extent.minY).toBe(-0.5); + expect(extent.maxX).toBe(0.5); + expect(extent.maxY).toBe(0.5); + }); + + it('works for center', function() { + var extent = ol.Extent.getForView2DAndSize( + new ol.Coordinate(5, 10), 1, 0, new ol.Size(1, 1)); + expect(extent.minX).toBe(4.5); + expect(extent.minY).toBe(9.5); + expect(extent.maxX).toBe(5.5); + expect(extent.maxY).toBe(10.5); + }); + + it('works for rotation', function() { + var extent = ol.Extent.getForView2DAndSize( + new ol.Coordinate(0, 0), 1, Math.PI / 4, new ol.Size(1, 1)); + expect(extent.minX).toRoughlyEqual(-Math.sqrt(0.5), 1e-9); + expect(extent.minY).toRoughlyEqual(-Math.sqrt(0.5), 1e-9); + expect(extent.maxX).toRoughlyEqual(Math.sqrt(0.5), 1e-9); + expect(extent.maxY).toRoughlyEqual(Math.sqrt(0.5), 1e-9); + }); + + it('works for resolution', function() { + var extent = ol.Extent.getForView2DAndSize( + new ol.Coordinate(0, 0), 2, 0, new ol.Size(1, 1)); + expect(extent.minX).toBe(-1); + expect(extent.minY).toBe(-1); + expect(extent.maxX).toBe(1); + expect(extent.maxY).toBe(1); + }); + + it('works for size', function() { + var extent = ol.Extent.getForView2DAndSize( + new ol.Coordinate(0, 0), 1, 0, new ol.Size(10, 5)); + expect(extent.minX).toBe(-5); + expect(extent.minY).toBe(-2.5); + expect(extent.maxX).toBe(5); + expect(extent.maxY).toBe(2.5); + }); + + }); + }); goog.require('ol.Coordinate'); goog.require('ol.Extent'); +goog.require('ol.Size'); goog.require('ol.projection');