Flow123d
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
flow123d
src
mesh
bih_tree.hh
Go to the documentation of this file.
1
/**!
2
*
3
* Copyright (C) 2007 Technical University of Liberec. All rights reserved.
4
*
5
* Please make a following refer to Flow123d on your project site if you use the program for any purpose,
6
* especially for academic research:
7
* Flow123d, Research Centre: Advanced Remedial Technologies, Technical University of Liberec, Czech Republic
8
*
9
* This program is free software; you can redistribute it and/or modify it under the terms
10
* of the GNU General Public License version 3 as published by the Free Software Foundation.
11
*
12
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
* See the GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License along with this program; if not,
17
* write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 021110-1307, USA.
18
*
19
*
20
* $Id: bih_tree.hh 1567 2012-02-28 13:24:58Z jan.brezina $
21
* $Revision: 1567 $
22
* $LastChangedBy: jan.brezina $
23
* $LastChangedDate: 2012-02-28 14:24:58 +0100 (Tue, 28 Feb 2012) $
24
*
25
*
26
*/
27
28
#ifndef BIH_TREE_HH_
29
#define BIH_TREE_HH_
30
31
#include "
mesh/bih_node.hh
"
32
#include "
mesh/mesh.h
"
33
#include "
mesh/point.hh
"
34
#include <armadillo>
35
36
37
38
/**
39
* @brief Class for O(log N) lookup for intersections with a set of bounding boxes.
40
*
41
* Notes:
42
* Assumes spacedim=3. Implementation was designed for arbitrary number of childs per node, but
43
* currently it supports max 2 childs per node (binary tree).
44
*
45
*/
46
class
BIHTree
{
47
public
:
48
/// count of dimensions
49
static
const
unsigned
int
dimension
= 3;
50
/// max count of elements to estimate median - value must be even
51
static
const
unsigned
int
max_median_sample_size
= 5;
52
53
/**
54
* Constructor
55
*
56
* Set class members and call functions which create tree
57
* @param mesh - Mesh used for creation the tree
58
* @param soft_leaf_size_limit - Maximal number of elements stored in a leaf node of BIH tree.
59
*/
60
BIHTree
(
Mesh
* mesh,
unsigned
int
soft_leaf_size_limit = 20);
61
62
/**
63
* Destructor
64
*/
65
~BIHTree
();
66
67
/**
68
* Get count of elements stored in tree
69
*
70
* @return Count of bounding boxes stored in elements_ member
71
*/
72
unsigned
int
get_element_count
();
73
74
/**
75
* Main bounding box of the whole tree.
76
*/
77
const
BoundingBox
&
tree_box
();
78
79
/**
80
* Gets elements which can have intersection with bounding box
81
*
82
* @param boundingBox Bounding box which is tested if has intersection
83
* @param searchedElements vector of ids of suspect elements
84
*/
85
void
find_bounding_box
(
const
BoundingBox
&boundingBox,
std::vector<unsigned int>
&result_list);
86
87
/**
88
* Gets elements which can have intersection with point
89
*
90
* @param point Point which is tested if has intersection
91
* @param searchedElements vector of ids of suspect elements
92
*/
93
void
find_point
(
const
Space<3>::Point
&
point
,
std::vector<unsigned int>
&result_list);
94
95
/**
96
* Get vector of mesh elements bounding boxes
97
*
98
* @return elements_ vector
99
*/
100
std::vector<BoundingBox>
&
get_elements
() {
return
elements_
; }
101
102
protected
:
103
/// required reduction in size of box to allow further splitting
104
static
const
double
size_reduce_factor
;
105
106
/// create bounding boxes of element
107
void
element_boxes
();
108
109
/// split tree node given by node_idx, distribute elements to child nodes
110
void
split_node
(
const
BoundingBox
&node_box,
unsigned
int
node_idx);
111
112
/// create child nodes of node given by node_idx
113
void
make_node
(
const
BoundingBox
&box,
unsigned
int
node_idx);
114
115
/**
116
* For given node takes projection of centers of bounding boxes of its elements to axis given by
117
* @p node::axis()
118
* and estimate median of these values. That is optimal split point.
119
* Precise median is computed for sets smaller then @p max_median_sample_size
120
* estimate from random sample is used for larger sets.
121
*/
122
double
estimate_median
(
unsigned
char
axis,
const
BIHNode
&node);
123
124
/// mesh
125
Mesh
*
mesh_
;
126
/// vector of mesh elements bounding boxes
127
std::vector<BoundingBox>
elements_
;
128
/// vector of tree nodes
129
std::vector<BIHNode>
nodes_
;
130
/// Main bounding box.
131
BoundingBox
main_box_
;
132
/// Maximal number of elements stored in a leaf node of BIH tree.
133
unsigned
int
leaf_size_limit
;
134
/// Maximal count of BIH tree levels
135
unsigned
int
max_n_levels
;
136
137
/// vector stored element indexes in leaf nodes
138
std::vector<unsigned int>
in_leaves_
;
139
/// temporary vector stored values of coordinations for calculating median
140
std::vector<double>
coors_
;
141
142
// random generator
143
std::mt19937
r_gen
;
144
145
};
146
147
#endif
/* BIH_TREE_HH_ */
Generated on Thu May 29 2014 23:14:48 for Flow123d by
1.8.4