import {quadtree} from 'd3-quadtree'; 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) { this.quadTree.add(datum); } clear() { const data = this.quadTree.data(); for (let i = 0; i < data.length; i++) { const datum = data[i]; this.quadTree.remove(datum); } } 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) { this._queryRectangle = queryRectangle; this.nodes = []; this.quadTree.visit(this.onVisit); return this.nodes; } }