diff --git a/spec/runner.html b/spec/runner.html index f24771740..6b2197425 100644 --- a/spec/runner.html +++ b/spec/runner.html @@ -18,10 +18,10 @@ - + @@ -41,10 +41,10 @@ - + diff --git a/spec/suites/geometry/BoundsSpec.js b/spec/suites/geometry/BoundsSpec.js new file mode 100644 index 000000000..eee05e4bf --- /dev/null +++ b/spec/suites/geometry/BoundsSpec.js @@ -0,0 +1,43 @@ +describe('Bounds', function() { + var a, b; + + beforeEach(function() { + a = new L.Bounds( + new L.Point(14, 12), + new L.Point(30, 40)); + b = new L.Bounds([ + new L.Point(20, 12), + new L.Point(14, 20), + new L.Point(30, 40) + ]); + }); + + describe('constructor', function() { + it('should create bounds with proper min & max on (Point, Point)', function() { + expect(a.min).toEqual(new L.Point(14, 12)); + expect(a.max).toEqual(new L.Point(30, 40)); + }); + it('should create bounds with proper min & max on (Point[])', function() { + expect(b.min).toEqual(new L.Point(14, 12)); + expect(b.max).toEqual(new L.Point(30, 40)); + }); + }); + + describe('#extend', function() { + it('should extend the bounds to contain the given point', function() { + a.extend(new L.Point(50, 20)); + expect(a.min).toEqual(new L.Point(14, 12)); + expect(a.max).toEqual(new L.Point(50, 40)); + + b.extend(new L.Point(25, 50)); + expect(b.min).toEqual(new L.Point(14, 12)); + expect(b.max).toEqual(new L.Point(30, 50)); + }); + }); + + describe('#getCenter', function() { + it('should return the center point', function() { + expect(a.getCenter()).toEqual(new L.Point(22, 26)); + }); + }); +}); \ No newline at end of file diff --git a/src/geometry/Bounds.js b/src/geometry/Bounds.js new file mode 100644 index 000000000..e76e6c93d --- /dev/null +++ b/src/geometry/Bounds.js @@ -0,0 +1,38 @@ +/* + * L.Bounds represents a rectangular area on the screen in pixel coordinates. + */ + +L.Bounds = L.Class.extend({ + initialize: function(min, max) { //(Point, Point) or Point[] + var points = (min instanceof Array ? min : [min, max]); + for (var i = 0, len = points.length; i < len; i++) { + this.extend(points[i]); + } + }, + + // extend the bounds to contain the given point + extend: function(/*Point*/ point) { + if (!this.min && !this.max) { + this.min = new L.Point(point.x, point.y); + this.max = new L.Point(point.x, point.y); + } else { + this.min.x = Math.min(point.x, this.min.x); + this.max.x = Math.max(point.x, this.max.x); + this.min.y = Math.min(point.y, this.min.y); + this.max.y = Math.max(point.y, this.max.y); + } + }, + + getCenter: function(round)/*->Point*/ { + return new L.Point( + (this.min.x + this.max.x) / 2, + (this.min.y + this.max.y) / 2, round); + }, + + contains: function(/*Bounds*/ bounds)/*->Boolean*/ { + return (bounds.min.x >= this.min.x) && + (bounds.max.x <= this.max.x) && + (bounds.min.y >= this.min.y) && + (bounds.max.y <= this.max.y); + } +}); \ No newline at end of file