From 13384e80b141b64feabfb88c896153ad2e405675 Mon Sep 17 00:00:00 2001 From: Isaac Clayton Date: Fri, 7 Jan 2022 20:04:23 +0100 Subject: [PATCH] Sketch out basic quadtree --- Cargo.lock | 7 +++++++ src/main.rs | 2 ++ src/quad.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 Cargo.lock create mode 100644 src/quad.rs 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 { + /// Base cell in grid. + /// May actually be a chunk of cells for performance. + Base(A), + /// Node with 4 children. + Node(Box<[Node;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 { + depth: usize, + compr: B, + data: Quad, +} + +/// Represents a context with shared state. +pub struct Ctx(); + +impl Node { + /// 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!() + } +}