DGtal  1.2.0
testParDirCollapse.cpp
Go to the documentation of this file.
1 
31 #include <iostream>
32 #include "DGtal/base/Common.h"
33 #include "ConfigTest.h"
34 #include "DGtalCatch.h"
35 #include "DGtal/helpers/StdDefs.h"
36 // Cellular grid
37 #include "DGtal/topology/CubicalComplex.h"
38 #include "DGtal/topology/ParDirCollapse.h"
39 // Shape construction
40 #include "DGtal/shapes/GaussDigitizer.h"
41 #include "DGtal/shapes/Shapes.h"
42 #include "DGtal/shapes/EuclideanShapesDecorator.h"
43 #include "DGtal/shapes/parametric/Flower2D.h"
45 
46 using namespace std;
47 using namespace DGtal;
48 using namespace Z2i;
49 
51 // Functions for testing class ParDirCollapse.
53 
54 template <typename CC, typename KSpace>
55 void getComplex ( CC & complex, KSpace & K )
56 {
57  typedef Flower2D< Space > MyEuclideanShape;
58  MyEuclideanShape shape( RealPoint( 0.0, 0.0 ), 16, 5, 5, M_PI_2/2. );
59 
60  typedef GaussDigitizer< Space, MyEuclideanShape > MyGaussDigitizer;
61  MyGaussDigitizer digShape;
62  digShape.attach( shape );
63  digShape.init ( shape.getLowerBound(), shape.getUpperBound(), 1.0 );
64  Domain domainShape = digShape.getDomain();
65  DigitalSet aSet( domainShape );
66  Shapes<Domain>::digitalShaper( aSet, digShape );
67 
68  K.init ( domainShape.lowerBound(), domainShape.upperBound(), true );
69  complex.clear();
70  complex.construct ( aSet );
71 }
72 
73 TEST_CASE( "Testing ParDirCollapse" )
74 {
75  typedef map<Cell, CubicalCellData> Map;
77  KSpace K;
78  CC complex ( K );
79  ParDirCollapse < CC > thinning ( K );
80 
81  SECTION("Testing the basic algorithm of ParDirCollapse")
82  {
83  getComplex< CC, KSpace > ( complex, K );
84  int eulerBefore = complex.euler();
85  thinning.attach ( &complex );
86  REQUIRE( ( thinning.eval ( 2 ) != 0 ) );
87  REQUIRE( (eulerBefore == complex.euler()) );
88  }
89 
90  SECTION("Testing ParDirCollapse::collapseSurface")
91  {
92  getComplex< CC, KSpace > ( complex, K );
93  int eulerBefore = complex.euler();
94  thinning.attach ( &complex );
95  thinning.collapseSurface ();
96  REQUIRE( (eulerBefore == complex.euler()) );
97  }
98  SECTION("Testing ParDirCollapse::collapseIsthmus")
99  {
100  getComplex< CC, KSpace > ( complex, K );
101  int eulerBefore = complex.euler();
102  thinning.attach ( &complex );
103  thinning.collapseIsthmus ();
104  REQUIRE( (eulerBefore == complex.euler()) );
105  }
106 }
107 
Aim: This class represents an arbitrary cubical complex living in some Khalimsky space....
void construct(const TDigitalSet &set)
Integer euler() const
Aim: A wrapper class around a STL associative container for storing sets of digital points within som...
Aim: Model of the concept StarShaped represents any flower with k-petals in the plane.
Definition: Flower2D.h:65
void attach(ConstAlias< EuclideanShape > shape)
const Point & lowerBound() const
const Point & upperBound() const
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.
Aim: Implements thinning algorithms in cubical complexes. The implementation supports any model of cu...
void attach(Alias< CC > pComplex)
unsigned int eval(unsigned int iterations)
Aim: A utility class for constructing different shapes (balls, diamonds, and others).
DGtal is the top-level namespace which contains all DGtal functions and types.
Z2i::RealPoint RealPoint
KSpace K
std::unordered_map< Cell, CubicalCellData > Map
CubicalComplex< KSpace, Map > CC
void getComplex(CC &complex, KSpace &K)
TEST_CASE("Testing ParDirCollapse")
SECTION("Testing constant forward iterators")
REQUIRE(domain.isInside(aPoint))