From a226ac56a19ad43c49d695db09be13ec55f34ed3 Mon Sep 17 00:00:00 2001 From: Brandon Lai-Cheong <brandon.lai-cheong@uwaterloo.ca> Date: Tue, 5 Nov 2024 09:33:41 -0500 Subject: [PATCH] init quadtree --- include/box.h | 1 + include/quad_tree.h | 40 ++++++++--------- src/data_structures/quad_tree.cpp | 75 ++++++++++++++++++------------- tests/quad_tree_tests.cpp | 10 +++++ 4 files changed, 74 insertions(+), 52 deletions(-) create mode 100644 tests/quad_tree_tests.cpp diff --git a/include/box.h b/include/box.h index 57a99ad..a44ef6a 100644 --- a/include/box.h +++ b/include/box.h @@ -1,4 +1,5 @@ #pragma once +struct Triangle; struct Box { float minX, maxX, minY, maxY; diff --git a/include/quad_tree.h b/include/quad_tree.h index f9cc89f..1206ada 100644 --- a/include/quad_tree.h +++ b/include/quad_tree.h @@ -3,29 +3,29 @@ #include <triangle.h> #include <box.h> -enum Status { - Empty, - Single, - Quad -}; - -class QuadTree { +class AbstractQuadTree +{ + protected: Box b; - Status status; - QuadContent q; + AbstractQuadTree(Box b); public: - void addTriangle(const Triangle &t); - QuadTree(Box b); - std::vector<Triangle> visibleSurface() const; - Triangle triangleIntersection(const Point &p) const; + virtual void addTriangle(const Triangle &t) = 0; + virtual std::vector<Triangle> visibleSurface() const = 0; + virtual Triangle triangleIntersection(const Point &p) const = 0; +}; +class QuadTreeLeaf : AbstractQuadTree +{ + Triangle t; + + void addTriangle(const Triangle &t) override; }; -union QuadContent { +class QuadTree : AbstractQuadTree +{ + std::vector<AbstractQuadTree> children; - Triangle t; - std::vector<QuadTree> children; - bool nothing; - QuadContent() {}; - ~QuadContent() {}; -}; \ No newline at end of file +public: + QuadTree(Box b); + void addTriangle(const Triangle &t) override; +}; diff --git a/src/data_structures/quad_tree.cpp b/src/data_structures/quad_tree.cpp index dfc77df..050f099 100644 --- a/src/data_structures/quad_tree.cpp +++ b/src/data_structures/quad_tree.cpp @@ -1,53 +1,64 @@ #include <quad_tree.h> +#include <triangulation.h> -QuadTree::QuadTree(Box b) : b{b}, status{Empty} { - q.nothing = false; +QuadTree::QuadTree(Box b) : AbstractQuadTree{b} +{ } + void QuadTree::addTriangle(const Triangle &t) { - if (!b.isIn(t)) { + if (!b.isIn(t)) + { return; } - switch (status) - { - case Empty: - status = Single; - q.t = t; - break; - case Single: - - Triangle old = q.t; - - - status = Quad; + q.children = { QuadTree(Box{b.minX, b.maxX / 2, b.minY, b.maxY}), - QuadTree(Box{b.maxX / 2, b.maxX, b.minY, b.maxY / 2}), - QuadTree(Box{b.maxX / 2, b.maxX, b.maxY / 2, b.maxY}), - QuadTree(Box{b.minX, b.maxX / 2, b.minY, b.maxY / 2}) - }; - // if the old and new triangle intersect, we want to avoid infinite additions to the tree. - // create new set of triangles that don't intersect - std::vector<Triangle> newTriangles = triangulate(old, t); - for (int i = 0; i < q.children.size(); i++) { - for (int j = 0; j < newTriangles.size(); i++) { + QuadTree(Box{b.maxX / 2, b.maxX, b.minY, b.maxY / 2}), + QuadTree(Box{b.maxX / 2, b.maxX, b.maxY / 2, b.maxY}), + QuadTree(Box{b.minX, b.maxX / 2, b.minY, b.maxY / 2})}; + // if the old and new triangle intersect, we want to avoid infinite additions to the tree. + // create new set of triangles that don't intersect + std::vector<Triangle> newTriangles = triangulate(old, t); + for (int i = 0; i < q.children.size(); i++) + { + for (int j = 0; j < newTriangles.size(); i++) + { q.children[i].addTriangle(newTriangles[i]); } } + + + + for (int i = 0; i < q.children.size(); i++) + { + addTriangle(t); + } + +} + +std::vector<Triangle> QuadTree::visibleSurface() const +{ + switch (status) + { + case Empty: + return {}; break; + case Single: + return {q.t}; case Quad: - for (int i = 0; i < q.children.size(); i++) { - addTriangle(t); + { + std::vector<Triangle> results; + for (const auto &t : q.children) + { + auto ts = t.visibleSurface(); + results.insert(results.end(), ts.begin(), ts.end()); + } } - break; + default: break; } -} - - -std::vector<Triangle> QuadTree::visibleSurface() const { - // for every } \ No newline at end of file diff --git a/tests/quad_tree_tests.cpp b/tests/quad_tree_tests.cpp new file mode 100644 index 0000000..9ee373f --- /dev/null +++ b/tests/quad_tree_tests.cpp @@ -0,0 +1,10 @@ +#include <gtest/gtest.h> +#include <quad_tree.h> + +TEST (QuadTreeTests, QuadTreeTest) { + QuadTree q{{0, 10, 0, 10}}; + auto t1 = Triangle(Point{0,0}, Point{5,0}, Point{2,3}, 0); + q.addTriangle(t1); + + EXPECT_TRUE(q.visibleSurface().size() > 0); +} \ No newline at end of file -- GitLab