DGtal  0.9.4beta
Public Types | Public Member Functions | Protected Types | Private Attributes
DGtal::EuclideanShapesCSG< ShapeA, ShapeB > Class Template Reference

#include <DGtal/shapes/EuclideanShapesDecorator.h>

Collaboration diagram for DGtal::EuclideanShapesCSG< ShapeA, ShapeB >:
[legend]

Public Types

typedef ShapeA::Space Space
 
typedef ShapeA::RealPoint RealPoint
 

Public Member Functions

 BOOST_CONCEPT_ASSERT ((concepts::CEuclideanBoundedShape< ShapeA >))
 
 BOOST_CONCEPT_ASSERT ((concepts::CEuclideanOrientedShape< ShapeA >))
 
 EuclideanShapesCSG ()
 
 EuclideanShapesCSG (const EuclideanShapesCSG &other)
 
 EuclideanShapesCSG (ConstAlias< ShapeA > a)
 
EuclideanShapesCSGoperator= (const EuclideanShapesCSG &other)
 
void setParams (ConstAlias< ShapeA > a)
 
void plus (ConstAlias< ShapeB > b)
 
void intersection (ConstAlias< ShapeB > b)
 
void minus (ConstAlias< ShapeB > b)
 
RealPoint getLowerBound () const
 
RealPoint getUpperBound () const
 
Orientation orientation (const RealPoint &p) const
 
void selfDisplay (std::ostream &out) const
 
bool isValid () const
 

Protected Types

enum  e_operator { e_plus, e_intersection, e_minus }
 

Private Attributes

CountedConstPtrOrConstPtr< ShapeA > myShapeA
 
std::vector< std::pair< e_operator, CountedConstPtrOrConstPtr< ShapeB > > > v_shapes
 
RealPoint myLowerBound
 
RealPoint myUpperBound
 
bool bIsValid
 

Detailed Description

template<typename ShapeA, typename ShapeB>
class DGtal::EuclideanShapesCSG< ShapeA, ShapeB >

Aim: Constructive Solid Geometry (CSG) between models of CEuclideanBoundedShape and CEuclideanOrientedShape Use CSG operation (union, intersection, minus) from a shape of Type ShapeA with one (or more) shapes of Type ShapeB. Can combine differents operations. Limitations: Since we don't have a class derived by all shapes, operations can be done by only one type of shapes. Use CSG of CSG to go beyond this limitation.

Description of template class 'EuclideanShapesCSG'

Template Parameters
ShapeAtype of a first shape. Must be a model of CEuclideanBoundedShape and CEuclideanOrientedShape
ShapeBtype of a second shape. Must be a model of CEuclideanBoundedShape and CEuclideanOrientedShape
Examples:
shapes/exampleEuclideanShapesDecorator.cpp.

Definition at line 67 of file EuclideanShapesDecorator.h.

Member Typedef Documentation

template<typename ShapeA , typename ShapeB >
typedef ShapeA::RealPoint DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::RealPoint

Definition at line 82 of file EuclideanShapesDecorator.h.

template<typename ShapeA , typename ShapeB >
typedef ShapeA::Space DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::Space

Definition at line 81 of file EuclideanShapesDecorator.h.

Member Enumeration Documentation

template<typename ShapeA , typename ShapeB >
enum DGtal::EuclideanShapesCSG::e_operator
protected

Constructor & Destructor Documentation

template<typename ShapeA , typename ShapeB >
DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::EuclideanShapesCSG ( )
inline

Default constructor. EuclideanShapesCSG will be not valid without setParams(ShapeA).

Definition at line 88 of file EuclideanShapesDecorator.h.

89  : bIsValid(false)
90  {}
bool bIsValid
if the CSG is valid.
template<typename ShapeA , typename ShapeB >
DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::EuclideanShapesCSG ( const EuclideanShapesCSG< ShapeA, ShapeB > &  other)
inline

Copy constructor.

Parameters
[in]othera EuclideanShapesCSG to copy

Definition at line 97 of file EuclideanShapesDecorator.h.

98  : myShapeA(other.myShapeA), v_shapes(other.v_shapes),
99  myLowerBound(other.myLowerBound), myUpperBound(other.myUpperBound),
100  bIsValid(other.bIsValid)
101  {}
RealPoint myLowerBound
Domain lower bound.
CountedConstPtrOrConstPtr< ShapeA > myShapeA
Base Shape.
RealPoint myUpperBound
Domain upper bound.
std::vector< std::pair< e_operator, CountedConstPtrOrConstPtr< ShapeB > > > v_shapes
Vector of all operations (ordered) of ShapeB.
bool bIsValid
if the CSG is valid.
template<typename ShapeA , typename ShapeB >
DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::EuclideanShapesCSG ( ConstAlias< ShapeA >  a)
inline

