diff options
author | sanine <sanine.not@pm.me> | 2022-05-25 14:48:59 -0500 |
---|---|---|
committer | sanine <sanine.not@pm.me> | 2022-05-25 14:48:59 -0500 |
commit | ebf18fa330e5513d9f118b41bf63692aa9093462 (patch) | |
tree | 85abb5207a911b3a4eb6c8e96d786097c8c4847d /modules/Geometry.js | |
parent | 2c9567e42d2e96de3479f95125f0fff04ff52c2d (diff) |
add basic QTNode
Diffstat (limited to 'modules/Geometry.js')
-rw-r--r-- | modules/Geometry.js | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/modules/Geometry.js b/modules/Geometry.js index c34f4d2..f32dc0e 100644 --- a/modules/Geometry.js +++ b/modules/Geometry.js @@ -55,12 +55,42 @@ class QTNode { insert(point) { if (this.aabb.contains(point)) { - this.type = QTNode.Leaf; - this.point = point; - return true; + if (this.type == QTNode.Empty) { + this.type = QTNode.Leaf; + this.point = point; + return true; + } + else if (this.type == QTNode.Leaf) { + this.type = QTNode.Branch; + this.subdivide(); + let result = this.insert(this.point); + if (!result) return false; + this.point = undefined; + return this.insert(point); + } + else { + // Branch + if (this.subnode[0].insert(point)) return true; + if (this.subnode[1].insert(point)) return true; + if (this.subnode[2].insert(point)) return true; + if (this.subnode[3].insert(point)) return true; + return false; // something strange has happened!! + } } return false; } + + subdivide() { + const x = this.aabb.x; const y = this.aabb.y; + const w = this.aabb.width/2; const h = this.aabb.height/2; + + this.subnode = [ + new QTNode(x, y, w, h), + new QTNode(x+w, y, w, h), + new QTNode(x, y+h, w, h), + new QTNode(x+w, y+h, w, h), + ]; + } } export { AABB, QTNode }; |