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.isTouching(queryRectangle, node.data);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
}
|