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

#include <ShapeDifference_fwd.hpp>

Detailed Description

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

A class representing a set-difference of two shapes.

Used when constructing shapes for later discretization or obtained implicitly with DomainShape::operator-(), DomainShape::subtract() and DomainDiscretization::subtract().

Usage example:

BoxShape<Vec3d> c(-1.0, 1.0);
BallShape<Vec3d> b(0.0, 1.0);
auto u = c - b;
if (u.contains({0, 0.2, -0.3})) {
// do something
}
std::cout << u << std::endl;
See also
ShapeUnion, DomainShape, DomainDiscretization

Definition at line 26 of file ShapeDifference_fwd.hpp.

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

Public Member Functions

 ShapeDifference (const DomainShape< vec_t > &shape1, const DomainShape< vec_t > &shape2)
 Constructs a shape representing shape1 - shape2. More...
 
const DomainShape< vec_t > & first () const
 Access the first shape. More...
 
const DomainShape< vec_t > & second () const
 Access the second shape. More...
 
bool contains (const vec_t &point) const override
 Return true if point is not more than margin() outside the domain. More...
 
bool hasContains () const override
 Return true if shape has contains() method implemented. More...
 
DomainDiscretization< vec_t > discretizeBoundaryWithStep (scalar_t step, int type) const override
 Returns a discretization of the boundary of this shape with approximately uniform distance step between nodes. More...
 
DomainDiscretization< vec_t > discretizeWithStep (scalar_t step, int internal_type, int boundary_type) const override
 Returns a discretization of this shape with approximately uniform distance step between nodes. 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...
 
DomainDiscretization< vec_t > discretizeWithDensity (const std::function< scalar_t(vec_t)> &dr, int internal_type, int boundary_type) const override
 Returns a discretization of the domain with spatially variable step. More...
 
std::pair< vec_t, vec_t > bbox () const override
 Return the bounding box of the domain. More...
 
ShapeDifference< vec_t > * clone () const override
 Polymorphic clone pattern. More...
 
std::ostream & print (std::ostream &os) const override
 Output information about this shape to given output stream os. 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...
 
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...
 
DomainDiscretization< vec_t > discretizeWithStep (scalar_t step) const
 discretizeWithStep but with default types as assigned by the shape. 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...
 

Public Types

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

Protected Attributes

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

Private Attributes

deep_copy_unique_ptr< DomainShape< vec_t > > sh1
 First shape. More...
 
deep_copy_unique_ptr< DomainShape< vec_t > > sh2
 Second shape. 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

◆ ShapeDifference()

template<typename vec_t >
mm::ShapeDifference< vec_t >::ShapeDifference ( const DomainShape< vec_t > &  shape1,
const DomainShape< vec_t > &  shape2 
)
inline

Constructs a shape representing shape1 - shape2.

Definition at line 39 of file ShapeDifference_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::ShapeDifference< 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 66 of file ShapeDifference_fwd.hpp.

◆ clone()

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

Polymorphic clone pattern.

Implements mm::DomainShape< vec_t >.

Definition at line 67 of file ShapeDifference_fwd.hpp.

◆ contains()

template<typename vec_t >
bool mm::ShapeDifference< 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 49 of file ShapeDifference_fwd.hpp.

◆ discretizeBoundaryWithDensity() [1/2]

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() [2/2]

template<typename vec_t >
DomainDiscretization< vec_t > mm::ShapeDifference< 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 37 of file ShapeDifference.hpp.

◆ discretizeBoundaryWithStep() [1/2]

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() [2/2]

template<typename vec_t >
DomainDiscretization< vec_t > mm::ShapeDifference< vec_t >::discretizeBoundaryWithStep ( scalar_t  step,
int  type 
) const
overridevirtual

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 from mm::DomainShape< vec_t >.

Definition at line 17 of file ShapeDifference.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::ShapeDifference< vec_t >::discretizeWithDensity ( const std::function< scalar_t(vec_t)> &  dr,
int  internal_type,
int  boundary_type 
) const
overridevirtual

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 from mm::DomainShape< vec_t >.

Definition at line 47 of file ShapeDifference.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 >
DomainDiscretization< vec_t > mm::ShapeDifference< vec_t >::discretizeWithStep ( scalar_t  step,
int  internal_type,
int  boundary_type 
) const
overridevirtual

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 from mm::DomainShape< vec_t >.

Definition at line 27 of file ShapeDifference.hpp.

◆ first()

template<typename vec_t >
const DomainShape<vec_t>& mm::ShapeDifference< vec_t >::first ( ) const
inline

Access the first shape.

Definition at line 45 of file ShapeDifference_fwd.hpp.

◆ hasContains()

template<typename vec_t >
bool mm::ShapeDifference< vec_t >::hasContains ( ) const
inlineoverridevirtual

Return true if shape has contains() method implemented.

Reimplemented from mm::DomainShape< vec_t >.

Definition at line 53 of file ShapeDifference_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.

◆ print()

template<typename vec_t >
std::ostream & mm::ShapeDifference< vec_t >::print ( std::ostream &  os) const
overridevirtual

Output information about this shape to given output stream os.

Implements mm::DomainShape< vec_t >.

Definition at line 57 of file ShapeDifference.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.

◆ 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.

◆ second()

template<typename vec_t >
const DomainShape<vec_t>& mm::ShapeDifference< vec_t >::second ( ) const
inline

Access the second shape.

Definition at line 47 of file ShapeDifference_fwd.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

◆ 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.

◆ sh1

template<typename vec_t >
deep_copy_unique_ptr<DomainShape<vec_t> > mm::ShapeDifference< vec_t >::sh1
private

First shape.

Definition at line 28 of file ShapeDifference_fwd.hpp.

◆ sh2

template<typename vec_t >
deep_copy_unique_ptr<DomainShape<vec_t> > mm::ShapeDifference< vec_t >::sh2
private

Second shape.

Definition at line 29 of file ShapeDifference_fwd.hpp.


The documentation for this class was generated from the following files: