irafhy
Interval arithmetic based Reachability Analysis Framework for Hybrid Automaton
convexHull.hpp
Go to the documentation of this file.
1 #ifndef UTILITY_COMP_GEOMETRY_CONVEX_HULL_H
2 #define UTILITY_COMP_GEOMETRY_CONVEX_HULL_H
3 
7 #include <iterator>
8 #include <libqhull_r/poly_r.h>
9 #include <libqhullcpp/Qhull.h>
10 #include <libqhullcpp/RboxPoints.h>
11 #include <libqhullcpp/QhullFacetList.h>
12 #include <libqhullcpp/QhullPoints.h>
13 #include <libqhullcpp/QhullError.h>
14 #include <libqhullcpp/QhullVertexSet.h>
15 #include <Eigen/Sparse>
16 #include <utility>
17 #include <vector>
18 
19 namespace irafhy
20 {
22  {
23  private:
27  std::vector<Point> pointConstraints_;
31  std::vector<HalfSpace> halfSpaceConstraints_;
35  std::vector<std::vector<HalfSpace>> neighborHalfSpaces_;
39  std::vector<std::vector<Point>> facetVertices_;
43  std::vector<std::vector<int>> facetVerticesIdx_;
47  double volume_{};
51  int dimension_{};
52 
53  public:
57  convexConstraints() = default;
62  convexConstraints(const convexConstraints& constraints) = default;
67  convexConstraints(convexConstraints&& constraints) noexcept = default;
78  convexConstraints(std::vector<Point>& pointConstraints,
79  std::vector<HalfSpace>& halfSpaceConstraints,
80  std::vector<std::vector<HalfSpace>> neighborHalfSpaces,
81  std::vector<std::vector<Point>> facetVertices,
82  std::vector<std::vector<int>> facetVerticesIdx,
83  double volume,
84  int dimension)
85  : pointConstraints_(pointConstraints)
86  , halfSpaceConstraints_(halfSpaceConstraints)
87  , neighborHalfSpaces_(std::move(neighborHalfSpaces))
88  , facetVertices_(std::move(facetVertices))
89  , facetVerticesIdx_(std::move(facetVerticesIdx))
90  , volume_(volume)
91  , dimension_(dimension)
92  {}
97  [[nodiscard]] std::vector<Point> pointConstraints() const { return pointConstraints_; }
102  [[nodiscard]] std::vector<HalfSpace> halfSpaceConstraints() const { return halfSpaceConstraints_; }
107  [[nodiscard]] std::vector<std::vector<HalfSpace>> neighborHalfSpaces() const { return neighborHalfSpaces_; }
112  [[nodiscard]] std::vector<std::vector<Point>> faceVertices() const { return facetVertices_; }
117  [[nodiscard]] std::vector<std::vector<int>> faceVerticesIdx() const { return facetVerticesIdx_; }
122  [[nodiscard]] double volume() const { return volume_; }
127  [[nodiscard]] int dimension() const { return dimension_; }
128  };
129 
131  {
132  public:
138  static convexConstraints constraints(const std::vector<Point>& points)
139  {
140  assert(!points.empty());
141  //check if all points have same dimension
142  int dimension = points.front().dimension();
143  for (const auto& point : points)
144  assert(dimension == point.dimension());
145  //construct a qhull solver
146  orgQhull::RboxPoints rboxPoints;
147  rboxPoints.setDimension(dimension);
148  std::vector<coordT> tempData;
149  for (const Point& point : points)
150  {
151  for (int dimIdx = 0; dimIdx < dimension; ++dimIdx)
152  tempData.emplace_back(point[dimIdx]);
153  }
154  orgQhull::QhullPoints qhullPoints(
155  dimension, static_cast<countT>(points.size() * dimension), tempData.data());
156  for (const orgQhull::QhullPoint& qhullPoint : qhullPoints)
157  rboxPoints.append(qhullPoint);
158  //the qhull disable the copy constructor function
159  orgQhull::Qhull qhull(rboxPoints, "");
160  //self check the facets
161  // qh_check_points(qhull.qh());
162  //get the constraints of the given qhull
163  std::vector<Point> pointConstraints = orgQhull::getVertices(qhull);
164  std::vector<HalfSpace> halfSpaceConstraints = orgQhull::getHalfSpaces(qhull);
165  //get the constraint of per facet
166  std::vector<std::vector<Point>> facetVertices;
167  std::vector<std::vector<HalfSpace>> neighborHalfSpaces;
168  std::vector<std::vector<int>> facetVerticesIdx;
169  for (const orgQhull::QhullFacet& qhullFacet : qhull.facetList())
170  {
171  facetVertices.emplace_back(orgQhull::getVertices(qhullFacet));
172  facetVerticesIdx.emplace_back(orgQhull::getVerticesIdx(qhullFacet));
173  neighborHalfSpaces.emplace_back(orgQhull::getHalfSpaces(qhullFacet.neighborFacets()));
174  }
175  for (auto& fIndex : facetVerticesIdx)
176  {
177  for (int& pIndex : fIndex)
178  {
179  auto curIter = std::find(pointConstraints.begin(), pointConstraints.end(), points[pIndex]);
180  pIndex = std::distance(pointConstraints.begin(), curIter);
181  }
182  }
183  return convexConstraints(pointConstraints,
184  halfSpaceConstraints,
185  neighborHalfSpaces,
186  facetVertices,
187  facetVerticesIdx,
188  qhull.volume(),
189  qhull.dimension());
190  }
191  };
192 } // namespace irafhy
193 #endif //UTILITY_COMP_GEOMETRY_CONVEX_HULL_H
std::vector< std::vector< Point > > facetVertices_
each facet&#39;s extreme vertices
Definition: convexHull.hpp:39
std::vector< HalfSpace > halfSpaceConstraints() const
get the half space constraints which define the convex hull
Definition: convexHull.hpp:102
std::vector< std::vector< HalfSpace > > neighborHalfSpaces_
each half space&#39;s neighbor half spaces
Definition: convexHull.hpp:35
Definition: convexHull.hpp:21
double volume_
volume of the convex hull
Definition: convexHull.hpp:47
convexConstraints(std::vector< Point > &pointConstraints, std::vector< HalfSpace > &halfSpaceConstraints, std::vector< std::vector< HalfSpace >> neighborHalfSpaces, std::vector< std::vector< Point >> facetVertices, std::vector< std::vector< int >> facetVerticesIdx, double volume, int dimension)
constructor with given information
Definition: convexHull.hpp:78
std::vector< HalfSpace > halfSpaceConstraints_
boundary half spaces which define the convex hull
Definition: convexHull.hpp:31
Definition: point.h:10
std::vector< std::vector< int > > facetVerticesIdx_
indexes of each facet&#39;s extreme vertices in whole convex hull extreme vertices
Definition: convexHull.hpp:43
std::vector< std::vector< Point > > faceVertices() const
get the vertices of each facet
Definition: convexHull.hpp:112
std::vector< std::vector< HalfSpace > > neighborHalfSpaces() const
get the vector storing each facet&#39;s neighbor facets
Definition: convexHull.hpp:107
Definition: condition.cpp:3
int dimension() const
get the dimension of the space which the convex hull in
Definition: convexHull.hpp:127
convexConstraints()=default
constructor
static convexConstraints constraints(const std::vector< Point > &points)
constructor of convex hull with given points
Definition: convexHull.hpp:138
int dimension_
dimension of the space which the convex hull in
Definition: convexHull.hpp:51
std::vector< std::vector< int > > faceVerticesIdx() const
get the indexes of each facet
Definition: convexHull.hpp:117
std::vector< Point > pointConstraints() const
get the extreme vertices which define the convex hull
Definition: convexHull.hpp:97
double volume() const
get the volume of the convex hull
Definition: convexHull.hpp:122
std::vector< Point > pointConstraints_
extreme vertices which define the convex hull
Definition: convexHull.hpp:27
Definition: convexHull.hpp:130