mirror of
https://github.com/FoggedLens/iD.git
synced 2026-05-16 05:49:16 +02:00
Add mutating extent extend, for performance
This commit is contained in:
@@ -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
@@ -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;
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
@@ -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]));
|
||||
},
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user