Constructor. EuclideanShapesCSG will be valid.

Parameters
[in]aa model of CEuclideanBoundedShape and CEuclideanOrientedShape

Definition at line 108 of file EuclideanShapesDecorator.h.

References DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::bIsValid, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myLowerBound, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myShapeA, and DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myUpperBound.

109  : myShapeA( a )
110  {
111  myLowerBound = myShapeA->getLowerBound();
112  myUpperBound = myShapeA->getUpperBound();
113 
114  bIsValid = true;
115  }
RealPoint myLowerBound
Domain lower bound.
CountedConstPtrOrConstPtr< ShapeA > myShapeA
Base Shape.
RealPoint myUpperBound
Domain upper bound.
bool bIsValid
if the CSG is valid.

Member Function Documentation

template<typename ShapeA , typename ShapeB >
DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::BOOST_CONCEPT_ASSERT ( (concepts::CEuclideanBoundedShape< ShapeA >)  )
template<typename ShapeA , typename ShapeB >
DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::BOOST_CONCEPT_ASSERT ( (concepts::CEuclideanOrientedShape< ShapeA >)  )
template<typename ShapeA , typename ShapeB >
RealPoint DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::getLowerBound ( ) const
inline
Returns
the lower bound of the shape bounding box.

Definition at line 222 of file EuclideanShapesDecorator.h.

References DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::isValid(), and DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myLowerBound.

223  {
224  FATAL_ERROR_MSG( isValid(), "Operation invalid. Maybe you don't set a ShapeA object." );
225 
226  return myLowerBound;
227  }
RealPoint myLowerBound
Domain lower bound.
template<typename ShapeA , typename ShapeB >
RealPoint DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::getUpperBound ( ) const
inline
Returns
the upper bound of the shape bounding box.

Definition at line 233 of file EuclideanShapesDecorator.h.

References DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::isValid(), and DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myUpperBound.

234  {
235  FATAL_ERROR_MSG( isValid(), "Operation invalid. Maybe you don't set a ShapeA object." );
236 
237  return myUpperBound;
238  }
RealPoint myUpperBound
Domain upper bound.
template<typename ShapeA , typename ShapeB >
void DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::intersection ( ConstAlias< ShapeB >  b)
inline

Intersection between a (ShapeA) and b (ShapeB). If an operation was already set, the intersection will be between the CSG shape and b (ShapeB).

Parameters
[in]ba ShapeB, model of CEuclideanBoundedShape and CEuclideanOrientedShape

Definition at line 182 of file EuclideanShapesDecorator.h.

References DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::BOOST_CONCEPT_ASSERT(), DGtal::SpaceND< dim, TInteger >::dimension, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::e_intersection, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::isValid(), DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myLowerBound, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myUpperBound, and DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::v_shapes.

183  {
184  BOOST_CONCEPT_ASSERT (( concepts::CEuclideanBoundedShape< ShapeB > ));
185  BOOST_CONCEPT_ASSERT (( concepts::CEuclideanOrientedShape< ShapeB > ));
186 
187  FATAL_ERROR_MSG( isValid(), "Operation invalid. Maybe you don't set a ShapeA object." );
188 
189  std::pair<e_operator, CountedConstPtrOrConstPtr< ShapeB > > shape( e_intersection, b );
190 
191  for(Dimension i=0; i < Space::dimension; ++i)
192  {
193  myLowerBound[i] = std::max(myLowerBound[i], b->getLowerBound()[i]);
194  myUpperBound[i] = std::min(myUpperBound[i], b->getUpperBound()[i]);
195  }
196 
197  v_shapes.push_back(shape);
198  }
RealPoint myLowerBound
Domain lower bound.
static const Dimension dimension
static constants to store the dimension.
Definition: SpaceND.h:132
DGtal::uint32_t Dimension
Definition: Common.h:120
RealPoint myUpperBound
Domain upper bound.
BOOST_CONCEPT_ASSERT((concepts::CEuclideanBoundedShape< ShapeA >))
std::vector< std::pair< e_operator, CountedConstPtrOrConstPtr< ShapeB > > > v_shapes
Vector of all operations (ordered) of ShapeB.
template<typename ShapeA , typename ShapeB >
bool DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::isValid ( ) const
inline
template<typename ShapeA , typename ShapeB >
void DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::minus ( ConstAlias< ShapeB >  b)
inline

