Medusa  1.1
Coordinate Free Mehless Method implementation
mm::PolyhedronShape< vec_t > Class Template Reference

#include <PolyhedronShape_fwd.hpp>

Detailed Description

template<typename vec_t>
class mm::PolyhedronShape< vec_t >

A polyhedron represented by a closed triangular mesh.

This class uses CGAL (https://www.cgal.org/) and its Surface_mesh class to do the heavy lifting.

Note
CGAL (libcgal-dev) must be installed on your system and available in include and link paths for this class to work.
Warning
This header must be explicitly included to bet the 3D PolyhedronShape functionality. It is not included by default due to its dependency on CGAL.
Template Parameters
vec_tThis shape class is used only for 3D domains.

Usage example:

auto poly = PolyhedronShape<Vec3d>::fromOFF("test/testdata/bunny.off");
if (poly.contains({2.3, 4.5, 0.1})) {
// do something
}
std::cout << poly << std::endl;
// Boundary types are derived from face colors.
auto d = poly.discretizeBoundaryWithStep(2.5);

Definition at line 46 of file PolyhedronShape_fwd.hpp.

+ Inheritance diagram for mm::PolyhedronShape< vec_t >:
+ Collaboration diagram for mm::PolyhedronShape< vec_t >:

Public Member Functions

 PolyhedronShape (const Mesh &surface)
 Construct a shape from a CGAL surface mesh. More...
 
 PolyhedronShape (const PolyhedronShape &other)
 Copy constructor (necessary to rebuild the tree). More...
 
PolyhedronShapeoperator= (const PolyhedronShape &other)
 Copy assignment (necessary to rebuild the tree). More...
 
bool contains (const vec_t &point) const override
 Return true if point is not more than margin() outside the domain. More...
 
std::pair< vec_t, vec_t > bbox () const override
 Return the bounding box of the domain. More...
 
DomainDiscretization< vec_t > discretizeBoundaryWithDensity (const std::function< scalar_t(vec_t)> &dr, int type) const override
 Discretizes boundary with given density and fill engine. More...
 
std::ostream & print (std::ostream &os) const override
 Output information about this shape to given output stream os. More...
 
PolyhedronShapeclone () const override
 Polymorphic clone pattern. More...
 
virtual DomainDiscretization< vec_t > discretizeBoundaryWithDensity (const std::function< scalar_t(vec_t)> &dr, int type) const=0
 Discretizes boundary with given density and fill engine. More...
 
DomainDiscretization< vec_t > discretizeBoundaryWithDensity (const std::function< scalar_t(vec_t)> &dr) const
 Overload with default type. More...
 
virtual DomainDiscretization< vec_t > discretizeBoundaryWithStep (scalar_t step, int type) const
 Returns a discretization of the boundary of this shape with approximately uniform distance step between nodes. More...
 
DomainDiscretization< vec_t > discretizeBoundaryWithStep (scalar_t step) const
 Returns a discretization of the boundary of this shape with approximately uniform distance step between nodes. More...
 
scalar_t margin () const
 Returns current margin. More...
 
virtual void setMargin (scalar_t margin)
 Sets domain margin to margin. More...
 
void toggleMargin ()
 Toggles the margin from positive to negative. More...
 
ShapeUnion< vec_t > add (const DomainShape &other) const
 Returns a shape representing a union of *this and other. More...
 
ShapeUnion< vec_t > operator+ (const DomainShape &other) const
 Operator form of DomainShape::add. More...
 
ShapeDifference< vec_t > subtract (const DomainShape &other) const
 Returns a shape representing a difference of *this and other. More...
 
ShapeDifference< vec_t > operator- (const DomainShape &other) const
 Operator form of DomainShape::subtract. More...
 
virtual std::pair< bool, vec_t > projectPointToBoundary (const vec_t &point, const vec_t &unit_normal) const
 Project point to boundary using bisection along the line define by unit_normal. More...
 
virtual bool hasContains () const
 Return true if shape has contains() method implemented. More...
 
virtual DomainDiscretization< vec_t > discretizeBoundaryWithStep (scalar_t step, int type) const
 Returns a discretization of the boundary of this shape with approximately uniform distance step between nodes. More...
 
DomainDiscretization< vec_t > discretizeBoundaryWithStep (scalar_t step) const
 Returns a discretization of the boundary of this shape with approximately uniform distance step between nodes. More...
 
virtual DomainDiscretization< vec_t > discretizeWithStep (scalar_t step, int internal_type, int boundary_type) const
 Returns a discretization of this shape with approximately uniform distance step between nodes. More...
 
DomainDiscretization< vec_t > discretizeWithStep (scalar_t step) const
 discretizeWithStep but with default types as assigned by the shape. More...
 
virtual DomainDiscretization< vec_t > discretizeWithDensity (const std::function< scalar_t(vec_t)> &dr, int internal_type, int boundary_type) const
 Returns a discretization of the domain with spatially variable step. More...
 
template<typename func_t , typename fill_t >
DomainDiscretization< vec_t > discretizeWithDensity (const func_t &dr, const fill_t &fill, int internal_type, int boundary_type) const
 Overload for fill engine. More...
 
DomainDiscretization< vec_t > discretizeWithDensity (const std::function< scalar_t(vec_t)> &dr) const
 Overload with default types. More...
 
template<typename func_t , typename fill_t >
DomainDiscretization< vec_t > discretizeWithDensity (const func_t &dr, const fill_t &fill) const
 Overload for fill engine with default types. More...
 
DomainDiscretization< vec_t > discretizeBoundaryWithDensity (const std::function< scalar_t(vec_t)> &dr) const
 Overload with default type. More...
 
TranslatedShape< vec_t > translate (const vec_t &a)
 Translate the shape by given vector a. More...
 
RotatedShape< vec_t > rotate (const Eigen::Matrix< scalar_t, dim, dim > &Q)
 Transform the shape by given orthogonal matrix Q. More...
 
RotatedShape< vec_t > rotate (scalar_t angle)
 2D version of rotate accepting an angle. More...
 

Static Public Member Functions

static PolyhedronShape fromOFF (const std::string &filename)
 Read a triangular closed surface mesh describing a polyhedron from a .off file. More...
 
static int rgb2type (uint8_t r, uint8_t g, uint8_t b)
 Convert a RBG color to an integer value that can be used as a boundary type. More...
 

Public Types

typedef vec_t::Scalar scalar_t
 Scalar data type used in computation. More...
 
typedef vec_t vector_t
 Vector data type used in computations. More...
 
enum  { dim = vec_t::dim }
 Store dimension of the domain. More...
 

Protected Attributes

scalar_t margin_
 Tolerance for the geometric operation of the domain. More...
 

Private Types

using base_t = DomainShape< vec_t >
 Base class type. More...
 
typedef CGAL::Simple_cartesian< double > K
 CGAL geometry kernel. More...
 
typedef K::Point_3 Point
 CGAL point type. More...
 
typedef K::Vector_3 Vector
 CGAL vector type. More...
 
typedef CGAL::Surface_mesh< PointMesh
 CGAL surface mesh type. More...
 
typedef Mesh::Vertex_index VI
 CGAL index type for a point on a surface mesh. More...
 
typedef Mesh::Face_index FI
 CGAL index type for a face on a surface mesh. More...
 
typedef CGAL::AABB_face_graph_triangle_primitive< MeshPrimitive
 CGAL type for storing triangular faces of surface meshes in AABB tree. More...
 
typedef CGAL::AABB_tree< CGAL::AABB_traits< K, Primitive > > Tree
 CGAL type for axis-aligned bounding-box trees, used for testing point inclusions. More...
 
typedef CGAL::Side_of_triangle_mesh< Mesh, KPointInside
 CGAL type of the function for testing point inclusion. More...
 

Private Member Functions

void init ()
 Initialize the tree and compute surface normals. More...
 
vec_t getPoint (VI idx) const
 Convert a CGAL vertex index to a Medusa vector. More...
 

Private Attributes

Mesh surface
 Surface of the polyhedron represented as a triangular mesh. More...
 
Tree tree
 AABB tree of the faces. More...
 
PointInside inside_tester
 Function used for testing point inclusions. More...
 

Member Enumeration Documentation

◆ anonymous enum

template<typename vec_t >
anonymous enum
inherited

Store dimension of the domain.

Enumerator
dim 

Dimensionality of the domain.

Definition at line 57 of file DomainShape_fwd.hpp.

Constructor & Destructor Documentation

◆ PolyhedronShape() [1/2]

template<typename vec_t >
mm::PolyhedronShape< vec_t >::PolyhedronShape ( const Mesh surface)
inlineexplicit

Construct a shape from a CGAL surface mesh.

See also
fromOff.

Definition at line 87 of file PolyhedronShape_fwd.hpp.

◆ PolyhedronShape() [2/2]

template<typename vec_t >
mm::PolyhedronShape< vec_t >::PolyhedronShape ( const PolyhedronShape< vec_t > &  other)
inline

Copy constructor (necessary to rebuild the tree).

Definition at line 91 of file PolyhedronShape_fwd.hpp.

Member Function Documentation

◆ add()

template<typename vec_t >
ShapeUnion< vec_t > mm::DomainShape< vec_t >::add ( const DomainShape< vec_t > &  other) const
inherited

Returns a shape representing a union of *this and other.

Definition at line 66 of file DomainShape.hpp.

◆ bbox()

template<typename vec_t >
std::pair<vec_t, vec_t> mm::PolyhedronShape< vec_t >::bbox ( ) const
inlineoverridevirtual

Return the bounding box of the domain.

Bounding box is returned in format bbox() == {{mx, my, ...}, {MX, MY, ...}}, such that mx <= Mx and my <= My etc.\ and that the whole domain is contained in the cuboid [mx, my, ...] x [Mx, My, ...].

Implements mm::DomainShape< vec_t >.

Definition at line 128 of file PolyhedronShape_fwd.hpp.

◆ clone()

template<typename vec_t >
PolyhedronShape* mm::PolyhedronShape< vec_t >::clone ( ) const
inlineoverridevirtual

Polymorphic clone pattern.

Implements mm::DomainShape< vec_t >.

Definition at line 141 of file PolyhedronShape_fwd.hpp.

◆ contains()

template<typename vec_t >
bool mm::PolyhedronShape< vec_t >::contains ( const vec_t &  point) const
inlineoverridevirtual

Return true if point is not more than margin() outside the domain.

Implements mm::DomainShape< vec_t >.

Definition at line 124 of file PolyhedronShape_fwd.hpp.

◆ discretizeBoundaryWithDensity() [1/4]

template<typename vec_t >
DomainDiscretization<vec_t> mm::DomainShape< vec_t >::discretizeBoundaryWithDensity
inline

Overload with default type.

Definition at line 189 of file DomainShape_fwd.hpp.

◆ discretizeBoundaryWithDensity() [2/4]

template<typename vec_t >
DomainDiscretization<vec_t> mm::DomainShape< vec_t >::discretizeBoundaryWithDensity ( const std::function< scalar_t(vec_t)> &  dr) const
inlineinherited

Overload with default type.

Definition at line 189 of file DomainShape_fwd.hpp.

◆ discretizeBoundaryWithDensity() [3/4]

template<typename vec_t >
DomainDiscretization< vec_t > mm::PolyhedronShape< vec_t >::discretizeBoundaryWithDensity ( const std::function< scalar_t(vec_t)> &  dr,
int  type 
) const
overridevirtual

Discretizes boundary with given density and fill engine.

If type is 0, the underlying shape provides the default.

Implements mm::DomainShape< vec_t >.

Definition at line 11 of file PolyhedronShape.hpp.

◆ discretizeBoundaryWithDensity() [4/4]

template<typename vec_t >
virtual DomainDiscretization<vec_t> mm::DomainShape< vec_t >::discretizeBoundaryWithDensity

Discretizes boundary with given density and fill engine.

If type is 0, the underlying shape provides the default.

◆ discretizeBoundaryWithStep() [1/4]

template<typename vec_t >
DomainDiscretization<vec_t> mm::DomainShape< vec_t >::discretizeBoundaryWithStep
inline

Returns a discretization of the boundary of this shape with approximately uniform distance step between nodes.

Node type are decided by the underlying shape.

Definition at line 126 of file DomainShape_fwd.hpp.

◆ discretizeBoundaryWithStep() [2/4]

template<typename vec_t >
DomainDiscretization<vec_t> mm::DomainShape< vec_t >::discretizeBoundaryWithStep ( scalar_t  step) const
inlineinherited

Returns a discretization of the boundary of this shape with approximately uniform distance step between nodes.

Node type are decided by the underlying shape.

Definition at line 126 of file DomainShape_fwd.hpp.

◆ discretizeBoundaryWithStep() [3/4]

template<typename vec_t >
virtual DomainDiscretization<vec_t> mm::DomainShape< vec_t >::discretizeBoundaryWithStep
inline

Returns a discretization of the boundary of this shape with approximately uniform distance step between nodes.

step must be positive. Added nodes are of type type, which must be non-positive. Value 0 indicates that types are dependant on the implementation of concrete shape.

Definition at line 118 of file DomainShape_fwd.hpp.

◆ discretizeBoundaryWithStep() [4/4]

template<typename vec_t >
virtual DomainDiscretization<vec_t> mm::DomainShape< vec_t >::discretizeBoundaryWithStep ( scalar_t  step,
int  type 
) const
inlinevirtualinherited

Returns a discretization of the boundary of this shape with approximately uniform distance step between nodes.

step must be positive. Added nodes are of type type, which must be non-positive. Value 0 indicates that types are dependant on the implementation of concrete shape.

Reimplemented in mm::PolygonShape< vec_t >, mm::TranslatedShape< vec_t >, mm::ShapeUnion< vec_t >, mm::BoxShape< vec_t >, mm::ShapeDifference< vec_t >, and mm::BallShape< vec_t >.

Definition at line 118 of file DomainShape_fwd.hpp.

◆ discretizeWithDensity() [1/4]

template<typename vec_t >
template<typename func_t , typename fill_t >
DomainDiscretization<vec_t> mm::DomainShape< vec_t >::discretizeWithDensity ( const func_t &  dr,
const fill_t &  fill 
) const
inlineinherited

Overload for fill engine with default types.

Definition at line 177 of file DomainShape_fwd.hpp.

◆ discretizeWithDensity() [2/4]

template<typename vec_t >
template<typename func_t , typename fill_t >
DomainDiscretization<vec_t> mm::DomainShape< vec_t >::discretizeWithDensity ( const func_t &  dr,
const fill_t &  fill,
int  internal_type,
int  boundary_type 
) const
inlineinherited

Overload for fill engine.

Definition at line 162 of file DomainShape_fwd.hpp.

◆ discretizeWithDensity() [3/4]

template<typename vec_t >
DomainDiscretization<vec_t> mm::DomainShape< vec_t >::discretizeWithDensity ( const std::function< scalar_t(vec_t)> &  dr) const
inlineinherited

Overload with default types.

Definition at line 170 of file DomainShape_fwd.hpp.

◆ discretizeWithDensity() [4/4]

template<typename vec_t >
DomainDiscretization< vec_t > mm::DomainShape< vec_t >::discretizeWithDensity ( const std::function< scalar_t(vec_t)> &  dr,
int  internal_type,
int  boundary_type 
) const
virtualinherited

Returns a discretization of the domain with spatially variable step.

Parameters
drFunction giving desired internodal distance at each point.
internal_typeUser supplied type of internal nodes. Must be non-negative.
boundary_typeUser supplied type of boundary nodes. Must be non-positive. If any of the types is 0, the underlying shape provides the default.
Returns
Discretization with nodes distributed according to dr.

Reimplemented in mm::TranslatedShape< vec_t >, mm::ShapeUnion< vec_t >, and mm::ShapeDifference< vec_t >.

Definition at line 77 of file DomainShape.hpp.

◆ discretizeWithStep() [1/2]

template<typename vec_t >
DomainDiscretization<vec_t> mm::DomainShape< vec_t >::discretizeWithStep ( scalar_t  step) const
inlineinherited

discretizeWithStep but with default types as assigned by the shape.

Definition at line 144 of file DomainShape_fwd.hpp.

◆ discretizeWithStep() [2/2]

template<typename vec_t >
virtual DomainDiscretization<vec_t> mm::DomainShape< vec_t >::discretizeWithStep ( scalar_t  step,
int  internal_type,
int  boundary_type 
) const
inlinevirtualinherited

Returns a discretization of this shape with approximately uniform distance step between nodes.

step must be positive.

Parameters
stepDesired internodal distance.
internal_typeUser supplied type of internal nodes. Must be non-negative.
boundary_typeUser supplied type of boundary nodes. Must be non-positive. If any of the types is 0, the underlying shape provides the default.

Reimplemented in mm::TranslatedShape< vec_t >, mm::ShapeUnion< vec_t >, mm::BoxShape< vec_t >, mm::ShapeDifference< vec_t >, and mm::BallShape< vec_t >.

Definition at line 137 of file DomainShape_fwd.hpp.

◆ fromOFF()

template<typename vec_t >
static PolyhedronShape mm::PolyhedronShape< vec_t >::fromOFF ( const std::string &  filename)
inlinestatic

Read a triangular closed surface mesh describing a polyhedron from a .off file.

The face colors are read and stored as well and used to determine surface point types. See the method rgb2type for how RBG colors are converted to boundary types.

Parameters
filenamePath to the .off file.
Exceptions
Assertionfails if file cannot be read, the surface is empty, not triangular or not closed.
Examples
test/domains/PolyhedronShape_test.cpp.

Definition at line 110 of file PolyhedronShape_fwd.hpp.

◆ getPoint()

template<typename vec_t >
vec_t mm::PolyhedronShape< vec_t >::getPoint ( VI  idx) const
inlineprivate

Convert a CGAL vertex index to a Medusa vector.

Definition at line 150 of file PolyhedronShape_fwd.hpp.

◆ hasContains()

template<typename vec_t >
virtual bool mm::DomainShape< vec_t >::hasContains ( ) const
inlinevirtualinherited

◆ init()

template<typename vec_t >
void mm::PolyhedronShape< vec_t >::init ( )
inlineprivate

Initialize the tree and compute surface normals.

Definition at line 69 of file PolyhedronShape_fwd.hpp.

◆ margin()

template<typename vec_t >
scalar_t mm::DomainShape< vec_t >::margin ( ) const
inlineinherited

Returns current margin.

Definition at line 72 of file DomainShape_fwd.hpp.

◆ operator+()

template<typename vec_t >
ShapeUnion<vec_t> mm::DomainShape< vec_t >::operator+ ( const DomainShape< vec_t > &  other) const
inlineinherited

Operator form of DomainShape::add.

See also
add

Definition at line 81 of file DomainShape_fwd.hpp.

◆ operator-()

template<typename vec_t >
ShapeDifference<vec_t> mm::DomainShape< vec_t >::operator- ( const DomainShape< vec_t > &  other) const
inlineinherited

Operator form of DomainShape::subtract.

See also
subtract

Definition at line 86 of file DomainShape_fwd.hpp.

◆ operator=()

template<typename vec_t >
PolyhedronShape& mm::PolyhedronShape< vec_t >::operator= ( const PolyhedronShape< vec_t > &  other)
inline

Copy assignment (necessary to rebuild the tree).

Definition at line 95 of file PolyhedronShape_fwd.hpp.

◆ print()

template<typename vec_t >
std::ostream& mm::PolyhedronShape< vec_t >::print ( std::ostream &  os) const
inlineoverridevirtual

Output information about this shape to given output stream os.

Implements mm::DomainShape< vec_t >.

Definition at line 136 of file PolyhedronShape_fwd.hpp.

◆ projectPointToBoundary()

template<typename vec_t >
std::pair< bool, vec_t > mm::DomainShape< vec_t >::projectPointToBoundary ( const vec_t &  point,
const vec_t &  unit_normal 
) const
virtualinherited

Project point to boundary using bisection along the line define by unit_normal.

Definition at line 21 of file DomainShape.hpp.

◆ rgb2type()

template<typename vec_t >
static int mm::PolyhedronShape< vec_t >::rgb2type ( uint8_t  r,
uint8_t  g,
uint8_t  b 
)
inlinestatic

Convert a RBG color to an integer value that can be used as a boundary type.

Definition at line 144 of file PolyhedronShape_fwd.hpp.

◆ rotate() [1/2]

template<typename vec_t >
RotatedShape< vec_t > mm::DomainShape< vec_t >::rotate ( const Eigen::Matrix< scalar_t, dim, dim > &  Q)
inherited

Transform the shape by given orthogonal matrix Q.

Note
It is usually faster to first discretize the domain and than transform the whole discretization using DomainDiscretization::rotate.

Definition at line 98 of file DomainShape.hpp.

◆ rotate() [2/2]

template<typename vec_t >
RotatedShape< vec_t > mm::DomainShape< vec_t >::rotate ( scalar_t  angle)
inherited

2D version of rotate accepting an angle.

Definition at line 89 of file DomainShape.hpp.

◆ setMargin()

template<typename vec_t >
virtual void mm::DomainShape< vec_t >::setMargin ( scalar_t  margin)
inlinevirtualinherited

Sets domain margin to margin.

Reimplemented in mm::PolygonShape< vec_t >.

Definition at line 75 of file DomainShape_fwd.hpp.

◆ subtract()

template<typename vec_t >
ShapeDifference< vec_t > mm::DomainShape< vec_t >::subtract ( const DomainShape< vec_t > &  other) const
inherited

Returns a shape representing a difference of *this and other.

Definition at line 71 of file DomainShape.hpp.

◆ toggleMargin()

template<typename vec_t >
void mm::DomainShape< vec_t >::toggleMargin ( )
inlineinherited

Toggles the margin from positive to negative.

Definition at line 77 of file DomainShape_fwd.hpp.

◆ translate()

template<typename vec_t >
TranslatedShape< vec_t > mm::DomainShape< vec_t >::translate ( const vec_t &  a)
inherited

Translate the shape by given vector a.

Note
It is usually faster to first discretize the domain and than translate the whole discretization using DomainDiscretization::translate.

Definition at line 84 of file DomainShape.hpp.

Member Data Documentation

◆ inside_tester

template<typename vec_t >
PointInside mm::PolyhedronShape< vec_t >::inside_tester
private

Function used for testing point inclusions.

Definition at line 66 of file PolyhedronShape_fwd.hpp.

◆ margin_

template<typename vec_t >
scalar_t mm::DomainShape< vec_t >::margin_
protectedinherited

Tolerance for the geometric operation of the domain.

The domain should behave as if it was margin_ thicker. Default margin is 1e-10.

Definition at line 64 of file DomainShape_fwd.hpp.

◆ surface

template<typename vec_t >
Mesh mm::PolyhedronShape< vec_t >::surface
private

Surface of the polyhedron represented as a triangular mesh.

Definition at line 64 of file PolyhedronShape_fwd.hpp.

◆ tree

template<typename vec_t >
Tree mm::PolyhedronShape< vec_t >::tree
private

AABB tree of the faces.

Definition at line 65 of file PolyhedronShape_fwd.hpp.


The documentation for this class was generated from the following files:
mm::PolyhedronShape::fromOFF
static PolyhedronShape fromOFF(const std::string &filename)
Read a triangular closed surface mesh describing a polyhedron from a .off file.
Definition: PolyhedronShape_fwd.hpp:110