DGtal 1.4.0
Loading...
Searching...
No Matches
testHeatLaplace.cpp File Reference
#include "DGtal/helpers/StdDefs.h"
#include "DGtal/math/linalg/EigenSupport.h"
#include "DGtal/dec/DiscreteExteriorCalculus.h"
#include "DGtal/dec/DiscreteExteriorCalculusFactory.h"
#include "DGtal/shapes/parametric/Ball3D.h"
#include "DGtal/shapes/GaussDigitizer.h"
#include "DGtal/topology/DigitalSurface.h"
#include "DGtal/topology/ImplicitDigitalSurface.h"
#include "DGtal/geometry/surfaces/estimation/LocalEstimatorFromSurfelFunctorAdapter.h"
#include "DGtal/geometry/surfaces/estimation/IIGeometricFunctors.h"
#include "DGtal/geometry/surfaces/estimation/IntegralInvariantCovarianceEstimator.h"
#include "DGtalCatch.h"
Include dependency graph for testHeatLaplace.cpp:

Go to the source code of this file.

Typedefs

typedef EigenLinearAlgebraBackend::SparseMatrix SparseMatrix
 
typedef EigenLinearAlgebraBackend::DenseMatrix DenseMatrix
 

Functions

bool test_operator (const DenseMatrix &M)
 
bool laplace_sphere (const double &h)
 
 TEST_CASE ("Operator Test")
 

Detailed Description

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Author
Thomas Caissard (thoma.nosp@m.s.ca.nosp@m.issar.nosp@m.d@li.nosp@m.ris.c.nosp@m.nrs..nosp@m.fr )
Date
2018/02/02

Tests of the heat Laplace operator from DEC

This file is part of the DGtal library.

Definition in file testHeatLaplace.cpp.

Typedef Documentation

◆ DenseMatrix

◆ SparseMatrix

Function Documentation

◆ laplace_sphere()

bool laplace_sphere ( const double & h)

Definition at line 71 of file testHeatLaplace.cpp.

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}
Aim: Model of the concept StarShaped3D represents any Sphere in the space.
Definition Ball3D.h:61
Aim: Represents a set of n-1-cells in a nD space, together with adjacency relation between these cell...
Aim: This class provides static members to create DEC structures from various other DGtal structures.
Aim: DiscreteExteriorCalculus represents a calculus in the dec package. This is the main structure in...
Aim: A class for computing the Gauss digitization of some Euclidean shape, i.e. its intersection with...
void attach(ConstAlias< EuclideanShape > shape)
void init(const RealPoint &xLow, const RealPoint &xUp, typename RealVector::Component gridStep)
Domain getDomain() const
const Point & lowerBound() const
const Point & upperBound() const
Aim: A model of CDigitalSurfaceContainer which defines the digital surface as the boundary of an impl...
Aim: This class implement an Integral Invariant estimator which computes for each surfel the covarian...
void init(const double _h, SurfelConstIterator itb, SurfelConstIterator ite)
Aim: This class is a model of CCellularGridSpaceND. It represents the cubical grid as a cell complex,...
bool init(const Point &lower, const Point &upper, bool isClosed)
Specifies the upper and lower bounds for the maximal cells in this space.
static SCell findABel(const KSpace &K, const PointPredicate &pp, unsigned int nbtries=1000)
Aim: Represent adjacencies between surfel elements, telling if it follows an interior to exterior ord...
Aim: A functor Matrix -> RealVector that returns the normal direction by diagonalizing the given cova...
PolyCalculus * calculus
DigitalPlane::Point Vector
DigitalSurface< MyDigitalSurfaceContainer > MyDigitalSurface
@ PRIMAL
Definition Duality.h:61
@ DUAL
Definition Duality.h:62
Represents a signed cell in a cellular grid space by its Khalimsky coordinates and a boolean value.
MyPointD Point
bool test_operator(const DenseMatrix &M)
Domain domain
HyperRectDomain< Space > Domain

References DGtal::GaussDigitizer< TSpace, TEuclideanShape >::attach(), DGtal::DigitalSurface< TDigitalSurfaceContainer >::begin(), calculus, domain, DGtal::DUAL, DGtal::DigitalSurface< TDigitalSurfaceContainer >::end(), DGtal::Surfaces< TKSpace >::findABel(), DGtal::GaussDigitizer< TSpace, TEuclideanShape >::getDomain(), DGtal::GaussDigitizer< TSpace, TEuclideanShape >::init(), DGtal::IntegralInvariantCovarianceEstimator< TKSpace, TPointPredicate, TCovarianceMatrixFunctor >::init(), DGtal::KhalimskySpaceND< dim, TInteger >::init(), DGtal::HyperRectDomain< TSpace >::lowerBound(), DGtal::PRIMAL, test_operator(), and DGtal::HyperRectDomain< TSpace >::upperBound().

Referenced by TEST_CASE().

◆ TEST_CASE()

TEST_CASE ( "Operator Test" )

Definition at line 123 of file testHeatLaplace.cpp.

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}
bool laplace_sphere(const double &h)
SECTION("Testing constant forward iterators")
REQUIRE(domain.isInside(aPoint))

References laplace_sphere(), REQUIRE(), and SECTION().

◆ test_operator()

bool test_operator ( const DenseMatrix & M)

Definition at line 53 of file testHeatLaplace.cpp.

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}
bool test(const I &itb, const I &ite)

References test().

Referenced by laplace_sphere().