DGtal  1.3.beta
testHeatLaplace.cpp
Go to the documentation of this file.
1 
29 #include "DGtal/helpers/StdDefs.h"
30 
31 #include "DGtal/math/linalg/EigenSupport.h"
32 
33 #include "DGtal/dec/DiscreteExteriorCalculus.h"
34 #include "DGtal/dec/DiscreteExteriorCalculusFactory.h"
35 
36 #include "DGtal/shapes/parametric/Ball3D.h"
37 #include "DGtal/shapes/GaussDigitizer.h"
38 
39 #include "DGtal/topology/DigitalSurface.h"
40 #include "DGtal/topology/ImplicitDigitalSurface.h"
41 
42 #include "DGtal/geometry/surfaces/estimation/LocalEstimatorFromSurfelFunctorAdapter.h"
43 #include "DGtal/geometry/surfaces/estimation/IIGeometricFunctors.h"
44 #include "DGtal/geometry/surfaces/estimation/IntegralInvariantCovarianceEstimator.h"
45 
46 #include "DGtalCatch.h"
47 
48 using namespace DGtal;
49 
52 
53 bool test_operator( const DenseMatrix& M )
54 {
55  bool test = true;
56 
57  for( int i = 0; i < M.rows(); i++ )
58  {
59  for( int j = 0; j < M.cols(); j++ )
60  {
61  if( i == j && M(i, j) > 0 ) test = false;
62  if( i != j && M(i, j) < 0 ) test = false;
63  }
64 
65  if( M.row(i).sum() >= 1e-10 ) test = false;
66  }
67 
68  return test;
69 }
70 
71 bool laplace_sphere( const double& h )
72 {
73  typedef Z3i::Space Space;
74  typedef Z3i::KSpace KSpace;
75  typedef Z3i::Domain Domain;
76  typedef Z3i::Point Point;
77  typedef Z3i::Vector Vector;
78  typedef Ball3D<Space> Ball;
80  typedef ImplicitDigitalSurface<KSpace, GaussDigitizer> MyImplicitDigitalSurface;
82 
83  Ball ball( Point(0, 0, 0), 1.0 );
84 
85  GaussDigitizer digitizer;
86  digitizer.attach( ball );
87  digitizer.init( ball.getLowerBound() + Vector(-1, -1, -1), ball.getUpperBound() + Vector(1, 1, 1), h );
88 
89  Domain domain = digitizer.getDomain();
90 
91  KSpace kspace;
92  kspace.init( domain.lowerBound(), domain.upperBound(), true );
93 
95  KSpace::Surfel bel = Surfaces<KSpace>::findABel( kspace, digitizer, 10000 );
96  MyImplicitDigitalSurface ImpSurf( kspace, digitizer, SAdj, bel );
97  MyDigitalSurface digSurf( ImpSurf );
98 
99  typedef functors::IINormalDirectionFunctor<Space> MyIINormalFunctor;
101 
102  MyIINormalFunctor normalFunctor;
103  normalFunctor.init( h, 3.5 * pow( h, 1. / 3. ) );
104 
105  MyIINormalEstimator normalEstimator( normalFunctor );
106  normalEstimator.attach( kspace, digitizer );
107  normalEstimator.setParams( 3.5 * pow( h, 1. / 3. ) / h );
108  normalEstimator.init( h, digSurf.begin(), digSurf.end() );
109 
112 
113  const Calculus calculus = CalculusFactory::createFromNSCells<2>( digSurf.begin(), digSurf.end(), normalEstimator, h );
114 
115  const double t = 0.1 * pow( h, 2./3. );
116  const double cut_locus = 3.0;
117  const Calculus::PrimalIdentity0 laplace_primal = calculus.heatLaplace<PRIMAL>( h, t, cut_locus );
118  const Calculus::DualIdentity0 laplace_dual = calculus.heatLaplace<DUAL>( h, t, cut_locus );
119 
120  return test_operator( laplace_primal.myContainer ) && test_operator( laplace_dual.myContainer );
121 }
122 
123 TEST_CASE( "Operator Test" )
124 {
125  SECTION( "Test" )
126  {
127  REQUIRE( laplace_sphere( 1.0 ) );
128  REQUIRE( laplace_sphere( 0.5 ) );
129  REQUIRE( laplace_sphere( 0.2 ) );
130  }
131 }
test_operator
bool test_operator(const DenseMatrix &M)
Definition: testHeatLaplace.cpp:53
Ball
Ball2D< Space > Ball
Definition: testShapeMoveCenter.cpp:58
DGtal::GaussDigitizer
Aim: A class for computing the Gauss digitization of some Euclidean shape, i.e. its intersection with...
Definition: GaussDigitizer.h:79
DGtal::GaussDigitizer::getDomain
Domain getDomain() const
DGtal::DiscreteExteriorCalculus
Aim: DiscreteExteriorCalculus represents a calculus in the dec package. This is the main structure in...
Definition: DiscreteExteriorCalculus.h:97
DGtal::HyperRectDomain< Space >
DGtal::DigitalSurface
Aim: Represents a set of n-1-cells in a nD space, together with adjacency relation between these cell...
Definition: DigitalSurface.h:139
DGtal::SurfelAdjacency< KSpace::dimension >
DGtal::HyperRectDomain::upperBound
const Point & upperBound() const
DGtal::KhalimskySpaceND::init
bool init(const Point &lower, const Point &upper, bool isClosed)
Specifies the upper and lower bounds for the maximal cells in this space.
DGtal::ImplicitDigitalSurface
Aim: A model of CDigitalSurfaceContainer which defines the digital surface as the boundary of an impl...
Definition: ImplicitDigitalSurface.h:71
DGtal::GaussDigitizer::attach
void attach(ConstAlias< EuclideanShape > shape)
DGtal::IntegralInvariantCovarianceEstimator
Aim: This class implement an Integral Invariant estimator which computes for each surfel the covarian...
Definition: IntegralInvariantCovarianceEstimator.h:115
DGtal::functors::IINormalDirectionFunctor
Aim: A functor Matrix -> RealVector that returns the normal direction by diagonalizing the given cova...
Definition: IIGeometricFunctors.h:67
REQUIRE
REQUIRE(domain.isInside(aPoint))
DGtal::EigenLinearAlgebraBackend::DenseMatrix
Eigen::MatrixXd DenseMatrix
Definition: EigenSupport.h:100
DGtal::SignedKhalimskyCell
Represents a signed cell in a cellular grid space by its Khalimsky coordinates and a boolean value.
Definition: KhalimskySpaceND.h:208
SparseMatrix
EigenLinearAlgebraBackend::SparseMatrix SparseMatrix
Definition: testHeatLaplace.cpp:50
DGtal::Ball2D
Aim: Model of the concept StarShaped represents any circle in the plane.
Definition: Ball2D.h:60
DGtal::SpaceND
Definition: SpaceND.h:95
DGtal::PRIMAL
@ PRIMAL
Definition: Duality.h:61
DGtal::GaussDigitizer::init
void init(const RealPoint &xLow, const RealPoint &xUp, typename RealVector::Component gridStep)
KSpace
Z3i::KSpace KSpace
Definition: testArithmeticalDSSComputerOnSurfels.cpp:48
DGtal::Ball2D::getLowerBound
RealPoint getLowerBound() const
Definition: Ball2D.h:116
DGtal::DigitalSurface::begin
ConstIterator begin() const
DGtal::Surfaces::findABel
static SCell findABel(const KSpace &K, const PointPredicate &pp, unsigned int nbtries=1000)
DGtal
DGtal is the top-level namespace which contains all DGtal functions and types.
Domain
HyperRectDomain< Space > Domain
Definition: testSimpleRandomAccessRangeFromPoint.cpp:44
DGtal::DiscreteExteriorCalculusFactory
Aim: This class provides static members to create DEC structures from various other DGtal structures.
Definition: DiscreteExteriorCalculus.h:70
DGtal::Ball2D::getUpperBound
RealPoint getUpperBound() const
Definition: Ball2D.h:125
laplace_sphere
bool laplace_sphere(const double &h)
Definition: testHeatLaplace.cpp:71
TEST_CASE
TEST_CASE("Operator Test")
Definition: testHeatLaplace.cpp:123
DenseMatrix
EigenLinearAlgebraBackend::DenseMatrix DenseMatrix
Definition: testHeatLaplace.cpp:51
Vector
FreemanChain< int >::Vector Vector
Definition: testCombinDSS.cpp:60
DGtal::DigitalSurface::end
ConstIterator end() const
test
bool test(const I &itb, const I &ite)
Definition: testMostCenteredMSEstimator.cpp:71
domain
Domain domain
Definition: testProjection.cpp:88
DGtal::PointVector< dim, Integer >
SECTION
SECTION("Testing constant forward iterators")
Definition: testSimpleRandomAccessRangeFromPoint.cpp:66
DGtal::DUAL
@ DUAL
Definition: Duality.h:62
Space
SpaceND< 2 > Space
Definition: testSimpleRandomAccessRangeFromPoint.cpp:42
DGtal::EigenLinearAlgebraBackend::SparseMatrix
Eigen::SparseMatrix< DenseVector::Scalar, Eigen::ColMajor, DenseVector::Index > SparseMatrix
Definition: EigenSupport.h:104
Point
MyPointD Point
Definition: testClone2.cpp:383
DGtal::Ball3D
Aim: Model of the concept StarShaped3D represents any Sphere in the space.
Definition: Ball3D.h:60
DGtal::IntegralInvariantCovarianceEstimator::init
void init(const double _h, SurfelConstIterator itb, SurfelConstIterator ite)
DGtal::HyperRectDomain::lowerBound
const Point & lowerBound() const
MyDigitalSurface
DigitalSurface< MyDigitalSurfaceContainer > MyDigitalSurface
Definition: greedy-plane-segmentation-ex2.cpp:92
DGtal::KhalimskySpaceND
Aim: This class is a model of CCellularGridSpaceND. It represents the cubical grid as a cell complex,...
Definition: KhalimskySpaceND.h:64