From 69af20e44d2ccb9f45647a041e6ad9fd0c2ed6e4 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 13 Oct 2014 14:41:49 -0700 Subject: [PATCH] Add mutating extent extend, for performance --- js/id/core/relation.js | 13 +++++++------ js/id/core/way.js | 12 ++++++------ js/id/geo/extent.js | 7 +++++++ test/spec/geo/extent.js | 12 ++++++++++++ 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/js/id/core/relation.js b/js/id/core/relation.js index 8b9d6ef9c..038785b81 100644 --- a/js/id/core/relation.js +++ b/js/id/core/relation.js @@ -25,14 +25,15 @@ _.extend(iD.Relation.prototype, { if (memo && memo[this.id]) return iD.geo.Extent(); memo = memo || {}; memo[this.id] = true; - return this.members.reduce(function(extent, member) { - member = resolver.hasEntity(member.id); + + var extent = iD.geo.Extent(); + for (var i = 0; i < this.members.length; i++) { + var member = resolver.hasEntity(this.members[i].id); if (member) { - return extent.extend(member.extent(resolver, memo)); - } else { - return extent; + extent._extend(member.extent(resolver, memo)); } - }, iD.geo.Extent()); + } + return extent; }); }, diff --git a/js/id/core/way.js b/js/id/core/way.js index 53cb717fd..608cf7abf 100644 --- a/js/id/core/way.js +++ b/js/id/core/way.js @@ -14,14 +14,14 @@ _.extend(iD.Way.prototype, { extent: function(resolver) { return resolver.transient(this, 'extent', function() { - return this.nodes.reduce(function(extent, id) { - var node = resolver.hasEntity(id); + var extent = iD.geo.Extent(); + for (var i = 0; i < this.nodes.length; i++) { + var node = resolver.hasEntity(this.nodes[i]); if (node) { - return extent.extend(node.extent()); - } else { - return extent; + extent._extend(node.extent()); } - }, iD.geo.Extent()); + }; + return extent; }); }, diff --git a/js/id/geo/extent.js b/js/id/geo/extent.js index 2b3813293..b86d687b7 100644 --- a/js/id/geo/extent.js +++ b/js/id/geo/extent.js @@ -22,6 +22,13 @@ _.extend(iD.geo.Extent.prototype, { Math.max(obj[1][1], this[1][1])]); }, + _extend: function(extent) { + this[0][0] = Math.min(extent[0][0], this[0][0]); + this[0][1] = Math.min(extent[0][1], this[0][1]); + this[1][0] = Math.max(extent[1][0], this[1][0]); + this[1][1] = Math.max(extent[1][1], this[1][1]); + }, + area: function() { return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1])); }, diff --git a/test/spec/geo/extent.js b/test/spec/geo/extent.js index 4201b609c..c299f4279 100644 --- a/test/spec/geo/extent.js +++ b/test/spec/geo/extent.js @@ -87,6 +87,18 @@ describe("iD.geo.Extent", function () { }); }); + describe("#_extend", function () { + it("extends self to the minimal extent containing self and the given extent", function () { + var e = iD.geo.Extent(); + e._extend([[0, 0], [5, 10]]); + expect(e).to.eql([[0, 0], [5, 10]]); + + e = iD.geo.Extent([0, 0], [0, 0]); + e._extend([[4, -1], [5, 10]]); + expect(e).to.eql([[0, -1], [5, 10]]); + }); + }); + describe('#intersects', function () { it("returns true for a point inside self", function () { expect(iD.geo.Extent([0, 0], [5, 5]).intersects([2, 2])).to.be.true;