32#if defined(BasicPointFunctors_RECURSES)
33#error Recursive header files inclusion detected in BasicPointFunctors.h
36#define BasicPointFunctors_RECURSES
38#if !defined BasicPointFunctors_h
40#define BasicPointFunctors_h
49#include "DGtal/base/Common.h"
50#include "DGtal/helpers/StdDefs.h"
51#include "DGtal/kernel/SpaceND.h"
52#include "DGtal/kernel/NumberTraits.h"
53#include "DGtal/base/BasicBoolFunctors.h"
54#include "DGtal/kernel/CPointPredicate.h"
55#include "DGtal/base/CQuantity.h"
56#include "DGtal/kernel/domains/CDomain.h"
57#include "DGtal/base/ConstAlias.h"
105 template <
typename S = SpaceND< 2, DGtal::Z2i::Integer > >
112 typedef typename Space::Point
Point;
125 template<
typename TIterator>
126 void init (
const TIterator& itb,
const TIterator& ite );
147 template<
typename TInputPo
int>
199 template <
typename TDomain3D,
typename TInteger = DGtal::Z3i::Integer >
221 double rotationAngle,
bool keepInside=
true):
225 myCenter[0] = aDomain3DImg.lowerBound()[0]+((aDomain3DImg.upperBound())[0]-(aDomain3DImg.lowerBound())[0])/2.0;
226 myCenter[1] = aDomain3DImg.lowerBound()[1]+((aDomain3DImg.upperBound())[1]-(aDomain3DImg.lowerBound())[1])/2.0;
227 myCenter[2] = aDomain3DImg.lowerBound()[2]+((aDomain3DImg.upperBound())[2]-(aDomain3DImg.lowerBound())[2])/2.0;
244 double rotationAngle,
const Point &defaultPoint,
bool keepInside=
true):
248 myCenter[0] = aDomain3DImg.lowerBound()[0]+((aDomain3DImg.upperBound())[0]-(aDomain3DImg.lowerBound())[0])/2.0;
249 myCenter[1] = aDomain3DImg.lowerBound()[1]+((aDomain3DImg.upperBound())[1]-(aDomain3DImg.lowerBound())[1])/2.0;
250 myCenter[2] = aDomain3DImg.lowerBound()[2]+((aDomain3DImg.upperBound())[2]-(aDomain3DImg.lowerBound())[2])/2.0;
267 const Dimension &dimRotated,
const Point &ptCenter,
double rotationAngle,
const Point &defaultPoint,
268 bool keepInside=
true):
287 const Dimension &dimRotated,
const Point &ptCenter,
double rotationAngle,
bool keepInside=
true):
300 template <
typename TPo
intDimMinus>
306 std::vector<Dimension> indexesRotate;
321 indexesRotate.push_back(i);
323 double d1 = pt[indexesRotate[0]] -
myCenter[indexesRotate[0]];
324 double d2 = pt[indexesRotate[1]] -
myCenter[indexesRotate[1]];
378 template <
typename TDomain3D,
typename TInteger = DGtal::Z3i::Integer >
398 const Point &anOriginPoint,
const Point &anUpperPointOnAxis1,
399 const Point &anUpperPointOnAxis2,
404 anUpperPointOnAxis1[1]-anOriginPoint[1],
405 anUpperPointOnAxis1[2]-anOriginPoint[2])),
407 anUpperPointOnAxis2[1]-anOriginPoint[1],
408 anUpperPointOnAxis2[2]-anOriginPoint[2]))
435 double d = -aNormalVector[0]*anOriginPoint[0] - aNormalVector[1]*anOriginPoint[1] - aNormalVector[2]*anOriginPoint[2];
437 if(aNormalVector[0]!=0){
438 pRefOrigin [0]= -d/aNormalVector[0];
441 if(pRefOrigin==anOriginPoint){
444 }
else if (aNormalVector[1]!=0){
446 pRefOrigin [1]= -d/aNormalVector[1];
448 if(pRefOrigin==anOriginPoint){
451 }
else if (aNormalVector[2]!=0){
454 pRefOrigin [2]= -d/aNormalVector[2];
455 if(pRefOrigin==anOriginPoint){
460 uDir1=(pRefOrigin-anOriginPoint)/((pRefOrigin-anOriginPoint).norm());
462 uDir2[0] = uDir1[1]*aNormalVector[2]-uDir1[2]*aNormalVector[1];
463 uDir2[1] = uDir1[2]*aNormalVector[0]-uDir1[0]*aNormalVector[2];
464 uDir2[2] = uDir1[0]*aNormalVector[1]-uDir1[1]*aNormalVector[0];
496 uDir1 = orientXaxisVector/orientXaxisVector.
norm();
498 uDir2[0] = uDir1[1]*aNormalVector[2]-uDir1[2]*aNormalVector[1];
499 uDir2[1] = uDir1[2]*aNormalVector[0]-uDir1[0]*aNormalVector[2];
500 uDir2[2] = uDir1[0]*aNormalVector[1]-uDir1[1]*aNormalVector[0];
515 template <
typename TPo
int2D>
528 if(
myDomain.isInside(pt)|| !checkInsideDomain)
535 trace.
warning() <<
"Warning pt outside the 3D domain " << pt << std::endl;
576 template<
typename TPo
intPredicate,
typename TDomain,
typename TValue=
typename TDomain::Integer >
596 const Value aTrueValue,
const Value aFalseValue );
643 template <
typename TDomain,
typename TInteger = DGtal::
int32_t,
typename TValue =
typename TDomain::Size >
647 typedef typename TDomain::Space
Space;
648 typedef typename TDomain::Size
Size;
651 typedef typename Space::Point
Point;
669 Point domainUpperBound=aSourceDomain.upperBound();
670 Point domainLowerBound=aSourceDomain.lowerBound();
703 Point ptRes = Point::diagonal(0);
705 trace.
error() <<
" The point is not in the source domain: "<<
aPoint << std::endl;
764 template <
typename TDomain>
768 typedef typename TDomain::Space
Space;
769 typedef typename TDomain::Size
Size;
771 typedef typename Space::Point
Point;
818 template <
typename TRealVector,
typename TVector>
826 for (
unsigned int i = 0; i < TVector::dimension; i++ )
827 out[i] = std::round ( point[i] );
838#include "DGtal/kernel/BasicPointFunctors.ih"
843#undef BasicPointFunctors_RECURSES
Aim: This class encapsulates its parameter class so that to indicate to the user that the object/poin...
double norm(const NormType type=L_2) const
Integer Component
Type for Vector elements.
TInteger Integer
Arithmetic ring induced by (+,-,*) and Integer numbers.
DGtal::Dimension Dimension
Copy of the type used for the dimension.
Aim: Functor that subsamples an initial domain by given a grid size and a shift vector....
Space::Dimension Dimension
Point operator()(const Point &aPoint) const
TDomain myGridSampleDomain
TDomain::Integer IntergerDom
const TDomain & getSubSampledDomain()
std::vector< TValue > myGridSize
BasicDomainSubSampler(const TDomain &aSourceDomain, const std::vector< TValue > &aGridSize, const Point &aGridShift)
Aim: Functor that flips the domain coordinate system from some selected axis. For instance,...
Point operator()(const Point &aPoint) const
FlipDomainAxis(const TDomain &aSourceDomain, const std::vector< Dimension > &axisFlipped)
Space::Dimension Dimension
std::vector< Dimension > myAxisFlipped
Aim: Functor that embeds a 2D point into a 3D space from two axis vectors and an origin point given i...
Space::RealPoint myOriginPointEmbeddedIn3D
Space::RealPoint myFirstAxisEmbeddedDirection
void shiftOriginPoint(const typename Space::RealPoint &shift)
Point2DEmbedderIn3D(const TDomain3D &aDomain3DImg, const Point &anOriginPoint, const Point &anUpperPointOnAxis1, const Point &anUpperPointOnAxis2, const Point &aDefautPoint=Point(0, 0, 0))
Point2DEmbedderIn3D(const TDomain3D &aDomain3DImg, const Point &anOriginPoint, const typename Space::RealPoint &aNormalVector, const typename Point::Component &aWidth, const Point &aDefautPoint=Point(0, 0, 0))
Space::RealPoint mySecondAxisEmbeddedDirection
SpaceND< 3, TInteger > Space
Point2DEmbedderIn3D(const TDomain3D &aDomain3DImg, const Point &anOriginPoint, const typename Space::RealPoint &aNormalVector, const typename Space::RealPoint &orientXaxisVector, const typename Point::Component &aWidth, const Point &aDefautPoint=Point(0, 0, 0))
Point operator()(const TPoint2D &aPoint, bool checkInsideDomain=true) const
Special Point Functor that adds one dimension to a 2D point and apply on it a rotation of angle alpha...
Space::Dimension Dimension
PointVector< 3, double > myCenter
Point operator()(const TPointDimMinus &aPoint) const
SpaceND< 3, TInteger > Space
SliceRotator2D(const Dimension &dimAdded, const TDomain3D &aDomain3DImg, const Integer &sliceIndex, const Dimension &dimRotated, const Point &ptCenter, double rotationAngle, bool keepInside=true)
SliceRotator2D(const Dimension &dimAdded, const TDomain3D &aDomain3DImg, const Integer &sliceIndex, const Dimension &dimRotated, double rotationAngle, const Point &defaultPoint, bool keepInside=true)
SliceRotator2D(const Dimension &dimAdded, const TDomain3D &aDomain3DImg, const Integer &sliceIndex, const Dimension &dimRotated, const Point &ptCenter, double rotationAngle, const Point &defaultPoint, bool keepInside=true)
SliceRotator2D(const Dimension &dimAdded, const TDomain3D &aDomain3DImg, const Integer &sliceIndex, const Dimension &dimRotated, double rotationAngle, bool keepInside=true)
DGtal is the top-level namespace which contains all DGtal functions and types.
DGtal::uint32_t Dimension
Aim: The traits class for all models of Cinteger.
Aim: This concept represents a digital domain, i.e. a non mutable subset of points of the given digit...
Aim: Defines a predicate on a point.
Aim: defines the concept of quantity in DGtal.
Create a point functor from a point predicate and a domain.
BOOST_CONCEPT_ASSERT((concepts::CDomain< Domain >))
Value operator()(const Point &aPoint) const
operator ()
TPointPredicate PointPredicate
BOOST_CONCEPT_ASSERT((concepts::CQuantity< Value >))
PointFunctorFromPointPredicateAndDomain(ConstAlias< PointPredicate > aPtrPredicate, ConstAlias< Domain > aDomain, const Value aTrueValue, const Value aFalseValue)
Constructor.
PointFunctorFromPointPredicateAndDomain(const PointFunctorFromPointPredicateAndDomain &other)
BOOST_CONCEPT_ASSERT((concepts::CPointPredicate< PointPredicate >))
const PointPredicate * myPtrPredicate
PointFunctorFromPointPredicateAndDomain & operator=(const PointFunctorFromPointPredicateAndDomain &other)
Aim: Functor that maps a point P of dimension i to a point Q of dimension j. The member myDims is an ...
void initAddOneDim(const Dimension &newDim)
void init(const TIterator &itb, const TIterator &ite)
Space::Dimension Dimension
void initRemoveOneDim(const Dimension &dimRemoved)
Projector(const Integer &aDefaultInteger=NumberTraits< Integer >::zero())
Point operator()(const TInputPoint &aPoint) const
BOOST_STATIC_CONSTANT(Dimension, dimension=Space::dimension)
std::array< Dimension, dimension > myDims
TVector operator()(const TRealVector &point) const
BOOST_STATIC_ASSERT((TRealVector::dimension==TVector::dimension))