diff --git a/packages/math/quadtree.js b/packages/math/quadtree.js index 05a52bf..f752efe 100644 --- a/packages/math/quadtree.js +++ b/packages/math/quadtree.js @@ -5,7 +5,10 @@ import * as Rectangle from './rectangle'; export class QuadTree { constructor() { + this._visitNodes = []; + this._queryRectangle = [0, 0, 0, 0]; this.quadTree = quadtree(); + this.onVisit = this.onVisit.bind(this); } add(datum) { @@ -20,28 +23,31 @@ export class QuadTree { } } + onVisit(node, x, y, x0, y0) { + const w = x0 - x; + const h = y0 - y; + if (!Rectangle.intersects(this._queryRectangle, [x, y, w, h])) { + return true; + } + if (4 === node.length) { + return; + } + do { + if (Rectangle.isTouching(this._queryRectangle, node.data)) { + this.nodes.push(node); + } + } while (node = node.next); + } + remove(datum) { this.quadTree.remove(datum); } search(queryRectangle) { - const nodes = []; - this.quadTree.visit((node, x, y, x0, y0) => { - const w = x0 - x; - const h = y0 - y; - if (!Rectangle.intersects(queryRectangle, [x, y, w, h])) { - return true; - } - if (4 === node.length) { - return; - } - do { - if (Rectangle.intersects(queryRectangle, node.data)) { - nodes.push(node); - } - } while (node = node.next); - }); - return nodes; + this._queryRectangle = queryRectangle; + this.nodes = []; + this.quadTree.visit(this.onVisit); + return this.nodes; } }