diff options
author | Isaac Clayton | 2022-01-07 20:04:23 +0100 |
---|---|---|
committer | Isaac Clayton | 2022-01-07 20:04:23 +0100 |
commit | 13384e80b141b64feabfb88c896153ad2e405675 (patch) | |
tree | 187b8a11e187bb31b0248f4e300c4432c025b572 | |
parent | 2775c6cc1335d42f0c0625970f819e173980111c (diff) |
Sketch out basic quadtree
-rw-r--r-- | Cargo.lock | 7 | ||||
-rw-r--r-- | src/main.rs | 2 | ||||
-rw-r--r-- | src/quad.rs | 46 |
3 files changed, 55 insertions, 0 deletions
diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..5713a61 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "spatio" +version = "0.1.0" diff --git a/src/main.rs b/src/main.rs index e7a11a9..5abe13f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +mod quad; + fn main() { println!("Hello, world!"); } diff --git a/src/quad.rs b/src/quad.rs new file mode 100644 index 0000000..f6eaab3 --- /dev/null +++ b/src/quad.rs @@ -0,0 +1,46 @@ +/// Represents the data present in a quad-tree node. +/// May be the base-level repr, or a node with 4 children. +pub enum Quad<A: Default, B> { + /// Base cell in grid. + /// May actually be a chunk of cells for performance. + Base(A), + /// Node with 4 children. + Node(Box<[Node<A, B>;4]>), + /// Children may be generated from Node. + Cached, +} + +/// Represends a node in a quadtree. +/// Has a depth denoting the number of nodes below it. +/// Nodes should only be siblings of nodes with the same depth. +/// Data stored inside a quadtree node, including children, are in `data`. +pub struct Node<A: Default, B> { + depth: usize, + compr: B, + data: Quad<A, B>, +} + +/// Represents a context with shared state. +pub struct Ctx(); + +impl<A: Default, B> Node<A, B> { + /// Creates a new tree from a single base node + pub fn new_base(base: A, ctx: &mut Ctx) -> Self { + Node { + depth: 0, + compr: ctx.compress(&base), + data: Quad::Base(base), + } + } + + /// Creates a new tree with a single empty base node + pub fn new_empty(ctx: &mut Ctx) -> Self { + Self::new_base(Default::default(), ctx) + } + + /// Creates a new node double the size by centering the current node + /// on a node double the size. + pub fn pad_empty(self, ctx: &mut Ctx) -> Self { + todo!() + } +} |