DGtal  1.4.beta
testBasicPointFunctors.cpp File Reference
#include <cstdio>
#include <cmath>
#include <iostream>
#include <fstream>
#include <vector>
#include "DGtal/base/Common.h"
#include "DGtal/base/CUnaryFunctor.h"
#include "DGtal/kernel/PointVector.h"
#include "DGtal/kernel/SpaceND.h"
#include "DGtal/kernel/BasicPointFunctors.h"
#include "DGtal/kernel/domains/HyperRectDomain.h"
Include dependency graph for testBasicPointFunctors.cpp:

Go to the source code of this file.

Functions

template<typename TFunctor , typename TArg , typename TRes >
void checkingConcepts ()
 
bool testProjector ()
 
int main (int argc, char **argv)
 

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
Bertrand Kerautret (kerau.nosp@m.tre@.nosp@m.loria.nosp@m..fr ) LORIA (CNRS, UMR 7503), University of Nancy, France
Tristan Roussillon (trist.nosp@m.an.r.nosp@m.oussi.nosp@m.llon.nosp@m.@liri.nosp@m.s.cn.nosp@m.rs.fr ) Laboratoire d'InfoRmatique en Image et Systèmes d'information - LIRIS (CNRS, UMR 5205), CNRS, France
Date
2012/02/02

This file is part of the DGtal library

Definition in file testBasicPointFunctors.cpp.

Function Documentation

◆ checkingConcepts()

template<typename TFunctor , typename TArg , typename TRes >
void checkingConcepts ( )

Definition at line 47 of file testBasicPointFunctors.cpp.

48 {
49  BOOST_CONCEPT_ASSERT(( concepts::CUnaryFunctor<TFunctor, TArg, TRes > ));
50 }
Aim: Defines a unary functor, which associates arguments to results.
Definition: CUnaryFunctor.h:90

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 288 of file testBasicPointFunctors.cpp.

289 {
290  trace.beginBlock ( "Testing basic point functors" );
291  trace.info() << "Args:";
292  for ( int i = 0; i < argc; ++i )
293  trace.info() << " " << argv[ i ];
294  trace.info() << endl;
295 
296 
297  checkingConcepts<functors::Projector<SpaceND<2,int> >, PointVector<6,int>, PointVector<2,int> >();
298  //for instance, this does not compile because
299  //the point of dim 6 is projected on a point of dim 2 (and not 3)
300  //checkingConcepts<Projector<SpaceND<2,int> >, PointVector<6,int>, PointVector<3,int> >();
301 
302  bool res = testProjector();
303 
304  trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
305  trace.endBlock();
306  return res ? 0 : 1;
307 }
Aim: Implements basic operations that will be used in Point and Vector classes.
Definition: PointVector.h:593
void beginBlock(const std::string &keyword="")
std::ostream & emphase()
std::ostream & info()
double endBlock()
Trace trace
Definition: Common.h:153
bool testProjector()

References DGtal::Trace::beginBlock(), DGtal::Trace::emphase(), DGtal::Trace::endBlock(), DGtal::Trace::info(), testProjector(), and DGtal::trace.

◆ testProjector()

bool testProjector ( )

Definition at line 52 of file testBasicPointFunctors.cpp.

