Point Cloud Library (PCL)
1.9.1
|
39 #ifndef PCL_OCTREE_TREE_2BUF_BASE_H
40 #define PCL_OCTREE_TREE_2BUF_BASE_H
44 #include <pcl/octree/octree_nodes.h>
45 #include <pcl/octree/octree_container.h>
46 #include <pcl/octree/octree_key.h>
47 #include <pcl/octree/octree_iterator.h>
55 template<
typename ContainerT>
81 for (b = 0; b < 2; ++b)
82 for (i = 0; i < 8; ++i)
108 getChildPtr (
unsigned char buffer_arg,
unsigned char index_arg)
const
110 assert( (buffer_arg<2) && (index_arg<8));
119 inline void setChildPtr (
unsigned char buffer_arg,
unsigned char index_arg,
122 assert( (buffer_arg<2) && (index_arg<8));
131 inline bool hasChild (
unsigned char buffer_arg,
unsigned char index_arg)
const
133 assert( (buffer_arg<2) && (index_arg<8));
223 template<
typename LeafContainerT = int,
258 PCL_DEPRECATED (
"Please use leaf_depth_begin () instead.")
264 PCL_DEPRECATED (
"Please use leaf_depth_end () instead.")
374 createLeaf (
unsigned int idx_x_arg,
unsigned int idx_y_arg,
unsigned int idx_z_arg);
384 findLeaf (
unsigned int idx_x_arg,
unsigned int idx_y_arg,
unsigned int idx_z_arg);
393 existLeaf (
unsigned int idx_x_arg,
unsigned int idx_y_arg,
unsigned int idx_z_arg)
const;
401 removeLeaf (
unsigned int idx_x_arg,
unsigned int idx_y_arg,
unsigned int idx_z_arg);
448 bool do_XOR_encoding_arg =
false);
457 std::vector<LeafContainerT*>& leaf_container_vector_arg,
458 bool do_XOR_encoding_arg =
false);
464 serializeLeafs (std::vector<LeafContainerT*>& leaf_container_vector_arg);
478 bool do_XOR_decoding_arg =
false);
487 std::vector<LeafContainerT*>& leaf_container_vector_arg,
488 bool do_XOR_decoding_arg =
false);
507 inline LeafContainerT*
510 LeafContainerT* result = 0;
520 inline LeafContainerT*
579 unsigned char child_idx_arg)
const
606 for (i = 0; i < 8; i++)
609 node_bits |=
static_cast<char> ( (!!child) << i);
621 unsigned char bufferSelector_arg)
const
628 for (i = 0; i < 8; i++)
631 node_bits |=
static_cast<char> ( (!!child) << i);
648 node_bits[0] = node_bits[1] = 0;
650 for (i = 0; i < 8; i++)
655 node_bits[0] |=
static_cast<char> ( (!!childA) << i);
656 node_bits[1] |=
static_cast<char> ( (!!childB) << i);
659 return node_bits[0] ^ node_bits[1];
677 unsigned char buffer_selector_arg,
678 unsigned char child_idx_arg)
680 if (branch_arg.
hasChild(buffer_selector_arg, child_idx_arg))
692 delete (branchChild);
699 delete (branchChild);
707 branch_arg.
setChildPtr(buffer_selector_arg, child_idx_arg, 0);
728 for (i = 0; i < 8; i++)
754 unsigned char child_idx_arg)
761 return new_branch_child;
776 return new_leaf_child;
794 unsigned int depth_mask_arg,
798 bool branch_reset_arg =
false);
810 unsigned int depth_mask_arg,
812 LeafContainerT*& result_arg)
const;
823 unsigned int depth_mask_arg,
837 std::vector<char>* binary_tree_out_arg,
838 typename std::vector<LeafContainerT*>* leaf_container_vector_arg,
839 bool do_XOR_encoding_arg =
false,
840 bool new_leafs_filter_arg =
false);
855 unsigned int depth_mask_arg,
857 typename std::vector<char>::const_iterator& binary_tree_in_it_arg,
858 typename std::vector<char>::const_iterator& binary_tree_in_it_end_arg,
859 typename std::vector<LeafContainerT*>::const_iterator* leaf_container_vector_it_arg,
860 typename std::vector<LeafContainerT*>::const_iterator* leaf_container_vector_it_end_arg,
861 bool branch_reset_arg =
false,
862 bool do_XOR_decoding_arg =
false);
897 inline double Log2 (
double n_arg)
899 return log (n_arg) / log (2.0);
915 unsigned char mask = 1;
918 for (
int i = 0; i < 8; i++)
921 std::cout << ((data_arg & (mask << i)) ?
"1" :
"0");
923 std::cout << std::endl;
962 #ifdef PCL_NO_PRECOMPILE
963 #include <pcl/octree/impl/octree2buf_base.hpp>
const typedef OctreeLeafNodeBreadthFirstIterator< OctreeT > ConstLeafNodeBreadthIterator
OctreeBreadthFirstIterator< OctreeT > BreadthFirstIterator
This file defines compatibility wrappers for low level I/O functions.
ContainerT & getContainer()
Get reference to container.
LeafNodeBreadthIterator leaf_breadth_begin(unsigned int max_depth_arg=0u)
BufferedBranchNode & operator=(const BufferedBranchNode &source_arg)
Copy operator.
void deletePreviousBuffer()
Delete octree structure of previous buffer.
const BreadthFirstIterator breadth_end()
bool existLeaf(unsigned int idx_x_arg, unsigned int idx_y_arg, unsigned int idx_z_arg) const
Check for the existence of leaf node at (idx_x_arg, idx_y_arg, idx_z_arg).
OctreeNode * child_node_array_[2][8]
void deleteCurrentBuffer()
Delete the octree structure in the current buffer.
virtual node_type_t getNodeType() const =0
Pure virtual method for receiving the type of octree node (branch or leaf)
const LeafNodeDepthFirstIterator leaf_depth_end()
std::size_t branch_count_
Amount of branch nodes
const ContainerT * getContainerPtr() const
Get const pointer to container.
void serializeLeafs(std::vector< LeafContainerT * > &leaf_container_vector_arg)
Outputs a vector of all DataT elements that are stored within the octree leaf nodes.
OctreeDepthFirstIterator< OctreeT > Iterator
OctreeNode * getBranchChildPtr(const BranchNode &branch_arg, unsigned char child_idx_arg) const
Retrieve a child node pointer for child node at child_idx.
LeafNodeDepthFirstIterator leaf_depth_begin(unsigned int max_depth_arg=0)
const LeafNodeIterator leaf_end()
char getBranchXORBitPattern(const BranchNode &branch_arg) const
Generate XOR bit pattern reflecting differences between the two octree buffers.
OctreeNode * getChildPtr(unsigned char buffer_arg, unsigned char index_arg) const
Get child pointer in current branch node.
virtual ~BufferedBranchNode()
Empty constructor.
Iterator begin(unsigned int max_depth_arg=0)
virtual void serializeTreeCallback(LeafContainerT &, const OctreeKey &)
Callback executed for every leaf node data during serialization.
OctreeLeafNodeDepthFirstIterator< OctreeT > LeafNodeDepthFirstIterator
void removeLeaf(const OctreeKey &key_arg)
Remove leaf node from octree.
BranchNode * createBranchChild(BranchNode &branch_arg, unsigned char child_idx_arg)
Fetch and add a new branch child to a branch class in current buffer.
unsigned char buffer_selector_
Currently active octree buffer
std::size_t getBranchCount() const
Return the amount of existing branches in the octree.
BufferedBranchNode()
Empty constructor.
BranchNode * root_node_
Pointer to root branch node of octree
BufferedBranchNode< BranchContainerT > BranchNode
unsigned int depth_mask_
Depth mask based on octree depth
char getBranchBitPattern(const BranchNode &branch_arg, unsigned char bufferSelector_arg) const
Generate bit pattern reflecting the existence of child node pointers in specific buffer.
Abstract octree node class
void printBinary(char data_arg)
Prints binary representation of a byte - used for debugging.
bool hasBranchChanges(const BranchNode &branch_arg) const
Test if branch changed between previous and current buffer.
bool hasChild(unsigned char buffer_arg, unsigned char index_arg) const
Check if branch is pointing to a particular child node.
LeafContainerT * findLeaf(const OctreeKey &key_arg) const
Find leaf node.
OctreeLeafNodeDepthFirstIterator< OctreeT > LeafNodeIterator
virtual node_type_t getNodeType() const
Get the type of octree node.
Octree double buffer class
Abstract octree leaf class
unsigned int getTreeDepth() const
Get the maximum depth of the octree.
bool deleteLeafRecursive(const OctreeKey &key_arg, unsigned int depth_mask_arg, BranchNode *branch_arg)
Recursively search and delete leaf node.
DepthFirstIterator depth_begin(unsigned int maxDepth_arg=0)
bool existLeaf(const OctreeKey &key_arg) const
Check if leaf doesn't exist in the octree.
LeafContainerT * createLeaf(const OctreeKey &key_arg)
Create a leaf node.
double Log2(double n_arg)
Helper function to calculate the binary logarithm.
ContainerT * getContainerPtr()
Get pointer to container.
Octree2BufBase()
Empty constructor.
LeafContainerT * findLeaf(unsigned int idx_x_arg, unsigned int idx_y_arg, unsigned int idx_z_arg)
Find leaf node at (idx_x_arg, idx_y_arg, idx_z_arg).
virtual BufferedBranchNode * deepCopy() const
Method to perform a deep copy of the octree.
Octree2BufBase & operator=(const Octree2BufBase &source)
Copy constructor.
Octree2BufBase< LeafContainerT, BranchContainerT > OctreeT
std::size_t leaf_count_
Amount of leaf nodes
void removeLeaf(unsigned int idx_x_arg, unsigned int idx_y_arg, unsigned int idx_z_arg)
Remove leaf node at (idx_x_arg, idx_y_arg, idx_z_arg).
void deserializeTreeRecursive(BranchNode *branch_arg, unsigned int depth_mask_arg, OctreeKey &key_arg, typename std::vector< char >::const_iterator &binary_tree_in_it_arg, typename std::vector< char >::const_iterator &binary_tree_in_it_end_arg, typename std::vector< LeafContainerT * >::const_iterator *leaf_container_vector_it_arg, typename std::vector< LeafContainerT * >::const_iterator *leaf_container_vector_it_end_arg, bool branch_reset_arg=false, bool do_XOR_decoding_arg=false)
Rebuild an octree based on binary XOR octree description and DataT objects for leaf node initializati...
const typedef OctreeBreadthFirstIterator< OctreeT > ConstBreadthFirstIterator
void setTreeDepth(unsigned int depth_arg)
Set the maximum depth of the octree.
Abstract octree iterator class
void reset()
Reset branch node container for every branch buffer.
const ContainerT & getContainer() const
Get const reference to container.
BufferedBranchNode(const BufferedBranchNode &source)
Copy constructor.
LeafNodeIterator leaf_begin(unsigned int max_depth_arg=0)
unsigned int octree_depth_
Octree depth.
unsigned int createLeafRecursive(const OctreeKey &key_arg, unsigned int depth_mask_arg, BranchNode *branch_arg, LeafNode *&return_leaf_arg, BranchNode *&parent_of_leaf_arg, bool branch_reset_arg=false)
Create a leaf node at octree key.
bool octreeCanResize()
Test if octree is able to dynamically change its depth.
const typedef OctreeLeafNodeDepthFirstIterator< OctreeT > ConstLeafNodeIterator
void treeCleanUpRecursive(BranchNode *branch_arg)
Recursively explore the octree and remove unused branch and leaf nodes.
const ContainerT & operator*() const
Get const reference to container.
Octree leaf node iterator class.
Octree2BufBase(const Octree2BufBase &source)
Copy constructor.
virtual OctreeNode * deepCopy() const =0
Pure virtual method to perform a deep copy of the octree.
char getBranchBitPattern(const BranchNode &branch_arg) const
Generate bit pattern reflecting the existence of child node pointers for current buffer.
void setBranchChildPtr(BranchNode &branch_arg, unsigned char child_idx_arg, OctreeNode *new_child_arg)
Assign new child node to branch.
bool branchHasChild(const BranchNode &branch_arg, unsigned char child_idx_arg) const
Check if branch is pointing to a particular child node.
LeafNode * createLeafChild(BranchNode &branch_arg, unsigned char child_idx_arg)
Fetch and add a new leaf child to a branch class.
const DepthFirstIterator depth_end()
OctreeNode * getRootNode() const
Retrieve root node.
void setChildPtr(unsigned char buffer_arg, unsigned char index_arg, OctreeNode *newNode_arg)
Set child pointer in current branch node.
const LeafNodeBreadthIterator leaf_breadth_end()
OctreeKey max_key_
key range
Octree leaf node iterator class.
void deleteBranch(BranchNode &branch_arg)
Delete branch and all its subchilds from octree (both buffers)
void deserializeTree(std::vector< char > &binary_tree_in_arg, bool do_XOR_decoding_arg=false)
Deserialize a binary octree description vector and create a corresponding octree structure.
void deleteTree()
Delete the octree structure and its leaf nodes.
void findLeafRecursive(const OctreeKey &key_arg, unsigned int depth_mask_arg, BranchNode *branch_arg, LeafContainerT *&result_arg) const
Recursively search for a given leaf node and return a pointer.
void switchBuffers()
Switch buffers and reset current octree structure.
void serializeTreeRecursive(BranchNode *branch_arg, OctreeKey &key_arg, std::vector< char > *binary_tree_out_arg, typename std::vector< LeafContainerT * > *leaf_container_vector_arg, bool do_XOR_encoding_arg=false, bool new_leafs_filter_arg=false)
Recursively explore the octree and output binary octree description together with a vector of leaf no...
LeafContainerT LeafContainer
void serializeNewLeafs(std::vector< LeafContainerT * > &leaf_container_vector_arg)
Outputs a vector of all DataT elements from leaf nodes, that do not exist in the previous octree buff...
const typedef OctreeDepthFirstIterator< OctreeT > ConstDepthFirstIterator
const typedef OctreeDepthFirstIterator< OctreeT > ConstIterator
void deleteBranchChild(BranchNode &branch_arg, unsigned char child_idx_arg)
Delete child node and all its subchilds from octree in current buffer.
BreadthFirstIterator breadth_begin(unsigned int max_depth_arg=0)
void serializeTree(std::vector< char > &binary_tree_out_arg, bool do_XOR_encoding_arg=false)
Serialize octree into a binary output vector describing its branch node structure.
OctreeLeafNodeBreadthFirstIterator< OctreeT > LeafNodeBreadthIterator
OctreeDepthFirstIterator< OctreeT > DepthFirstIterator
BranchContainerT BranchContainer
void deleteBranchChild(BranchNode &branch_arg, unsigned char buffer_selector_arg, unsigned char child_idx_arg)
Delete child node and all its subchilds from octree in specific buffer.
void setMaxVoxelIndex(unsigned int max_voxel_index_arg)
Set the maximum amount of voxels per dimension.
bool dynamic_depth_enabled_
Enable dynamic_depth.
const ContainerT * getContainerPtr() const
Get const pointer to container.
Octree container class that does not store any information.
std::size_t getLeafCount() const
Return the amount of existing leafs in the octree.
LeafContainerT * createLeaf(unsigned int idx_x_arg, unsigned int idx_y_arg, unsigned int idx_z_arg)
Create new leaf node at (idx_x_arg, idx_y_arg, idx_z_arg).
const ContainerT * operator->() const
Get const pointer to container.
virtual void deserializeTreeCallback(LeafContainerT &, const OctreeKey &)
Callback executed for every leaf node data during deserialization.
OctreeLeafNode< LeafContainerT > LeafNode
const typedef OctreeLeafNodeDepthFirstIterator< OctreeT > ConstLeafNodeDepthFirstIterator
virtual ~Octree2BufBase()
Empty deconstructor.