KrisLibrary  1.0.0
ConvexHull3D.h
Go to the documentation of this file.
1 
2 #ifndef GEOMETRY_CONVEXHULL3D_H
3 #define GEOMETRY_CONVEXHULL3D_H
4 
5 #include <KrisLibrary/utils/AnyValue.h>
7 #include <KrisLibrary/math/vector.h>
9 #include <KrisLibrary/math3d/AABB3D.h>
10 #include <KrisLibrary/math3d/Box3D.h>
11 #include <KrisLibrary/math3d/geometry3d.h>
12 #include <KrisLibrary/utils/IntTriple.h>
13 #include <tuple>
14 #include <memory>
15 
21 typedef struct DT_ShapeHandle__* DT_ShapeHandle;
22 typedef struct DT_ObjectHandle__* DT_ObjectHandle;
23 
24 namespace Geometry {
25 
26 using namespace Math;
27 using namespace Math3D;
28 
36 bool ConvexHull3D_Qhull(const std::vector<Vector3>& points,std::vector<std::vector<int> >& facets);
37 bool ConvexHull3D_Qhull(const std::vector<double>& points,std::vector<std::vector<int> >& facets);
38 
47 bool ConvexHull3D_Qhull(const std::vector<Vector3>& points,std::vector<IntTriple>& tris);
48 
49 
63 {
64 public:
65  typedef std::vector<double> PolytopeData;
66  typedef Vector3 PointData;
67  typedef std::pair<ConvexHull3D, ConvexHull3D> MinkowskiData;
68  typedef std::pair<ConvexHull3D, RigidTransform> TransData;
69  typedef std::pair<ConvexHull3D, ConvexHull3D> HullData;
70  //typedef std::vector<ConvexHull3D> CompositeData;
71 
76  enum Type { Empty, Polytope, Box, Cone, Cylinder, Sphere, Point, Line, Minkowski, Trans, Hull};
77  ConvexHull3D();
78  void SetPoint(const Vector3& a);
79  void SetPoints(const Vector& a);
80  void SetPoints(const std::vector<double>& a);
81  void SetPoints(const std::vector<Vector3> & a);
82  void SetPoints(const std::vector<Vector> & a);
84  void SetTrans(const ConvexHull3D &hull, const RigidTransform& xform);
85  void SetHull(const ConvexHull3D &hull1, const ConvexHull3D &hull2);
86  bool Contains(const Vector3& pt);
87  Real Distance(const Vector3& pt);
88  bool Collides(const ConvexHull3D& g,Vector3* common_point=NULL);
89  Real Distance(const ConvexHull3D & g);
91  std::tuple<Real, Vector3, Vector3> ClosestPoints(const ConvexHull3D & other) const;
92  Real ClosestPoint(const Vector3& pt,Vector3& cp,Vector3& direction) const;
93  Real ClosestPoints(const ConvexHull3D& g, Vector3& cp, Vector3& direction) const;
94  void Transform(const Matrix4 &T);
95  AABB3D GetAABB() const;
96  Box3D GetBB() const;
97  PolytopeData& AsPolytope();
98  const PolytopeData& AsPolytope() const;
99  const PointData& AsPoint() const;
100  const TransData& AsTrans() const;
101  const HullData& AsHull() const;
102  size_t NumPrimitives() const;
103  GeometricPrimitive3D GetPrimitive(int index) const;
104 
105  AnyValue data; // Stored in the same format as the Solid_X structs listed above
106  Type type;
107 
109  ShapeHandleContainer(DT_ShapeHandle data);
111  DT_ShapeHandle data;
112  };
113  std::shared_ptr<ShapeHandleContainer> shapeHandle; //internal SOLID data
114 };
115 
125 {
126 public:
127  CollisionConvexHull3D(const ConvexHull3D& hull);
128  CollisionConvexHull3D(); // no value, waiting to be initialized
129  bool Contains(const Vector3& pt) const;
130  Real Distance(const Vector3 &pt) const;
131  bool Collides(CollisionConvexHull3D& geometry, Vector3* common_point=nullptr) const;
132  Real ClosestPoint(const Vector3& pt,Vector3& cp,Vector3& direction) const;
133  Real ClosestPoints(CollisionConvexHull3D& g, Vector3& cp, Vector3& direction) const;
134 
135  void UpdateTransform(const RigidTransform& tran);
137  void UpdateHullSecondRelativeTransform(const RigidTransform& tran);
138 
139  Vector3 FindSupport(const Vector3& dir) const;
140 
141  ConvexHull3D::Type type;
143  ObjectHandleContainer(DT_ObjectHandle data);
145  DT_ObjectHandle data;
146  };
147  std::shared_ptr<ObjectHandleContainer> objectHandle;
148  DT_ShapeHandle shapeHandle;
149  double transform[16];
150 };
151 
152 std::ostream& operator << (std::ostream& out,const ConvexHull3D& h);
153 std::istream& operator >> (std::istream& in,ConvexHull3D& h);
154 
155 } //namespace Geometry
156 
157 #endif
bool ConvexHull3D_Qhull(const vector< Vector3 > &points, vector< vector< int > > &facets)
Computes the convex hull of the point set using the Qhull library.
Definition: ConvexHull3D.cpp:68
void GetBB(const CollisionMesh &m, Box3D &bb)
Returns the bounding box containing m.
Definition: CollisionMesh.cpp:1856
Common math typedefs, constants, functions.
A generic 3D geometric primitive class.
Definition: geometry3d.h:33
Real Distance(const CollisionImplicitSurface &s, const Vector3 &pt)
Definition: CollisionImplicitSurface.cpp:140
A 3D vector class.
Definition: math3d/primitives.h:136
A polymorphic container class that can contain data of any type.
Definition: AnyValue.h:25
Type
Definition: ConvexHull3D.h:76
A 3D axis-aligned bounding box.
Definition: AABB3D.h:13
Class declarations for useful 3D math types.
A rigid-body transformation.
Definition: math3d/primitives.h:820
A 4x4 matrix class.
Definition: math3d/primitives.h:626
Contains all the definitions in the Math3D package.
Definition: AnyGeometry.h:13
The collision data class for ConvexHull3D that contains the solid3 data structure moved by some rigid...
Definition: ConvexHull3D.h:124
int ClosestPoint(const CollisionMesh &mesh, const Vector3 &p, Vector3 &cp, Real bound)
Definition: CollisionMesh.cpp:1309
Contains all definitions in the Math package.
Definition: WorkspaceBound.h:12
A 3D convex hull class.
Definition: ConvexHull3D.h:62
Definition: ConvexHull3D.h:108
A 3D boxThe box is the unit cube [0,1]^3 set in the scaled local coordinate system. That is, one corner is at the origin, and it has dimensions [dims.x,dims.y,dims.z] in the coordinates given by {xbasis,ybasis,zbasis}.
Definition: Box3D.h:21
bool Collides(const CollisionImplicitSurface &s, const CollisionPointCloud &pc, Real margin, vector< int > &collidingPoints, size_t maxContacts)
Definition: CollisionImplicitSurface.cpp:195
Contains all definitions in the Geometry package.
Definition: AnyGeometry.cpp:26