Minus between a (ShapeA) and b (ShapeB). If an operation was already set, the minus will be between the CSG shape and b (ShapeB).

Parameters
[in]ba ShapeB, model of CEuclideanBoundedShape and CEuclideanOrientedShape

Definition at line 206 of file EuclideanShapesDecorator.h.

References DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::BOOST_CONCEPT_ASSERT(), DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::e_minus, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::isValid(), and DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::v_shapes.

207  {
208  BOOST_CONCEPT_ASSERT (( concepts::CEuclideanBoundedShape< ShapeB > ));
209  BOOST_CONCEPT_ASSERT (( concepts::CEuclideanOrientedShape< ShapeB > ));
210 
211  FATAL_ERROR_MSG( isValid(), "Operation invalid. Maybe you don't set a ShapeA object." );
212 
213  std::pair<e_operator, CountedConstPtrOrConstPtr< ShapeB > > shape( e_minus, b );
214 
215  v_shapes.push_back(shape);
216  }
BOOST_CONCEPT_ASSERT((concepts::CEuclideanBoundedShape< ShapeA >))
std::vector< std::pair< e_operator, CountedConstPtrOrConstPtr< ShapeB > > > v_shapes
Vector of all operations (ordered) of ShapeB.
template<typename ShapeA , typename ShapeB >
EuclideanShapesCSG& DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::operator= ( const EuclideanShapesCSG< ShapeA, ShapeB > &  other)
inline

Copy operator.

Parameters
[in]othera EuclideanShapesCSG to copy
Returns
this

Definition at line 124 of file EuclideanShapesDecorator.h.

References DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::bIsValid, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myLowerBound, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myShapeA, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myUpperBound, and DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::v_shapes.

125  {
126  myShapeA = other.myShapeA;
127  v_shapes = other.v_shapes;
128 
129  myLowerBound = other.myLowerBound;
130  myUpperBound = other.myUpperBound;
131 
132  bIsValid = other.bIsValid;
133 
134  return *this;
135  }
RealPoint myLowerBound
Domain lower bound.
CountedConstPtrOrConstPtr< ShapeA > myShapeA
Base Shape.
RealPoint myUpperBound
Domain upper bound.
std::vector< std::pair< e_operator, CountedConstPtrOrConstPtr< ShapeB > > > v_shapes
Vector of all operations (ordered) of ShapeB.
bool bIsValid
if the CSG is valid.
template<typename ShapeA , typename ShapeB >
Orientation DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::orientation ( const RealPoint p) const
inline

Return the orientation of a point with respect to a shape. Resolve all operations done with operators in the order they are set.

Parameters
[in]pinput point
Returns
the orientation of the point (0 = INSIDE, 1 = ON, 2 = OUTSIDE)

e_plus

Definition at line 248 of file EuclideanShapesDecorator.h.

References DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::e_intersection, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::e_minus, DGtal::INSIDE, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::isValid(), DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myShapeA, DGtal::ON, DGtal::OUTSIDE, and DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::v_shapes.

249  {
250  FATAL_ERROR_MSG( isValid(), "Operation invalid. Maybe you don't set a ShapeA object." );
251 
252  Orientation orient = myShapeA->orientation( p );
253 
254  for(unsigned int i = 0; i < v_shapes.size(); ++i)
255  {
256  if( v_shapes[i].first == e_minus )
257  {
258  if (( v_shapes[i].second->orientation( p ) == INSIDE ) || ( v_shapes[i].second->orientation( p ) == ON ))
259  {
260  orient = OUTSIDE;
261  }
262  }
263  else if( v_shapes[i].first == e_intersection )
264  {
265  if (( orient == ON ) && ( v_shapes[i].second->orientation( p ) != OUTSIDE ))
266  {
267  orient = ON;
268  }
269  else if (( v_shapes[i].second->orientation( p ) == ON ) && ( orient != OUTSIDE ))
270  {
271  orient = ON;
272  }
273  else if (( orient == INSIDE ) && ( v_shapes[i].second->orientation( p ) == INSIDE ))
274  {
275  orient = INSIDE;
276  }
277  else
278  {
279  orient = OUTSIDE;
280  }
281  }
282  else
283  {
284  if (( orient == INSIDE ) || ( v_shapes[i].second->orientation( p ) == INSIDE ))
285  {
286  orient = INSIDE;
287  }
288  else if (( orient == ON ) || ( v_shapes[i].second->orientation( p ) == ON ))
289  {
290  orient = ON;
291  }
292  else
293  {
294  orient = OUTSIDE;
295  }
296  }
297  }
298 
299  return orient;
300  }
CountedConstPtrOrConstPtr< ShapeA > myShapeA
Base Shape.
Orientation
Definition: Common.h:125
std::vector< std::pair< e_operator, CountedConstPtrOrConstPtr< ShapeB > > > v_shapes
Vector of all operations (ordered) of ShapeB.
template<typename ShapeA , typename ShapeB >
void DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::plus ( ConstAlias< ShapeB >  b)
inline

