mirror of
https://github.com/FoggedLens/iD.git
synced 2026-05-16 13:59:27 +02:00
Speed up intersects
This commit is contained in:
+24
-6
@@ -1,6 +1,23 @@
|
||||
iD.Graph = function(entities, annotation) {
|
||||
if (!(this instanceof iD.Graph)) return new iD.Graph(entities, annotation);
|
||||
this.entities = entities || {};
|
||||
for (var id in this.entities) {
|
||||
if (this.entities[id].type === 'way') {
|
||||
// top left, bottom right
|
||||
var extent = [
|
||||
[-Infinity, Infinity],
|
||||
[Infinity, -Infinity]];
|
||||
var w = this.fetch(id);
|
||||
for (var j = 0, l = w.nodes.length; j < l; j++) {
|
||||
if (w.nodes[j].lon > extent[0][0]) extent[0][0] = w.nodes[j].lon;
|
||||
if (w.nodes[j].lon < extent[1][0]) extent[1][0] = w.nodes[j].lon;
|
||||
|
||||
if (w.nodes[j].lat < extent[0][1]) extent[0][1] = w.nodes[j].lat;
|
||||
if (w.nodes[j].lat > extent[1][1]) extent[1][1] = w.nodes[j].lat;
|
||||
}
|
||||
this.entities[id]._extent = extent;
|
||||
}
|
||||
}
|
||||
this.annotation = annotation;
|
||||
};
|
||||
|
||||
@@ -36,18 +53,19 @@ iD.Graph.prototype = {
|
||||
entity.lat < extent[0][1] &&
|
||||
entity.lat > extent[1][1];
|
||||
}
|
||||
function wayIntersect(entity) {
|
||||
return entity._extent[0][0] > extent[0][0] &&
|
||||
entity._extent[1][0] < extent[1][0] &&
|
||||
entity._extent[0][1] < extent[0][1] &&
|
||||
entity._extent[1][1] > extent[1][1];
|
||||
}
|
||||
for (var i in this.entities) {
|
||||
var entity = this.entities[i];
|
||||
if (entity.type === 'node' && nodeIntersect(entity)) {
|
||||
items.push(entity);
|
||||
} else if (entity.type === 'way') {
|
||||
var w = this.fetch(entity.id);
|
||||
for (var j = 0; j < w.nodes.length; j++) {
|
||||
if (nodeIntersect(w.nodes[j])) {
|
||||
items.push(w);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (wayIntersect(w)) items.push(w);
|
||||
}
|
||||
}
|
||||
return items;
|
||||
|
||||
Reference in New Issue
Block a user