53 {
54  unsigned int nbok = 0;
55  unsigned int nb = 0;
56 
57  trace.beginBlock ( "Checking projection on a subspace" );
58  {
59  //a 3d point
60  PointVector<3,int> p(0,1,2);
61 
62  //projectors
63  typedef DGtal::functors::Projector<SpaceND<2,int> > Projector2D;
64  std::vector<Dimension> v1, v2;
65  v1.push_back(0); v1.push_back(2);
66  v2.push_back(2); v2.push_back(1);
67  Projector2D proj1, proj2, proj3;
68  proj1.init(v1.begin(), v1.end());
69  proj2.init(v2.begin(), v2.end());
70 
71  //comparison
72  PointVector<2,int> res1(0,2);
73  trace.info() << "p " << p << " => " << proj1(p) << " == " << res1 << std::endl;
74  nbok += ( proj1(p) == res1 ) ? 1 : 0;
75  nb++;
76 
77  PointVector<2,int> res2(2,1);
78  trace.info() << "p " << p << " => " << proj2(p) << " == " << res2 << std::endl;
79  nbok += ( proj2(p) == res2 ) ? 1 : 0;
80  nb++;
81 
82  PointVector<2,int> res3(0,1);
83  trace.info() << "p " << p << " => " << proj3(p) << " == " << res3 << std::endl;
84  nbok += ( proj3(p) == res3 ) ? 1 : 0;
85  nb++;
86  }
87  trace.endBlock();
88 
89  trace.beginBlock ( "Checking projection on a greater space" );
90  {
91  //a 2d point
92  PointVector<2,int> p(5,2);
93 
94  //projectors
95  typedef DGtal::functors::Projector<SpaceND<3,int> > Projector3D;
96  std::vector<Dimension> v1, v2, v4;
97  v1.push_back(0); v1.push_back(2); v1.push_back(1);
98  v2.push_back(1); v2.push_back(0);
99  v4.push_back(1);
100  Projector3D proj1, proj2, proj3;
101  proj1.init(v1.begin(), v1.end());
102  proj2.init(v2.begin(), v2.end());
103  Projector3D proj4(-1);
104  proj4.init(v4.begin(), v4.end());
105 
106  //SliceRotator2D
107  PointVector<3, int> pt1(0,0, 0);
108  PointVector<3, int> pt2(10,10, 10);
109 
113  PointVector<2, int> pt(5,5);
114  PointVector<2, int> pt_2(10, 9);
115  PointVector<3, int> ptR(4,5,6);
116  PointVector<3, int> ptR2(0, 1, 7);
117 
118  trace.info() << "pt " << pt << " => " << sliceRot(pt) << " == " << ptR << std::endl;
119  nbok += ( sliceRot(pt) == ptR ) ? 1 : 0;
120  nb++;
121 
122  trace.info() << "pt " << pt_2 << " => " << sliceRot2(pt_2) << " == " << ptR2 << std::endl;
123  nbok += ( sliceRot2(pt_2) == ptR2 ) ? 1 : 0;
124  nb++;
125 
126  //Point2DEmbedderIn3D
127  PointVector<3,int> ptOrigin3D(3,3,3);
129  ptOrigin3D,
130  PointVector<3,int>(6,6,3),
131  PointVector<3,int>(3,3,5),
132  PointVector<3,int>(0,0,0));
133  PointVector<2, int> ptb(0, 0);
134  PointVector<2, int> pt_2b(4, 2);
135  trace.info() << "pt " << ptb << " => " << embedder(ptb) << " == " << PointVector<3,int>(3,3,3) << std::endl;
136  nbok += ( embedder(ptb) == PointVector<3,int>(3,3,3) ) ? 1 : 0;
137  nb++;
138 
139  trace.info() << "pt " << pt_2b << " => " << embedder(pt_2b) << " == " << PointVector<3,int>(5,5,5) << std::endl;
140  nbok += ( embedder(pt_2b) == PointVector<3,int>(5,5,5) ) ? 1 : 0;
141  nb++;
142 
143  //Point2DEmbedderIn3D (constructor from normal point)
144  PointVector<3,int> pt2Origin3D(5,5,3);
146  pt2Origin3D,
147  PointVector<3,int>(0,0,3),
148  4);
149  PointVector<2, int> pt2b(0, 0);
150  PointVector<2, int> pt2_2b(2, 2);
151  trace.info() << "pt " << pt2b << " => " << embedder2(pt2b) << " == " << PointVector<3,int>(3,5,3) << std::endl;
152  nbok += ( embedder2(pt2b) == PointVector<3,int>(3,5,3) ) ? 1 : 0;
153  nb++;
154 
155  trace.info() << "pt " << pt2_2b << " => " << embedder2(pt2_2b) << " == " << PointVector<3,int>(5,4,3) << std::endl;
156  nbok += ( embedder2(pt2_2b) == PointVector<3,int>(5,4,3) ) ? 1 : 0;
157  nb++;
158 
159  //Point2DEmbedderIn3D (constructor from normal point)
160  PointVector<3,int> dirXaxis(1,0,0);
162  int> embedder3(domain,
163  pt2Origin3D,
164  PointVector<3,int>(0,0,3),
165  dirXaxis, 4);
166  PointVector<2, int> pt2c(0, 0);
167  PointVector<2, int> pt2_2c(2, 0);
168  trace.info() << "pt " << pt2c << " => " << embedder3(pt2c) << " == " << PointVector<3,int>(3,7,3) << std::endl;
169  nbok += ( embedder3(pt2c) == PointVector<3,int>(3,7,3) ) ? 1 : 0;
170  nb++;
171 
172  trace.info() << "pt " << pt2_2c << " => " << embedder3(pt2_2c) << " == " << PointVector<3,int>(5,7,3) << std::endl;
173  nbok += ( embedder3(pt2_2c) == PointVector<3,int>(5,7,3) ) ? 1 : 0;
174  nb++;
175 
176  // testing shift functor
177  embedder3.shiftOriginPoint(Z3i::RealPoint(2, 0.4, 0.0));
178  trace.info() << "pt " << pt2_2c << " => " << embedder3(pt2_2c) << " == " << PointVector<3,int>(7,7,3) << std::endl;
179  nbok += ( embedder3(pt2_2c) == PointVector<3,int>(7,7,3) ) ? 1 : 0;
180  nb++;
181 
182  //comparison
183  PointVector<3,int> res1(5,0,2);
184  trace.info() << "p " << p << " => " << proj1(p) << " == " << res1 << std::endl;
185  nbok += ( proj1(p) == res1 ) ? 1 : 0;
186  nb++;
187 
188  PointVector<3,int> res2(2,5,0);
189  trace.info() << "p " << p << " => " << proj2(p) << " == " << res2 << std::endl;
190  nbok += ( proj2(p) == res2 ) ? 1 : 0;
191  nb++;
192 
193  PointVector<3,int> res3(5,2,0);
194  trace.info() << "p " << p << " => " << proj3(p) << " == " << res3 << std::endl;
195  nbok += ( proj3(p) == res3 ) ? 1 : 0;
196  nb++;
197 
198  PointVector<3,int> res4(2,-1,-1);
199  trace.info() << "p " << p << " => " << proj4(p) << " == " << res4
200  << "(-1 as default value)" << std::endl;
201  nbok += ( proj4(p) == res4 ) ? 1 : 0;
202  nb++;
203  }
204  trace.endBlock();
205 
206 
207  trace.beginBlock ( "Checking Basic Domain SubSampler" );
208  {
209  // BasicDomainSubSampler 2D
212  aGridSize.push_back(5);
213  aGridSize.push_back(5);
214  PointVector<2,int> shiftVector(0 ,0);
216  aGridSize,
217  shiftVector);
218  trace.info()<< "Subsampling functor on 2D domain " << domainSource <<" with grid size "
219  << aGridSize[0] << " " << aGridSize[1] << " and shift vector "<< shiftVector <<std::endl ;
220  PointVector<2,int> pointTest(1,0);
221  PointVector<2,int> pointInSourceDomain = subSampler(pointTest);
222  trace.info() << "Sampling point of coordinate "<< pointTest << ", => coordinates in source domain:"
223  << pointInSourceDomain << " == " << PointVector<2,int>(5,0) << std::endl;
224  nb++;
225  nbok += (pointInSourceDomain== PointVector<2,int>(5,0));
226 
227  // BasicDomainSubSampler 3D
228  HyperRectDomain<SpaceND<3, int> > domainSource3D (PointVector<3,int>(0,0, 0), PointVector<3,int>(10,10, 10));
230  aGridSize3D.push_back(5);
231  aGridSize3D.push_back(3);
232  aGridSize3D.push_back(1);
233  PointVector<3,int> shiftVector3D(0 ,1, -1);
235  aGridSize3D, shiftVector3D);
236  trace.info()<< "Subsampling functor on 3D domain " << domainSource3D <<" with grid size "
237  << aGridSize3D[0] << " " << aGridSize3D[1]<< " " << aGridSize3D[2] << " and shift vector "<< shiftVector3D <<std::endl ;
238  PointVector<3,int> pointTest3D(0,1,2);
239  PointVector<3,int> pointTest3D2(0,0,0);
240  PointVector<3,int> pointInSourceDomain3D = subSampler3D(pointTest3D);
241  PointVector<3,int> pointInSourceDomain3D2 = subSampler3D(pointTest3D2);
242  trace.info() << "Sampling point of coordinate "<< pointTest3D << ", => coordinates in source domain:"
243  << pointInSourceDomain3D << " == " << PointVector<3,int>(0, 4, 1) << std::endl;
244  trace.info() << "Sampling point of coordinate "<< pointTest3D2 << ", => coordinates in source domain:"
245  << pointInSourceDomain3D2 << " == " << PointVector<3,int>(0, 1, 0) << std::endl;
246  nb++;
247  nbok += (pointInSourceDomain3D== PointVector<3,int>(0, 4, 1)) &&
248  (pointInSourceDomain3D2== PointVector<3,int>(0, 1, 0));
249 
250  // FlipDomainAxis
251  std::vector<HyperRectDomain<SpaceND<3, int> >::Dimension> vectFlip;
252  vectFlip.push_back(1);
253  vectFlip.push_back(2);
254  functors::FlipDomainAxis<HyperRectDomain<SpaceND<3, int> > > flipFunctorAxis12(domainSource3D, vectFlip);
255  trace.info() << "Flip point of coordinate "<< pointTest3D << ", => fliped coordinates with axis 1 and 2:"
256  << flipFunctorAxis12(pointTest3D) << " == " << PointVector<3,int>(0, 9, 8) << std::endl;
257  nb++;
258  nbok += (flipFunctorAxis12(pointTest3D)== PointVector<3,int>(0, 9, 8));
259 
260 
261 
262  // BasicDomainReSampler 2D
263  std::vector< double > aGridSizeReSample;
264  aGridSizeReSample.push_back(0.25);
265  aGridSizeReSample.push_back(0.5);
267  DGtal::int32_t, double > reSampler(domainSource,
268  aGridSizeReSample, shiftVector);
269 
270  trace.info()<< "Resampling functor on 2D domain " << domainSource <<" with grid size "
271  << aGridSizeReSample[0] << " " << aGridSizeReSample[1] << " and shift vector "<< shiftVector <<std::endl ;
272  PointVector<2,int> pointTestRS(9,4);
273  PointVector<2,int> pointInSourceDomainRS = reSampler(pointTestRS);
274  trace.info() << "Sampling point of coordinate "<< pointTestRS << ", => coordinates in source domain:"
275  << pointInSourceDomainRS << " == " << PointVector<2,int>(2,2) << std::endl;
276  nb++;
277  nbok += (pointInSourceDomainRS== PointVector<2,int>(2,2));
278 
279 
280 
281  }
282  return nbok == nb;
283 }
Aim: Parallelepidec region of a digital space, model of a 'CDomain'.
Aim: Functor that subsamples an initial domain by given a grid size and a shift vector....
Aim: Functor that flips the domain coordinate system from some selected axis. For instance,...
Aim: Functor that embeds a 2D point into a 3D space from two axis vectors and an origin point given i...
Special Point Functor that adds one dimension to a 2D point and apply on it a rotation of angle alpha...
DGtal::uint32_t Dimension
Definition: Common.h:136
boost::int32_t int32_t
signed 32-bit integer.
Definition: BasicTypes.h:72
Aim: Functor that maps a point P of dimension i to a point Q of dimension j. The member myDims is an ...
void init(const TIterator &itb, const TIterator &ite)
HalfEdgeDataStructure::Size Size
Domain domain

References DGtal::Trace::beginBlock(), domain, DGtal::Trace::endBlock(), DGtal::Trace::info(), DGtal::functors::Projector< S >::init(), DGtal::functors::Point2DEmbedderIn3D< TDomain3D, TInteger >::shiftOriginPoint(), and DGtal::trace.

Referenced by main().