42 : mesh_(mesh), leaf_size_limit(soft_leaf_size_limit), r_gen(123)
44 ASSERT(mesh !=
nullptr,
" ");
82 double left_bound=node_box.
min(axis);
83 double right_bound=node_box.
max(axis);
87 left_bound = std::max( left_bound,
elements_[ *
left ].max(axis) );
93 right_bound = std::min( right_bound,
elements_[ *
right ].min(axis) );
102 left_bound = std::max( left_bound,
elements_[ *
left ].max(axis) );
106 right_bound = std::min( right_bound,
elements_[ *
right ].min(axis) );
111 unsigned int right_end = node.
leaf_end();
112 unsigned int depth = node.
depth()+1;
116 nodes_.back().set_leaf(left_begin, left_end, left_bound, depth);
118 nodes_.back().set_leaf(left_end, right_end, right_bound, depth);
163 unsigned int median_idx;
164 unsigned int n_elements = node.
leaf_size();
168 std::uniform_int_distribution<unsigned int> distribution(node.
leaf_begin(), node.
leaf_end()-1);
170 for (
unsigned int i=0; i<
coors_.size(); i++) {
171 median_idx = distribution(this->
r_gen);
178 coors_.resize(n_elements);
179 for (
unsigned int i=0; i<
coors_.size(); i++) {
186 unsigned int median_position = (
unsigned int)(
coors_.size() / 2);
189 return coors_[median_position];
205 std::stack<unsigned int, std::vector<unsigned int> > node_stack;
209 while (! node_stack.empty()) {
229 node_stack.push( node.
child(0) );
233 node_stack.push( node.
child(1) );
242 sort(result_list.begin(), result_list.end());
243 it = unique(result_list.begin(), result_list.end());
244 ASSERT_EQUAL(searsearchedElements.size() , it - result_list.begin());
void set_max(unsigned int axis, double max)
static const double size_reduce_factor
required reduction in size of box to allow further splitting
unsigned int leaf_end() const
Bounding box in 3d ambient space.
unsigned int child(unsigned int i_child) const
Return index of child node.
const BoundingBox & tree_box()
void find_bounding_box(const BoundingBox &boundingBox, std::vector< unsigned int > &result_list)
unsigned char longest_axis() const
#define FOR_ELEMENTS(_mesh_, __i)
unsigned int max_n_levels
Maximal count of BIH tree levels.
void split_node(const BoundingBox &node_box, unsigned int node_idx)
split tree node given by node_idx, distribute elements to child nodes
std::vector< BoundingBox > elements_
vector of mesh elements bounding boxes
double estimate_median(unsigned char axis, const BIHNode &node)
void expand(const Point &point)
void element_boxes()
create bounding boxes of element
BoundingBox main_box_
Main bounding box.
void make_node(const BoundingBox &box, unsigned int node_idx)
create child nodes of node given by node_idx
unsigned int size() const
Returns size of the container. This is independent of the allocated space.
Global macros to enhance readability and debugging, general constants.
unsigned int n_elements() const
unsigned int leaf_size_limit
Maximal number of elements stored in a leaf node of BIH tree.
arma::vec::fixed< spacedim > Point
#define ASSERT_EQUAL(a, b)
bool projection_lt(unsigned int axis, double value) const
const Point & max() const
unsigned char depth() const
return depth of leaf node
bool projection_gt(unsigned int axis, double value) const
BIHTree(Mesh *mesh, unsigned int soft_leaf_size_limit=20)
std::vector< double > coors_
temporary vector stored values of coordinations for calculating median
#define FOR_NODES(_mesh_, i)
double size(unsigned int axis) const
std::vector< unsigned int > in_leaves_
vector stored element indexes in leaf nodes
unsigned int leaf_size() const
unsigned int get_element_count()
unsigned int axis() const
return axes (coordination of splitting) of inner node
void set_min(unsigned int axis, double min)
bool is_leaf() const
return true if node is leaf
const Point & min() const
void find_point(const Space< 3 >::Point &point, std::vector< unsigned int > &result_list)
static const unsigned int max_median_sample_size
max count of elements to estimate median - value must be even
NodeVector node_vector
Vector of nodes of the mesh.
unsigned int leaf_begin() const
ElementVector element
Vector of elements of the mesh.
std::vector< BIHNode > nodes_
vector of tree nodes