DGtal  1.2.0
testBasicPointFunctors.cpp
Go to the documentation of this file.
1 
31 #include <cstdio>
32 #include <cmath>
33 #include <iostream>
34 #include <fstream>
35 #include <vector>
36 #include "DGtal/base/Common.h"
37 #include "DGtal/base/CUnaryFunctor.h"
38 #include "DGtal/kernel/PointVector.h"
39 #include "DGtal/kernel/SpaceND.h"
40 #include "DGtal/kernel/BasicPointFunctors.h"
41 #include "DGtal/kernel/domains/HyperRectDomain.h"
42 
43 using namespace DGtal;
44 using namespace std;
45 
46 template <typename TFunctor, typename TArg, typename TRes >
48 {
49  BOOST_CONCEPT_ASSERT(( concepts::CUnaryFunctor<TFunctor, TArg, TRes > ));
50 }
51 
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 
160  //comparison
161  PointVector<3,int> res1(5,0,2);
162  trace.info() << "p " << p << " => " << proj1(p) << " == " << res1 << std::endl;
163  nbok += ( proj1(p) == res1 ) ? 1 : 0;
164  nb++;
165 
166  PointVector<3,int> res2(2,5,0);
167  trace.info() << "p " << p << " => " << proj2(p) << " == " << res2 << std::endl;
168  nbok += ( proj2(p) == res2 ) ? 1 : 0;
169  nb++;
170 
171  PointVector<3,int> res3(5,2,0);
172  trace.info() << "p " << p << " => " << proj3(p) << " == " << res3 << std::endl;
173  nbok += ( proj3(p) == res3 ) ? 1 : 0;
174  nb++;
175 
176  PointVector<3,int> res4(2,-1,-1);
177  trace.info() << "p " << p << " => " << proj4(p) << " == " << res4
178  << "(-1 as default value)" << std::endl;
179  nbok += ( proj4(p) == res4 ) ? 1 : 0;
180  nb++;
181  }
182  trace.endBlock();
183 
184 
185  trace.beginBlock ( "Checking Basic Domain SubSampler" );
186  {
187  // BasicDomainSubSampler 2D
190  aGridSize.push_back(5);
191  aGridSize.push_back(5);
192  PointVector<2,int> shiftVector(0 ,0);
194  aGridSize, shiftVector);
195  trace.info()<< "Subsampling functor on 2D domain " << domainSource <<" with grid size "
196  << aGridSize[0] << " " << aGridSize[1] << " and shift vector "<< shiftVector <<std::endl ;
197  PointVector<2,int> pointTest(1,0);
198  PointVector<2,int> pointInSourceDomain = subSampler(pointTest);
199  trace.info() << "Sampling point of coordinate "<< pointTest << ", => coordinates in source domain:"
200  << pointInSourceDomain << " == " << PointVector<2,int>(5,0) << std::endl;
201  nb++;
202  nbok += (pointInSourceDomain== PointVector<2,int>(5,0));
203 
204  // BasicDomainSubSampler 3D
205  HyperRectDomain<SpaceND<3, int> > domainSource3D (PointVector<3,int>(0,0, 0), PointVector<3,int>(10,10, 10));
207  aGridSize3D.push_back(5);
208  aGridSize3D.push_back(3);
209  aGridSize3D.push_back(1);
210  PointVector<3,int> shiftVector3D(0 ,1, -1);
212  aGridSize3D, shiftVector3D);
213  trace.info()<< "Subsampling functor on 3D domain " << domainSource3D <<" with grid size "
214  << aGridSize3D[0] << " " << aGridSize3D[1]<< " " << aGridSize3D[2] << " and shift vector "<< shiftVector3D <<std::endl ;
215  PointVector<3,int> pointTest3D(0,1,2);
216  PointVector<3,int> pointTest3D2(0,0,0);
217  PointVector<3,int> pointInSourceDomain3D = subSampler3D(pointTest3D);
218  PointVector<3,int> pointInSourceDomain3D2 = subSampler3D(pointTest3D2);
219  trace.info() << "Sampling point of coordinate "<< pointTest3D << ", => coordinates in source domain:"
220  << pointInSourceDomain3D << " == " << PointVector<3,int>(0, 4, 1) << std::endl;
221  trace.info() << "Sampling point of coordinate "<< pointTest3D2 << ", => coordinates in source domain:"
222  << pointInSourceDomain3D2 << " == " << PointVector<3,int>(0, 1, 0) << std::endl;
223  nb++;
224  nbok += (pointInSourceDomain3D== PointVector<3,int>(0, 4, 1)) &&
225  (pointInSourceDomain3D2== PointVector<3,int>(0, 1, 0));
226 
227  // FlipDomainAxis
228  std::vector<unsigned int> vectFlip;
229  vectFlip.push_back(1);
230  vectFlip.push_back(2);
231  functors::FlipDomainAxis<HyperRectDomain<SpaceND<3, int> > > flipFunctorAxis12(domainSource3D, vectFlip);
232  trace.info() << "Flip point of coordinate "<< pointTest3D << ", => fliped coordinates with axis 1 and 2:"
233  << flipFunctorAxis12(pointTest3D) << " == " << PointVector<3,int>(0, 9, 8) << std::endl;
234  nb++;
235  nbok += (flipFunctorAxis12(pointTest3D)== PointVector<3,int>(0, 9, 8));
236 
237 
238 
239  // BasicDomainReSampler 2D
240  std::vector< double > aGridSizeReSample;
241  aGridSizeReSample.push_back(0.25);
242  aGridSizeReSample.push_back(0.5);
244  DGtal::int32_t, double > reSampler(domainSource,
245  aGridSizeReSample, shiftVector);
246 
247  trace.info()<< "Resampling functor on 2D domain " << domainSource <<" with grid size "
248  << aGridSizeReSample[0] << " " << aGridSizeReSample[1] << " and shift vector "<< shiftVector <<std::endl ;
249  PointVector<2,int> pointTestRS(9,4);
250  PointVector<2,int> pointInSourceDomainRS = reSampler(pointTestRS);
251  trace.info() << "Sampling point of coordinate "<< pointTestRS << ", => coordinates in source domain:"
252  << pointInSourceDomainRS << " == " << PointVector<2,int>(2,2) << std::endl;
253  nb++;
254  nbok += (pointInSourceDomainRS== PointVector<2,int>(2,2));
255 
256 
257 
258  }
259  return nbok == nb;
260 }
261 
263 // Standard services - public :
264 
265 int main( int argc, char** argv )
266 {
267  trace.beginBlock ( "Testing basic point functors" );
268  trace.info() << "Args:";
269  for ( int i = 0; i < argc; ++i )
270  trace.info() << " " << argv[ i ];
271  trace.info() << endl;
272 
273 
274  checkingConcepts<functors::Projector<SpaceND<2,int> >, PointVector<6,int>, PointVector<2,int> >();
275  //for instance, this does not compile because
276  //the point of dim 6 is projected on a point of dim 2 (and not 3)
277  //checkingConcepts<Projector<SpaceND<2,int> >, PointVector<6,int>, PointVector<3,int> >();
278 
279  bool res = testProjector();
280 
281  trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
282  trace.endBlock();
283  return res ? 0 : 1;
284 }
285 
Aim: Parallelepidec region of a digital space, model of a 'CDomain'.
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()
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 is the top-level namespace which contains all DGtal functions and types.
Trace trace
Definition: Common.h:154
boost::int32_t int32_t
signed 32-bit integer.
Definition: BasicTypes.h:72
Aim: Defines a unary functor, which associates arguments to results.
Definition: CUnaryFunctor.h:90
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)
int main(int argc, char **argv)
bool testProjector()
void checkingConcepts()
HalfEdgeDataStructure::Size Size
Domain domain