37 lines
740 B
JavaScript
37 lines
740 B
JavaScript
import {quadtree} from 'd3-quadtree';
|
|
|
|
import * as Rectangle from './rectangle';
|
|
|
|
export class QuadTree {
|
|
|
|
constructor() {
|
|
this.quadTree = quadtree();
|
|
}
|
|
|
|
add(datum) {
|
|
this.quadTree.add(datum);
|
|
}
|
|
|
|
remove(datum) {
|
|
this.quadTree.remove(datum);
|
|
}
|
|
|
|
search(queryRectangle) {
|
|
const nodes = [];
|
|
this.quadTree.visit((node, ...nodeRectangle) => {
|
|
nodeRectangle[2] -= nodeRectangle[0];
|
|
nodeRectangle[3] -= nodeRectangle[1];
|
|
if (!Rectangle.intersects(queryRectangle, nodeRectangle)) {
|
|
return true;
|
|
}
|
|
if (4 !== node.length) {
|
|
nodes.push(node);
|
|
}
|
|
});
|
|
return nodes.filter((node) => {
|
|
return Rectangle.intersects(queryRectangle, node.data);
|
|
});
|
|
}
|
|
|
|
}
|