48 const base_node *min, *max;
51 struct box_index_id_compare {
52 bool operator()(
const box_index *plhs,
const box_index *prhs)
const {
53 return plhs->id < prhs->id;
57 struct box_index_topology_compare {
58 const scalar_type EPS;
59 bool is_less(
const base_node &lhs,
const base_node &rhs)
const {
60 GMM_ASSERT2(lhs.size() == rhs.size(),
"size mismatch");
61 for (
size_type i = 0; i < lhs.size(); ++i)
62 if (gmm::abs(lhs[i] - rhs[i]) > EPS) {
63 return lhs[i] < rhs[i];
68 box_index_topology_compare(scalar_type EPS_) : EPS{EPS_} {}
70 bool operator()(
const box_index &lhs,
const box_index &rhs)
const {
71 if (EPS == scalar_type(0))
72 return lhs.id < rhs.id;
74 return is_less(*lhs.min, *rhs.min) ||
75 (!is_less(*rhs.min, *lhs.min) && is_less(*lhs.max, *rhs.max));
79 struct rtree_elt_base {
80 enum { RECTS_PER_LEAF=8 };
82 bool isleaf()
const {
return isleaf_; }
84 rtree_elt_base(
bool leaf,
const base_node& rmin_,
const base_node& rmax_)
85 : isleaf_(leaf), rmin(rmin_), rmax(rmax_) {}
86 virtual ~rtree_elt_base() {}
99 using box_cont = std::set<box_index,box_index_topology_compare> ;
100 using pbox_cont = std::vector<const box_index*>;
101 using pbox_set = std::set<const box_index *, box_index_id_compare>;
103 rtree(scalar_type EPS = 0);
109 size_type nb_boxes()
const {
return boxes.size(); }
113 pbox_set& boxlst)
const;
115 pbox_set& boxlst)
const;
117 pbox_set& boxlst)
const;
118 void find_boxes_at_point(
const base_node& P, pbox_set& boxlst)
const;
119 void find_line_intersecting_boxes(
const base_node& org,
121 pbox_set& boxlst)
const;
122 void find_line_intersecting_boxes(
const base_node& org,
126 pbox_set& boxlst)
const;
129 std::vector<size_type>& idvec) {
131 find_intersecting_boxes(bmin, bmax, bs);
132 pbox_set_to_idvec(bs, idvec);
135 std::vector<size_type>& idvec) {
137 find_containing_boxes(bmin, bmax, bs);
138 pbox_set_to_idvec(bs, idvec);
140 void find_contained_boxes(
const base_node& bmin,
142 std::vector<size_type>& idvec) {
144 find_contained_boxes(bmin, bmax, bs);
145 pbox_set_to_idvec(bs, idvec);
147 void find_boxes_at_point(
const base_node& P,
148 std::vector<size_type>& idvec)
const
149 { pbox_set bs; find_boxes_at_point(P, bs); pbox_set_to_idvec(bs, idvec); }
150 void find_line_intersecting_boxes(
const base_node& org,
152 std::vector<size_type>& idvec) {
154 find_line_intersecting_boxes(org, dirv, bs);
155 pbox_set_to_idvec(bs, idvec);
157 void find_line_intersecting_boxes(
const base_node& org,
161 std::vector<size_type>& idvec) {
163 find_line_intersecting_boxes(org, dirv, bmin, bmax, bs);
164 pbox_set_to_idvec(bs, idvec);
170 void pbox_set_to_idvec(pbox_set bs, std::vector<size_type>& idvec)
const {
171 idvec.reserve(bs.size()); idvec.resize(0);
172 for (pbox_set::const_iterator it=bs.begin(); it != bs.end(); ++it)
173 idvec.push_back((*it)->id);
176 const scalar_type EPS;
179 std::unique_ptr<rtree_elt_base> root;
181 getfem::lock_factory locks_;
Structure which dynamically collects points identifying points that are nearer than a certain very sm...
Store a set of points, identifying points that are nearer than a certain very small distance.
Balanced tree of n-dimensional rectangles.
size_t size_type
used as the common size type in the library