OGS
MeshElementGrid.h
Go to the documentation of this file.
1 /*
2  * \brief Declaration of the MeshElementGrid class.
3  *
4  * \file
5  * \copyright
6  * Copyright (c) 2012-2021, OpenGeoSys Community (http://www.opengeosys.org)
7  * Distributed under a Modified BSD License.
8  * See accompanying file LICENSE.txt or
9  * http://www.opengeosys.org/project/license
10  */
11 
12 #pragma once
13 
14 #include <array>
15 #include <limits>
16 #include <vector>
17 
18 #include "GeoLib/AABB.h"
19 #include "MathLib/Point3d.h"
20 
21 namespace MeshLib {
22 
23 // forward declarations
24 class Mesh;
25 class Element;
26 
32 class MeshElementGrid final {
33 public:
36  explicit MeshElementGrid(MeshLib::Mesh const& mesh);
37 
43  template <typename POINT>
44  std::vector<MeshLib::Element const*> getElementsInVolume(
45  POINT const& min, POINT const& max) const
46  {
47  auto const min_coords(getGridCellCoordinates(min));
48  auto const max_coords(getGridCellCoordinates(max));
49 
50  std::vector<MeshLib::Element const*> elements_vec;
51 
52  const std::size_t n_plane(_n_steps[0]*_n_steps[1]);
53  for (std::size_t i(min_coords.second[0]); i<=max_coords.second[0]; i++) {
54  for (std::size_t j(min_coords.second[1]); j<=max_coords.second[1]; j++) {
55  for (std::size_t k(min_coords.second[2]); k<=max_coords.second[2]; k++) {
56  std::size_t idx(i+j*_n_steps[0]+k*n_plane);
57  elements_vec.insert(end(elements_vec),
58  begin(_elements_in_grid_box[idx]),
59  end(_elements_in_grid_box[idx]));
60  }
61  }
62  }
63  return elements_vec;
64  }
65 
68  Eigen::Vector3d const& getMinPoint() const;
71  Eigen::Vector3d const& getMaxPoint() const;
72 
73 private:
74  void sortElementsInGridCells(MeshLib::Mesh const& mesh);
75  bool sortElementInGridCells(MeshLib::Element const& element);
76 
81  std::pair<bool, std::array<std::size_t,3>>
83  std::array<double,3> _step_sizes{};
84  std::array<double,3> _inverse_step_sizes{};
85  std::array<std::size_t,3> _n_steps;
86  std::vector<std::vector<MeshLib::Element const*>> _elements_in_grid_box;
87 };
88 } // namespace MeshLib
Definition of the AABB class.
Definition of the Point3d class.
Class AABB is an axis aligned bounding box around a given set of geometric points of (template) type ...
Definition: AABB.h:49
void sortElementsInGridCells(MeshLib::Mesh const &mesh)
std::vector< MeshLib::Element const * > getElementsInVolume(POINT const &min, POINT const &max) const
std::vector< std::vector< MeshLib::Element const * > > _elements_in_grid_box
MeshElementGrid(MeshLib::Mesh const &mesh)
std::pair< bool, std::array< std::size_t, 3 > > getGridCellCoordinates(MathLib::Point3d const &p) const
bool sortElementInGridCells(MeshLib::Element const &element)
Eigen::Vector3d const & getMinPoint() const
std::array< double, 3 > _inverse_step_sizes
std::array< std::size_t, 3 > _n_steps
std::array< double, 3 > _step_sizes
Eigen::Vector3d const & getMaxPoint() const