AggregPacking
 All Classes Namespaces Files Functions Variables Typedefs Friends Macros
octree.hpp
Go to the documentation of this file.
1 /*
2 *
3 * AggregPacking : Generator of random aggregate packings in concrete
4 *
5 * version 0.1 (2014-08-22)
6 *
7 * Copyright (C) 2014 Jan Stransky
8 *
9 * Czech Technical University, Faculty of Civil Engineering,
10 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
11 *
12 * AggregPacking is free software: you can redistribute it and/or modify it
13 * under the terms of the GNU Lesser General Public License as published by the
14 * Free Software Foundation, either version 3 of the License, or (at your
15 * option) any later version.
16 *
17 * AggregPacking is distributed in the hope that it will be useful, but WITHOUT
18 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
20 * for more details.
21 *
22 * You should have received a copy of the GNU Lesser General Public License
23 * along with this program. If not, see <http://www.gnu.org/licenses/>.
24 */
25 
31 #ifndef OCTREE_HPP
32 #define OCTREE_HPP
33 
34 #ifdef AGGREGPACKING_BOOST_PYTHON
35 #include <boost/python.hpp>
36 #endif
37 
38 #include <vector>
39 #include <iterator>
40 using std::vector;
41 
43 namespace octree {
44 
45 
46 template<class T> class OctreeNode;
47 
48 /**********************************************************************
49 * OCTREE ITERATOR
50 **********************************************************************/
51 // TODO reduce code duplication
53 template<class T>
54 class OctreeIterator : public std::iterator<std::input_iterator_tag, OctreeNode<T>> {
55  protected:
58 
59  public:
62 
64  OctreeIterator(const OctreeIterator& it) : ptr(it.ptr) {}
65 
68 
70  OctreeIterator operator++(int) {OctreeIterator tmp(*this); operator++(); return tmp; }
71 
73  bool operator==(const OctreeIterator& rhs) { return ptr == rhs.ptr; }
74 
76  bool operator!=(const OctreeIterator& rhs) { return ptr != rhs.ptr; }
77 
79  OctreeNode<T>& operator*() { return *(this->ptr); }
80 
82  OctreeNode<T>* operator->() { return this->ptr; }
83 };
84 
86 template<class T>
87 class OctreeConstIterator : public std::iterator<std::input_iterator_tag, OctreeNode<T>> {
88  protected:
91 
92  public:
95 
98 
101 
104 
106  bool operator==(const OctreeConstIterator& rhs) { return ptr == rhs.ptr; }
107 
109  bool operator!=(const OctreeConstIterator& rhs) { return ptr != rhs.ptr; }
110 
112  const OctreeNode<T>& operator*() const { return *(this->ptr); }
113 
115  const OctreeNode<T>* operator->() const { return this->ptr; }
116 };
117 
118 
120 
121 
122 
123 /**********************************************************************
124 * OCTREE
125 **********************************************************************/
127 template <class T>
128 class Octree {
129  private:
131  int depth;
132 
135 
136  public:
138  Octree() : depth(0), root() {}
139 
141 
147  Octree(double x, double y, double z, double size, int depth);
148 
150 
155  Octree(double x, double y, double z, double size) : Octree(x,y,z,size,0) {};
156 
158  ~Octree();
159 
161  int getDepth() { return depth; }
162 
164  double getSize() { return root->getSize(); }
165 
167 
172  void build(double x, double y, double z, double size);
175  OctreeNode<T>* getRoot() { return root; }
176 
178  const OctreeNode<T>* getRoot() const { return root; }
179 
181  void addData(const T& data);
182 
184  int getNumberOfNodes();
187  typedef OctreeIterator<T> iterator; // for boost python
188 
191 
193  OctreeIterator<T> end() { return OctreeIterator<T>(nullptr); }
194 
197 
199  OctreeConstIterator<T> end() const { return OctreeConstIterator<T>(nullptr); }
200 
202 
208  void getPotentialNeighbors(vector<T>& answer, double x, double y, double z, double size) const;
209 
211 
214  void getPotentialNeighbors(vector<T>& answer, const T& o) const { getPotentialNeighbors(answer,get_x(o), get_y(o), get_z(o), get_size(o)); }
215 
217 
221  void getPotentialNeighbors(vector<T>& answer, const T& o, int scale) const { getPotentialNeighbors(answer,get_x(o), get_y(o), get_z(o), get_size(o)*scale); }
223 #ifdef AGGREGPACKING_BOOST_PYTHON
224  vector<T>* py_getPotentialNeighbors(double x, double y, double z, double size) const;
226 
228  vector<T>* py_getPotentialNeighbors(const T& o) const { return py_getPotentialNeighbors(get_x(o), get_y(o), get_z(o), get_size(o)); }
229 
231  vector<T>* py_getPotentialNeighbors(const T& o,int scale) const { return py_getPotentialNeighbors(get_x(o), get_y(o), get_z(o), get_size(o)*scale); }
232 #endif
233 };
234 
235 
236 
237 
238 /**********************************************************************
239 * OCTREE
240 **********************************************************************/
242 template <class T>
243 class OctreeNode {
244  private:
246  double x;
247 
249  double y;
250 
252  double z;
253 
256 
258  vector<T> data;
259 
262 
264  int level;
265 
267  double size;
268 
270  int number;
271 
273 
279  OctreeNode(double x, double y, double z, OctreeNode& parent, int number);
280 
282 
287  OctreeNode(double x, double y, double z, double size);
288 
290 
292  void divide(int depth);
294  public:
296  ~OctreeNode();
297 
299  bool operator==(const OctreeNode& other) { return &other == this; }
300 
302  bool operator!=(const OctreeNode& other) { return &other != this; }
303 
305  double getX() { return x; }
306 
308  double getY() { return y; }
309 
311  double getZ() { return z; }
312 
314  double getSize() { return size; }
315 
317  int getLevel() { return level; }
318 
320  int getNumber() { return number; }
321 
323  const vector<T>& getData() const { return data; }
324 
326  vector<T>& getData() { return data; }
327 
329  const OctreeNode** getChildren() const { return children; }
330 
332  vector<OctreeNode*>* py_getChildren();
333 
335  OctreeNode* getParent() { return parent; }
336 
338  const OctreeNode* getParent() const { return parent; }
339 
341  bool isRoot() const { return parent == nullptr; }
342 
344  bool isLeaf() const { return children == nullptr; }
345 
347  void addData(const T& data);
348 
350  void addData(const T& data, double x, double y, double z, double size);
351 
353 
358  bool containsEntireBox(double x, double y, double z, double size) const;
359 
361  bool containsEntireBox(const T& o) const { return containsEntireBox(X_Y_Z_FROM_T(o)); }
362 
364 
370  int getChildrenIntersectingBox(double x, double y, double z, double size) const;
371 
373  int getChildrenIntersectingBox(const T& o) const { return getChildrenIntersectingBox(get_x(o), get_y(o), get_z(o), get_size(o)); }
374 
375 #ifdef AGGREGPACKING_BOOST_PYTHON
376  vector<OctreeNode*>* py_getChildrenIntersectingBox(double x, double y, double z, double size) const;
378 
380  vector<OctreeNode*>* py_getChildrenIntersectingBox(const T& o) const { return py_getChildrenIntersectingBox(get_x(o), get_y(o), get_z(o), get_size(o)); }
381 #endif
382 
384  OctreeNode* getRoot();
385 
387  const OctreeNode* getRoot() const;
388 
390 
396  OctreeNode* next() const;
397 
399 
405  void getPotentialNeighbors(vector<T>& answer, double x, double y, double z, double size) const;
406 
408 
411  void getPotentialNeighbors(vector<T>& answer, const T& o) const { getPotentialNeighbors(answer,get_x(o), get_y(o), get_z(o), get_size(o)); }
412 
413 #ifdef AGGREGPACKING_BOOST_PYTHON
414  vector<T>* py_getPotentialNeighbors(double x, double y, double z, double size) const;
416 
418  vector<T>* py_getPotentialNeighbors(const T& o) const { return py_getPotentialNeighbors(get_x(o), get_y(o), get_z(o), get_size(o)); }
419 #endif
420 
422 
425  static inline bool bitFlag2bool(int flag, int index) { return (bool)(flag & (1 << index) ); }
426 
427  // Auxiliary function // TODO
428  //static inline bool quickIntersectionCheck(const T& o, double x, double y, double z, double size);
429 
431  friend void Octree<T>::build(double x, double y, double z, double size);
432 };
433 
434 #include "octree.tcc"
435 
436 
437 } // namespace
438 #endif
void getPotentialNeighbors(vector< T > &answer, const T &o, int scale) const
Gets potential neighbors for given object, considering its scaled size.
Definition: octree.hpp:221
~Octree()
Destructor.
Definition: octree.hpp:269
OctreeNode(double x, double y, double z, OctreeNode &parent, int number)
Constructor, used by a parent node.
Definition: octree.hpp:71
vector< T > * py_getPotentialNeighbors(double x, double y, double z, double size) const
getPotentialNeighbors function for Python
Definition: octree.hpp:310
Octree()
Default constructor.
Definition: octree.hpp:138
const OctreeNode< T > & operator*() const
Dereference operator.
Definition: octree.hpp:112
OctreeNode< T > & operator*()
Dereference operator.
Definition: octree.hpp:79
bool operator!=(const OctreeNode &other)
Inequality operator, intended for Python.
Definition: octree.hpp:302
double getSize()
Getter for size.
Definition: octree.hpp:164
Octree(double x, double y, double z, double size)
Constructor.
Definition: octree.hpp:155
OctreeIterator & operator++()
Operator++.
Definition: octree.hpp:34
OctreeNode ** children
Child nodes.
Definition: octree.hpp:255
vector< T > data
Vector of data belonging to the node.
Definition: octree.hpp:258
const vector< T > & getData() const
Getter for data (by const reference)
Definition: octree.hpp:323
OctreeConstIterator(OctreeNode< T > *ptr)
Constructor from octree node pointer.
Definition: octree.hpp:94
bool containsEntireBox(double x, double y, double z, double size) const
Returns if receiver contains entirely given box or not.
Definition: octree.hpp:134
vector< T > * py_getPotentialNeighbors(const T &o) const
Returns new vector of potential neighbors, intended for Python.
Definition: octree.hpp:418
OctreeIterator< T > end()
Octree iterator end.
Definition: octree.hpp:193
const OctreeNode * getParent() const
Getter for parent (by const pointer)
Definition: octree.hpp:338
double getX()
Getter for x coordinate.
Definition: octree.hpp:305
vector< OctreeNode * > * py_getChildrenIntersectingBox(const T &o) const
Returns vector of children intersecting box, intended for Python.
Definition: octree.hpp:380
void getPotentialNeighbors(vector< T > &answer, const T &o) const
Gets potential neighbors for given object.
Definition: octree.hpp:214
vector< T > * py_getPotentialNeighbors(double x, double y, double z, double size) const
Returns new vector of potential neighbors, intended for Python.
Definition: octree.hpp:239
OctreeNode< T > * getRoot()
Getter for root (by pointer)
Definition: octree.hpp:175
int getChildrenIntersectingBox(double x, double y, double z, double size) const
Returns children intersecting given box.
Definition: octree.hpp:149
const OctreeNode< T > * operator->() const
Operator ->
Definition: octree.hpp:115
void divide(int depth)
Divides receiver until defined depth.
Definition: octree.hpp:82
bool operator==(const OctreeConstIterator &rhs)
Equality operator.
Definition: octree.hpp:106
OctreeNode< T > * ptr
stored octree node
Definition: octree.hpp:90
OctreeIterator< T > iterator
Octree iterator.
Definition: octree.hpp:187
vector< T > & getData()
Getter for data (by non-const reference)
Definition: octree.hpp:326
bool containsEntireBox(const T &o) const
Returns if receiver contains entirely axis aligned box made around given object.
Definition: octree.hpp:361
OctreeNode * parent
Parent node.
Definition: octree.hpp:261
vector< T > * py_getPotentialNeighbors(const T &o) const
getPotentialNeighbors function for Python
Definition: octree.hpp:228
Class representing octree node.
Definition: octree.hpp:46
OctreeIterator(OctreeNode< T > *ptr)
Constructor from octree node pointer.
Definition: octree.hpp:61
double getZ()
Getter for z coordinate.
Definition: octree.hpp:311
int getLevel()
Getter for level.
Definition: octree.hpp:317
void getPotentialNeighbors(vector< T > &answer, double x, double y, double z, double size) const
Gets potential neighbors around given point and size.
Definition: octree.hpp:301
void build(double x, double y, double z, double size)
Builds the octree structure.
Definition: octree.hpp:275
~OctreeNode()
Destructor.
Definition: octree.hpp:74
int getDepth()
Getter for depth.
Definition: octree.hpp:161
OctreeConstIterator operator++(int)
++operator
Definition: octree.hpp:103
Class representing full octree.
Definition: octree.hpp:128
OctreeNode * getRoot()
Getter for root (by pointer)
Definition: octree.hpp:192
double getY()
Getter for y coordinate.
Definition: octree.hpp:308
void getPotentialNeighbors(vector< T > &answer, double x, double y, double z, double size) const
returns vector of objects from receiver and its children
Definition: octree.hpp:222
OctreeNode< T > * ptr
stored octree node
Definition: octree.hpp:57
double y
y coordinate
Definition: octree.hpp:249
const OctreeNode ** getChildren() const
Getter for children (by const pointer to pointer)
Definition: octree.hpp:329
vector< T > * py_getPotentialNeighbors(const T &o, int scale) const
getPotentialNeighbors function for Python
Definition: octree.hpp:231
bool isLeaf() const
Returns if receiver is leaf or not.
Definition: octree.hpp:344
void getPotentialNeighbors(vector< T > &answer, const T &o) const
returns vector of objects from receiver, its neighbors and their children
Definition: octree.hpp:411
int getNumberOfNodes()
Returns total number of nodes of receiver.
Definition: octree.hpp:293
bool operator!=(const OctreeIterator &rhs)
Inequality operator.
Definition: octree.hpp:76
bool isRoot() const
Returns if receiver is root or not.
Definition: octree.hpp:341
OctreeConstIterator & operator++()
Operator++.
Definition: octree.hpp:42
OctreeIterator operator++(int)
++operator
Definition: octree.hpp:70
int level
level of the node
Definition: octree.hpp:264
OctreeNode * next() const
Returns next node.
Definition: octree.hpp:199
OctreeIterator< T > begin()
Octree iterator begin.
Definition: octree.hpp:190
vector< OctreeNode * > * py_getChildren()
Getter for children (as a vector, intended for Python)
Definition: octree.hpp:97
static bool bitFlag2bool(int flag, int index)
Auxiliary function to extract indexed value from bitmask flag.
Definition: octree.hpp:425
double size
Dimension of the node.
Definition: octree.hpp:267
vector< OctreeNode * > * py_getChildrenIntersectingBox(double x, double y, double z, double size) const
Returns vector of children intersecting box, intended for Python.
Definition: octree.hpp:173
Octree iterator.
Definition: octree.hpp:54
const OctreeNode< T > * getRoot() const
Getter for root (by const pointer)
Definition: octree.hpp:178
double x
x coordinate
Definition: octree.hpp:246
int number
Number of the node.
Definition: octree.hpp:270
int depth
Depth (number of levels)
Definition: octree.hpp:131
void addData(const T &data)
Adds data to receiver or its children. Determines x,y,z and size from given data. ...
Definition: octree.hpp:109
int getChildrenIntersectingBox(const T &o) const
Returns children of receiver receiver intersecting axis aligned box made around given object...
Definition: octree.hpp:373
OctreeNode< T > * operator->()
Operator ->
Definition: octree.hpp:82
OctreeNode< T > * root
Root node.
Definition: octree.hpp:134
bool operator!=(const OctreeConstIterator &rhs)
Inequality operator.
Definition: octree.hpp:109
void addData(const T &data)
Adds data to Octree.
Definition: octree.hpp:283
OctreeIterator(const OctreeIterator &it)
Copy constructor.
Definition: octree.hpp:64
OctreeNode * getParent()
Getter for parent (by pointer)
Definition: octree.hpp:335
double z
z coordinate
Definition: octree.hpp:252
Octree iterator.
Definition: octree.hpp:87
double getSize()
Getter for size.
Definition: octree.hpp:314
int getNumber()
Getter for number.
Definition: octree.hpp:320
bool operator==(const OctreeNode &other)
Equality operator, intended for Python.
Definition: octree.hpp:299
OctreeConstIterator< T > begin() const
Octree const iterator begin.
Definition: octree.hpp:196
bool operator==(const OctreeIterator &rhs)
Equality operator.
Definition: octree.hpp:73