Move intersection tree to iD.Tree

This commit is contained in:
Ansis Brammanis
2013-02-12 18:18:58 -05:00
parent 2f15b0ffca
commit 6baf6a6dd4
3 changed files with 80 additions and 58 deletions
+1
View File
@@ -140,6 +140,7 @@
<script src='js/id/core/node.js'></script>
<script src='js/id/core/relation.js'></script>
<script src='js/id/core/way.js'></script>
<script src='js/id/core/tree.js'></script>
<script src='js/id/connection.js'></script>
<script src='js/id/validate.js'></script>
+9 -58
View File
@@ -1,12 +1,9 @@
iD.History = function(context) {
var stack, index,
var stack, index, tree;
imagery_used = 'Bing',
dispatch = d3.dispatch('change', 'undone', 'redone'),
lock = false;
var rtree = new RTree(),
treeGraph;
function perform(actions) {
actions = Array.prototype.slice.call(actions);
@@ -38,34 +35,6 @@ iD.History = function(context) {
return 'iD_' + window.location.origin + '_' + n;
}
function rebaseTree(entities) {
for (var i = 0; i < entities.length; i++) {
insert(stack[index].graph.entities[entities[i]]);
}
}
function extentRectangle(extent) {
var m = 1000 * 1000 * 100,
x = m * extent[0][0],
y = m * extent[0][1],
dx = m * extent[1][0] - x || 2,
dy = m * extent[1][1] - y || 2;
return new RTree.Rectangle(~~x, ~~y, ~~dx - 1, ~~dy - 1);
}
function insert(entity) {
rtree.insert(extentRectangle(entity.extent(stack[index].graph)), entity.id);
}
function remove(entity) {
var r= rtree.remove(extentRectangle(entity.extent(treeGraph)), entity.id);
}
function reinsert(entity) {
remove(treeGraph.entities[entity.id]);
insert(entity);
}
var history = {
graph: function() {
return stack[index].graph;
@@ -73,15 +42,16 @@ iD.History = function(context) {
merge: function(entities) {
var base = treeGraph.base(),
var base = tree.base(),
newentities = Object.keys(entities).filter(function(i) {
return !treeGraph.entities.hasOwnProperty(i) && !base.entities[i];
});
return !base.entities.hasOwnProperty(i) && !base.entities[i];
});
for (var i = 0; i < stack.length; i++) {
stack[i].graph.rebase(entities);
}
rebaseTree(newentities);
tree.rebase(newentities);
dispatch.change();
},
@@ -162,26 +132,7 @@ iD.History = function(context) {
},
intersects: function(extent) {
if (treeGraph !== stack[index].graph) {
var diff = iD.Difference(treeGraph, stack[index].graph),
modified = {};
diff.modified().forEach(function(d) {
var loc = treeGraph.entities[d.id].loc;
if (!loc || loc[0] !== d.loc[0] || loc[1] !== d.loc[1]) {
modified[d.id] = d;
}
});
d3.values(diff.addParents(modified)).map(reinsert);
diff.created().forEach(insert);
diff.deleted().forEach(remove);
treeGraph = stack[index].graph;
}
return rtree.search(extentRectangle(extent))
.map(function(id) { return treeGraph.entity(id); });
return tree.intersects(extent, stack[index].graph);
},
difference: function() {
@@ -204,7 +155,7 @@ iD.History = function(context) {
}
return {
modified: d3.values(difference.modified()).map(discardTags),
modified: difference.modified().map(discardTags),
created: difference.created().map(discardTags),
deleted: difference.deleted()
};
@@ -228,7 +179,7 @@ iD.History = function(context) {
reset: function() {
stack = [{graph: iD.Graph()}];
index = 0;
treeGraph = stack[0].graph;
tree = iD.Tree(stack[0].graph);
dispatch.change();
},
+70
View File
@@ -0,0 +1,70 @@
iD.Tree = function(graph) {
var rtree = new RTree(),
m = 1000 * 1000 * 100,
head = graph;
function extentRectangle(extent) {
x = m * extent[0][0],
y = m * extent[0][1],
dx = m * extent[1][0] - x || 2,
dy = m * extent[1][1] - y || 2;
return new RTree.Rectangle(~~x, ~~y, ~~dx - 1, ~~dy - 1);
}
function insert(entity) {
rtree.insert(extentRectangle(entity.extent(head)), entity.id);
}
function remove(entity) {
rtree.remove(extentRectangle(entity.extent(graph)), entity.id);
}
function reinsert(entity) {
remove(graph.entities[entity.id]);
insert(entity);
}
var tree = {
rebase: function(entities) {
for (var i = 0; i < entities.length; i++) {
insert(graph.entities[entities[i]]);
}
return tree;
},
intersects: function(extent, g) {
head = g;
if (graph !== head) {
var diff = iD.Difference(graph, head),
modified = {};
diff.modified().forEach(function(d) {
var loc = graph.entities[d.id].loc;
if (!loc || loc[0] !== d.loc[0] || loc[1] !== d.loc[1]) {
modified[d.id] = d;
}
});
d3.values(diff.addParents(modified)).map(reinsert);
diff.created().forEach(insert);
diff.deleted().forEach(remove);
graph = head;
}
return rtree.search(extentRectangle(extent))
.map(function(id) { return graph.entity(id); });
},
base: function() {
return graph;
}
};
return tree;
};