R Tree
第一步,创建R树类。
构建一个RTree生成器。用以创建tree对象。
例子:var tree = new RTree(12)
var RTree = function(width){var _Min_Width = 3; //Minimum width of any node before a merge
var _Max_Width = 6; //Maximum width of any node before a split
if(!isNaN(width)){ _Min_Width = Math.floor(width/2.0); _Max_Width = width;}
//Start with an empty root-tree
var _T = {x:0, y:0, w:0, h:0, id:"root", nodes:[] };var isArray = function(o) {return Object.prototype.toString.call(o) === '[object Array]';
};var _attach_data = function(node, more_tree){
node.nodes=more_tree.nodes;
node.x= more_tree.x; node.y =more_tree.y;
node.w= more_tree.w; node.h =more_tree.h;return(node);
};//选择适合的节点来存放插入的条目。
//@private。
var _choose_leaf_subtree = (rect, root) =>{...}//内部插入函数。
//[] = _insert_subtree(rectangle, object to insert, root to begin insertion at)
//@private。即私有函数,只能用RTree的方法调用它。
var _insert_subtree = (node, root) =>{...}this.get_tree = function() { return_T}//new_tree代表新的子树节点,where代表要替代的位置。
this.set_tree = (new_tree, where) =>{if (!where) {
where=_T
}return(_attach_data(where, new_tree))
}//rect是边界矩阵,对象是叶子节点。
this.insert = (rect, obj) =>{if (arguments.length < 2) {throw "Wrong number of arguments"}return(_insert_subtree({x:rect.x, y:rect.y, w:rect.w, h:rect.h, leaf:obj}, _T))
}//End of RTree
}
tree.insert方法,用以向生成的R树,插入数据。方法见下:
把一个新的索引条目E插入一个R树内:
找到插入新记录的位置: 这里要调用Choose Leaf方法,选择一个叶节点L来存放E。 把记录E加入到叶节点中: 这里需要进行判断。如果L.nodes <= M(即L的条目数量此时小于等于规定的最大值M),则下一步;
否则, 需要分裂,调用Split Node方法。把叶子节点L分裂成2个新节点L和LL(2个新节点包含了原来的L节点的所有条目和新条目E)。
向上传递变化:调用Adjust Tree方法对L