summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac Clayton2022-01-07 20:04:23 +0100
committerIsaac Clayton2022-01-07 20:04:23 +0100
commit13384e80b141b64feabfb88c896153ad2e405675 (patch)
tree187b8a11e187bb31b0248f4e300c4432c025b572
parent2775c6cc1335d42f0c0625970f819e173980111c (diff)
Sketch out basic quadtree
-rw-r--r--Cargo.lock7
-rw-r--r--src/main.rs2
-rw-r--r--src/quad.rs46
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!()
+ }
+}