Union between a shape (ShapeA, gived at construction) and b (ShapeB). If an operation was already set, the union will be between the CSG shape and b (ShapeB).

Parameters
[in]ba ShapeB, model of CEuclideanBoundedShape and CEuclideanOrientedShape

Definition at line 158 of file EuclideanShapesDecorator.h.

References DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::BOOST_CONCEPT_ASSERT(), DGtal::SpaceND< dim, TInteger >::dimension, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::e_plus, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::isValid(), DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myLowerBound, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myUpperBound, and DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::v_shapes.

159  {
160  BOOST_CONCEPT_ASSERT (( concepts::CEuclideanBoundedShape< ShapeB > ));
161  BOOST_CONCEPT_ASSERT (( concepts::CEuclideanOrientedShape< ShapeB > ));
162 
163  FATAL_ERROR_MSG( isValid(), "Operation invalid. Maybe you don't set a ShapeA object." );
164 
165  std::pair<e_operator, CountedConstPtrOrConstPtr< ShapeB > > shape( e_plus, b );
166 
167  for(Dimension i =0; i < Space::dimension; ++i)
168  {
169  myLowerBound[i] = std::min(myLowerBound[i], b->getLowerBound()[i]);
170  myUpperBound[i] = std::max(myUpperBound[i], b->getUpperBound()[i]);
171  }
172 
173  v_shapes.push_back(shape);
174  }
RealPoint myLowerBound
Domain lower bound.
static const Dimension dimension
static constants to store the dimension.
Definition: SpaceND.h:132
DGtal::uint32_t Dimension
Definition: Common.h:120
RealPoint myUpperBound
Domain upper bound.
BOOST_CONCEPT_ASSERT((concepts::CEuclideanBoundedShape< ShapeA >))
std::vector< std::pair< e_operator, CountedConstPtrOrConstPtr< ShapeB > > > v_shapes
Vector of all operations (ordered) of ShapeB.
template<typename ShapeA , typename ShapeB >
void DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::selfDisplay ( std::ostream &  out) const

Writes/Displays the object on an output stream.

Parameters
outthe output stream where the object is written.
template<typename ShapeA , typename ShapeB >
void DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::setParams ( ConstAlias< ShapeA >  a)
inline

Add a (unique) ShapeA for the CSG computation. EuclideanShapesCSG will be valid after. If a ShapeA was already set, the previous one will be override.

Parameters
[in]aa ShapeA, model of CEuclideanBoundedShape and CEuclideanOrientedShape

Definition at line 142 of file EuclideanShapesDecorator.h.

References DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::bIsValid, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myLowerBound, DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myShapeA, and DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myUpperBound.

143  {
144  myShapeA = a;
145 
146  myLowerBound = myShapeA->getLowerBound();
147  myUpperBound = myShapeA->getUpperBound();
148 
149  bIsValid = true;
150  }
RealPoint myLowerBound
Domain lower bound.
CountedConstPtrOrConstPtr< ShapeA > myShapeA
Base Shape.
RealPoint myUpperBound
Domain upper bound.
bool bIsValid
if the CSG is valid.

Field Documentation

template<typename ShapeA , typename ShapeB >
bool DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::bIsValid
private
template<typename ShapeA , typename ShapeB >
RealPoint DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myLowerBound
private
template<typename ShapeA , typename ShapeB >
CountedConstPtrOrConstPtr< ShapeA > DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myShapeA
private
template<typename ShapeA , typename ShapeB >
RealPoint DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::myUpperBound
private
template<typename ShapeA , typename ShapeB >
std::vector< std::pair<e_operator, CountedConstPtrOrConstPtr< ShapeB > > > DGtal::EuclideanShapesCSG< ShapeA, ShapeB >::v_shapes
private

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