OpenLexocad  27.0
QuadTree.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <Base/Color.h>
4 #include <Geom/Pnt.h>
5 #include <Geom/Precision.h>
6 #include <Geom/Rect.h>
7 #include <Geom/geom_defines.h>
8 
9 #include <deque>
10 
11 
12 namespace Geom
13 {
14 class QuadTree;
15 
17 {
18  QuadTreeIterator(QuadTree* q) : _start(q), _current(q){};
19 
20  bool operator==(const QuadTreeIterator& b) const { return (b._current == _current); }
21 
22  QuadTreeIterator& operator++() { return *this; }
23 
24 
25  QuadTree* _current;
26  const QuadTree* _start;
27 };
28 
30 {
31 public:
33  ColorPoint(const Geom::Pnt& p, const Base::MColor& c) : p(p), c(c){};
34  Geom::Pnt p;
36 };
37 
38 
40 {
41 public:
42  using container = std::deque<ColorPoint>;
43  using iterator = typename container::iterator;
44  using const_iterator = typename container::const_iterator;
45 
46  void addPoint(const ColorPoint& p) { mData.emplace_back(p); };
47  iterator begin() { return mData.begin(); }
48  iterator end() { return mData.end(); }
49  const_iterator begin() const { return mData.begin(); }
50  const_iterator end() const { return mData.end(); }
51  const_iterator cbegin() const { return mData.cbegin(); }
52  const_iterator cend() const { return mData.cend(); }
53 
54  void clear() { mData.clear(); };
55  bool empty() const { return mData.empty(); };
56 
57  const container& getData() const { return mData; }
58 
59 
60 private:
61 
62  container mData;
63 
64 
65 };
66 
68 {
69 public:
70  QuadTree(Geom::Rect boundary, size_t capacity, int myDeep = 1);
71  virtual ~QuadTree();
72 
73  bool insert(const Geom::ColorPoint& cp);
74 
75  const Geom::Rect& getBoundary() const;
76  const std::deque<Geom::ColorPoint>& getPoints() const;
77  const bool hasPoints() const;
78  const size_t getPointCount() const;
79  std::vector<QuadTree*> getChildren() const;
80 
81  void getPointsRecursive(std::deque<Geom::ColorPoint>& points);
82  const size_t getPointCountRecursive() const;
83  std::vector<QuadTree*> getChildrenRecursive() const;
84  void removePointsRecursive();
85 
86  void setAutoSplit(bool on);
87  void split();
88  void setDeep(int deep);
89  int getDeep();
90 
91 
92  // Children
97 
98  QuadTreeIterator begin();
99  QuadTreeIterator end();
100 
101 
102 private:
103  void getDeep(int& deep);
104 
105  QuadTree();
106 
107  // Arbitrary constant to indicate how many elements can be stored in this quad tree node capacity
108  size_t _capacity;
109 
110  int m_myDeep;
111  int m_maxDeep;
112 
113  // Axis-aligned bounding box stored as a center with half-dimensions
114  // to represent the boundaries of this quad tree
115  Geom::Rect _boundary;
116 
117  // Points in this quad tree node
118  PointStorage _points;
119 
120  size_t _pointCount;
121 
122  bool _autoSplit;
123 };
124 
125 
126 
127 } // namespace Geom
Definition: Rotation.h:5
iterator end()
Definition: QuadTree.h:48
void clear()
Definition: QuadTree.h:54
Base::MColor c
Definition: QuadTree.h:35
QuadTree * northEast
Definition: QuadTree.h:94
Defines a non-persistent 3D Cartesian point.
Definition: Pnt.h:42
std::deque< ColorPoint > container
Definition: QuadTree.h:42
Definition: QuadTree.h:39
Definition: QuadTree.h:16
QuadTree * southWest
Definition: QuadTree.h:95
ColorPoint()
Definition: QuadTree.h:32
iterator begin()
Definition: QuadTree.h:47
#define GEOM_EXPORT
Definition: geom_defines.h:8
typename container::iterator iterator
Definition: QuadTree.h:43
Definition: Rect.h:28
void addPoint(const ColorPoint &p)
Definition: QuadTree.h:46
bool empty() const
Definition: QuadTree.h:55
const_iterator cbegin() const
Definition: QuadTree.h:51
const container & getData() const
Definition: QuadTree.h:57
QuadTree * southEast
Definition: QuadTree.h:96
QuadTree * northWest
Definition: QuadTree.h:93
Definition: QuadTree.h:67
Definition: Color.h:23
const_iterator cend() const
Definition: QuadTree.h:52
const_iterator begin() const
Definition: QuadTree.h:49
typename container::const_iterator const_iterator
Definition: QuadTree.h:44
const_iterator end() const
Definition: QuadTree.h:50
Definition: QuadTree.h:29