Add mutating extent extend, for performance

This commit is contained in:
John Firebaugh
2014-10-13 14:41:49 -07:00
parent 5f1e40561a
commit 69af20e44d
4 changed files with 32 additions and 12 deletions
+7 -6
View File
@@ -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;
});
},
+6 -6
View File
@@ -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;
});
},
+7
View File
@@ -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]));
},
+12
View File
@@ -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;