DGtal  1.5.beta
testAlphaThickSegmentComputer.cpp
Go to the documentation of this file.
1 
31 #include <iostream>
32 #include <cmath>
33 
34 #include "DGtal/base/Common.h"
35 #include "ConfigTest.h"
36 #include "DGtal/helpers/StdDefs.h"
37 #include "DGtal/geometry/curves/AlphaThickSegmentComputer.h"
38 #include "DGtal/io/readers/PointListReader.h"
39 #include "DGtal/io/boards/Board2D.h"
41 
42 using namespace std;
43 using namespace DGtal;
44 
46 // Functions for testing class AlphaThickSegmentComputer.
48 
53 {
54  unsigned int nbok = 0;
55  unsigned int nb = 0;
56 
57  Board2D aBoard;
58  typedef AlphaThickSegmentComputer< Z2i::Point > AlphaThickSegmentComputer2D;
59  trace.beginBlock ( "Testing convexhull and boxes of alpha-thick segment on noisy discrete contour." );
60  std::vector<Z2i::Point> aContour;
61  std::string fileContour = testPath + "samples/contourNoiseSample.sdp";
62  aContour = PointListReader<Z2i::Point>::getPointsFromFile(fileContour);
63  bool res = true;
64  AlphaThickSegmentComputer2D anAlphaThickSegmentComputer(5);
65  anAlphaThickSegmentComputer.init(aContour.begin());
66  AlphaThickSegmentComputer2D anAlphaThickSegmentComputer2(10);
67  anAlphaThickSegmentComputer2.init(aContour.begin());
68  AlphaThickSegmentComputer2D anAlphaThickSegmentComputer3(2);
69  anAlphaThickSegmentComputer3.init(aContour.begin());
70  AlphaThickSegmentComputer2D anAlphaThickSegmentComputer4(1);
71  anAlphaThickSegmentComputer4.init(aContour.begin());
72 
73 
74  while (anAlphaThickSegmentComputer.end() != aContour.end() &&
75  anAlphaThickSegmentComputer.extendFront()){}
76  while (anAlphaThickSegmentComputer2.end() != aContour.end() &&
77  anAlphaThickSegmentComputer2.extendFront() ){}
78  while (anAlphaThickSegmentComputer3.end() != aContour.end() &&
79  anAlphaThickSegmentComputer3.extendFront()){}
80  while (anAlphaThickSegmentComputer4.end() != aContour.end() &&
81  anAlphaThickSegmentComputer4.extendFront()){}
82 
83 
84  // Display convexhull
85  aBoard.setLineWidth(5);
87  for (AlphaThickSegmentComputer2D::ConvexhullConstIterator it = anAlphaThickSegmentComputer.convexhullBegin();
88  it != anAlphaThickSegmentComputer.convexhullEnd(); it++){
89  if ((it+1) != anAlphaThickSegmentComputer.convexhullEnd()){
90  aBoard.drawLine((*it)[0], (*it)[1],
91  (*(it+1))[0],
92  (*(it+1))[1]);
93  }else{
94  aBoard.drawLine((*it)[0], (*it)[1],
95  (*(anAlphaThickSegmentComputer.convexhullBegin()))[0],
96  (*(anAlphaThickSegmentComputer.convexhullBegin()))[1]);
97  }
98  }
99 
100 
101  // Display boundingbox
102  aBoard << SetMode((*anAlphaThickSegmentComputer.begin()).className(), "Grid");
103  aBoard << CustomStyle( anAlphaThickSegmentComputer2.className(),
105  aBoard << anAlphaThickSegmentComputer2;
106  aBoard << CustomStyle( anAlphaThickSegmentComputer.className(),
108  aBoard << anAlphaThickSegmentComputer;
109  aBoard << CustomStyle( anAlphaThickSegmentComputer3.className(),
111  aBoard << anAlphaThickSegmentComputer3;
112  aBoard << CustomStyle( anAlphaThickSegmentComputer4.className(),
114  aBoard << anAlphaThickSegmentComputer4;
115 
116 
117  // Display the input curve
118  aBoard << SetMode((*aContour.begin()).className(), "Grid");
119  for (std::vector<Z2i::Point>::const_iterator it = aContour.begin();
120  it != aContour.end(); it++){
121  aBoard << *it;
122  if (it+1 != aContour.end()){
123  Z2i::Point next = *(it+1);
125  aBoard.drawLine((*it)[0], (*it)[1], next[0], next[1]);
126  }
127  }
128 
129  aBoard.saveEPS("testAlphaThickSegmentComputer_Convexhull.eps");
130  trace.info() << " Alpha Thick with alpha 5, size (awaited be 41) = " << anAlphaThickSegmentComputer.getNumberSegmentPoints();
131  res = anAlphaThickSegmentComputer.getNumberSegmentPoints()==41;
132  nbok += res ? 1 : 0;
133  nb++;
134  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
135  trace.endBlock();
136 
137  trace.beginBlock("Testing access to extremity points");
138  trace.info() << "First extremity point: " << anAlphaThickSegmentComputer.getExtremityPoints().first <<
139  " ( should be " << *(aContour.begin())<< ")" << std::endl;
140  trace.info() << "Second extremity point: " << anAlphaThickSegmentComputer.getExtremityPoints().second <<
141  " ( should be (80, 18) )" << std::endl;
142 
143  res = anAlphaThickSegmentComputer.getExtremityPoints().first == *(aContour.begin())&&
144  anAlphaThickSegmentComputer.getExtremityPoints().second == Z2i::Point(80,18);
145  nbok += res ? 1 : 0;
146  nb++;
147  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
148  trace.endBlock();
149 
150 
151  trace.beginBlock("Testing access to anti podal points");
152  std::pair<std::pair<Z2i::Point, Z2i::Point>,
153  Z2i::Point> pairAntipodal = anAlphaThickSegmentComputer.getAntipodalLeaningPoints();
154 
155  Z2i::Point p = pairAntipodal.first.first;
156  Z2i::Point q = pairAntipodal.first.second;
157  Z2i::Point s = pairAntipodal.second;
159  aBoard.drawLine(p[0], p[1], q[0], q[1]);
160  aBoard.fillCircle(s[0], s[1], 0.2);
161  aBoard.saveEPS("testAlphaThickSegmentComputer_ConvexhullAntipodal.eps");
162 
163  trace.info() << "Antipodal pair: p " << p << ", q:" << q << ", s: "<< s << std::endl;
164  trace.info() << "Should be " << Z2i::Point(78,16) << " " << Z2i::Point(79,6) << Z2i::Point(83,13) <<std::endl;
165 
166  res = p==Z2i::Point(78,16) && q==Z2i::Point(79,6) && s == Z2i::Point(83,13);
167  nbok += res ? 1 : 0;
168  nb++;
169  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
170 
171 
172  trace.beginBlock("Testing getter of segment parameters");
173  pairAntipodal = anAlphaThickSegmentComputer4.getAntipodalLeaningPoints();
174  p = pairAntipodal.first.first;
175  q = pairAntipodal.first.second;
176  s = pairAntipodal.second;
177 
178  Z2i::RealPoint vectDir = (p-q)[0]>0? p-q: q-p;
179 
180  trace.info() << "Segment4 params: vect Dir: " << vectDir << std::endl;
181  trace.info() << "Should be: " << Z2i::RealPoint(1,1) <<std::endl;
182 
183  res = vectDir == Z2i::RealPoint(1,1);
184  nbok += res ? 1 : 0;
185  nb++;
186  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
187  trace.endBlock();
188  return nbok == nb;
189 }
190 
191 
192 
197 {
198  unsigned int nbok = 0;
199  unsigned int nb = 0;
200  Board2D aBoard;
201  typedef AlphaThickSegmentComputer< Z2i::RealPoint> AlphaThickSegmentComputer2D;
203 
204  trace.beginBlock ( "Testing alpha-thick segment on contour composed of floating coords ..." );
205  std::vector<Z2i::RealPoint> aContour;
206  std::string fileContour = testPath + "samples/contourNoiseSample2.sdp";
208 
209  AlphaThickSegmentComputer2D anAlphaThickSegmentComputer(2);
210  anAlphaThickSegmentComputer.init(aContour.begin()+10);
211 
212  while (anAlphaThickSegmentComputer.end()!= aContour.end() &&
213  anAlphaThickSegmentComputer.extendFront()){
214  }
215 
216 
217  // Display alpha thick segment
218  aBoard << SetMode((*anAlphaThickSegmentComputer.begin()).className(), "Grid");
219  aBoard << anAlphaThickSegmentComputer;
220 
221 
222  // Test primitive of parallelStrip and display the input curve
223  Primitive pStrip = anAlphaThickSegmentComputer.primitive();
224  unsigned int nbInStrip = 0;
225 
226  aBoard << SetMode((*aContour.begin()).className(), "Grid");
227  for (std::vector<Z2i::RealPoint>::const_iterator it = aContour.begin();
228  it != aContour.end(); it++){
229  if (it+1 != aContour.end()){
230  Z2i::RealPoint next = *(it+1);
231  aBoard.setLineWidth(2);
233  aBoard.drawLine((*it)[0], (*it)[1], next[0], next[1]);
234  }
235  if (pStrip(*it)){
236  nbInStrip++;
237  aBoard << *it;
238  }
239  }
240  trace.info() << "Nb contour points in the segment parallel strip (awaited 32) = " << nbInStrip << std::endl;
241 
242  nbok += nbInStrip==32;
243  nb++;
244 
245  nbok += anAlphaThickSegmentComputer.getNumberSegmentPoints()==31 ? 1 : 0;
246  nb++;
247 
248  trace.info() << "Segment size (awaited 31): " << anAlphaThickSegmentComputer.getNumberSegmentPoints() << std::endl;
249  aBoard.saveEPS("testAlphaThickSegmentComputer_FloatingPt.eps");
250 
251  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
252  trace.endBlock();
253  return nbok == nb;
254 }
255 
256 
257 
258 
259 
264 {
265  unsigned int nbok = 0;
266  unsigned int nb = 0;
267  typedef FreemanChain<Z2i::Space::Integer>::ConstIterator FCConstIterator;
268  typedef AlphaThickSegmentComputer< Z2i::Space::Point, FCConstIterator > AlphaThickSegmentComputer2D;
269 
270  Board2D aBoard;
271 
272 
273 
274  trace.beginBlock ( "Testing AlphaThickSegmentComputer2D on Freeman chain ..." );
275 
276  // Reading input contour
277  std::string freemanChainFilename = testPath + "samples/klokan.fc";
278  fstream fst;
279  fst.open (freemanChainFilename.c_str(), ios::in);
281  fst.close();
282  aBoard << fc;
283 
284 
285  AlphaThickSegmentComputer2D anAlphaThickSegmentComputer(70.0);
286  anAlphaThickSegmentComputer.init(fc.begin());
287  while (anAlphaThickSegmentComputer.end() != fc.end() &&
288  anAlphaThickSegmentComputer.extendFront()){
289  }
290 
291 
292  // Display segment
293  aBoard << SetMode((*anAlphaThickSegmentComputer.begin()).className(), "Grid");
294  aBoard << anAlphaThickSegmentComputer;
295  trace.info() << "Segment size (awaited 642): " << anAlphaThickSegmentComputer.getNumberSegmentPoints() << std::endl;
296  nbok += anAlphaThickSegmentComputer.getNumberSegmentPoints()==642 ? 1 : 0;
297  nb++;
298 
299  // Display points inside the parallel strip
300  unsigned int nbInStrip = 0;
301  AlphaThickSegmentComputer2D::Primitive parallelStrip = anAlphaThickSegmentComputer.primitive();
302 
303  for(FCConstIterator it = fc.begin(); it != fc.end(); it++){
304  if(parallelStrip(*it)){
306  aBoard.drawCircle( (*it)[0],(*it)[1], 1.0) ;
307  nbInStrip++;
308  }
309  }
311  aBoard.fillCircle( (*(fc.begin()))[0],(*(fc.begin()))[1], 1.0) ;
312 
313  trace.info() << "Nb contour points in the segment parallel strip (awaited 818) = " << nbInStrip << std::endl;
314 
315 
316  nbok += nbInStrip==818 ? 1 : 0;
317  nb++;
318 
319  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
320  trace.endBlock();
321  aBoard.saveEPS("testAlphaThickSegmentComputer_Freeman.eps");
322 
323  return nbok == nb;
324 
325 }
326 
327 
332 {
333  unsigned int nbok = 0;
334  unsigned int nb = 0;
335  Board2D aBoard, aBoard2;
336  typedef AlphaThickSegmentComputer< Z2i::RealPoint> AlphaThickSegmentComputer2D;
337  trace.beginBlock ( "Test special cases on various initialisations ..." );
338 
339  AlphaThickSegmentComputer2D segment(1.3);
340  std::vector<Z2i::RealPoint> aContour;
341  aContour.push_back(Z2i::RealPoint(29,20));
342  aContour.push_back(Z2i::RealPoint(30,20.01 ));
343  aContour.push_back(Z2i::RealPoint(31, 21));
344  aContour.push_back(Z2i::RealPoint(32,20));
345  segment.init(aContour.begin());
346  segment.extendFront();
347  while (segment.end()!= aContour.end() &&
348  segment.extendFront()){
349  }
350  nb++;
351  nbok = segment.getNumberSegmentPoints()==4;
352 
353  // Display alpha thick segment
354  for( std::vector<Z2i::RealPoint>::const_iterator it = aContour.begin(); it != aContour.end(); it++){
355  aBoard << *it;
356  }
357  // Display alpha thick segment
358  aBoard << SetMode((*segment.begin()).className(), "Grid");
359  aBoard << segment;
360 
361  functors::Round<> rounding_functor;
362  Z2i::Point p( segment.getAntipodalLeaningPoints().first.first, rounding_functor );
363  Z2i::Point q( segment.getAntipodalLeaningPoints().first.second, rounding_functor );
364  Z2i::Point s( segment.getAntipodalLeaningPoints().second, rounding_functor );
366  aBoard.drawLine(p[0], p[1], q[0], q[1]);
368  aBoard.fillCircle(s[0], s[1], 0.2);
369  aBoard.saveEPS("testSpecialInit.eps");
370 
371  trace.info() << "Segment size: " << segment.getNumberSegmentPoints() << "(awaited : " << 4 <<")"<< std::endl;
372  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
373  trace.endBlock();
374  aBoard.saveEPS("testSpecialInit.eps");
375 
376  return nbok==nb;
377 }
378 
379 
380 
385 {
386  Board2D aBoard;
387  typedef AlphaThickSegmentComputer< Z2i::RealPoint> AlphaThickSegmentComputer2D;
388  unsigned nb=0;
389  unsigned nbok =0;
390  trace.beginBlock ( "Testing alpha-thick segment with multi width ..." );
391  std::vector<Z2i::RealPoint> aContour;
392  std::string fileContour = testPath + "samples/contourNoiseSample2.sdp";
394  HueShadeColorMap<double> hueMap(0.0, 10);
395  unsigned int pos=0;
396  unsigned int nbTotalAdded=0;
397  for (double width=0.5; width<10; width+= 0.2, pos += 1) {
398  AlphaThickSegmentComputer2D anAlphaThickSegmentComputer(width);
399  anAlphaThickSegmentComputer.init(aContour.begin()+pos);
400  nbTotalAdded++;
401  while (anAlphaThickSegmentComputer.end()!= aContour.end() &&
402  anAlphaThickSegmentComputer.extendFront()){
403  nbTotalAdded++;
404  }
405  aBoard << SetMode((*anAlphaThickSegmentComputer.begin()).className(), "Grid");
406 
407  aBoard << CustomStyle( anAlphaThickSegmentComputer.className(),
408  new CustomColors( hueMap(width), DGtal::Color::None ) );
409  aBoard << anAlphaThickSegmentComputer;
410  }
411  trace.info() << "Nb total points added: " << nbTotalAdded << "(awaited: 2300) " << std::endl;
412  trace.endBlock();
413  aBoard.saveEPS("testMultiWidth.eps");
414  nb++;
415  nbok += nbTotalAdded == 2300;
416  return nb==nbok;
417 }
418 
419 
420 
421 
422 
426 bool
428  Board2D aBoardHVthickness;
429  Board2D aBoardEuclthickness;
430  typedef AlphaThickSegmentComputer<Z2i::Point> AlphaThickSegmentComputer2D;
431  unsigned nb=0;
432  unsigned nbok =0;
433  trace.beginBlock ( "Testing alpha-thick segment with different thickness definitions:" );
434 
435  AlphaThickSegmentComputer2D anAlphaSegmentHV(1.35, functions::Hull2D::HorizontalVerticalThickness);
436  AlphaThickSegmentComputer2D anAlphaSegmentEucl(1.35, functions::Hull2D::EuclideanThickness);
437 
438  Z2i::Domain adom(Z2i::Point(99,45), Z2i::Point(106,55));
439  aBoardEuclthickness << adom;
440  aBoardHVthickness << adom;
441 
442  std::vector<Z2i::Point> aVect;
443  aVect.push_back(Z2i::Point(104, 54));
444  aVect.push_back(Z2i::Point(104, 53));
445  aVect.push_back(Z2i::Point(103, 53));
446  aVect.push_back(Z2i::Point(103, 52));
447  aVect.push_back(Z2i::Point(102, 52));
448  aVect.push_back(Z2i::Point(102, 51));
449  aVect.push_back(Z2i::Point(102, 50));
450  aVect.push_back(Z2i::Point(101, 50));
451  aVect.push_back(Z2i::Point(101, 49));
452  aVect.push_back(Z2i::Point(101, 48));
453  aVect.push_back(Z2i::Point(100, 48));
454  aVect.push_back(Z2i::Point(100, 47));
455  // Display the input curve
456  aBoardEuclthickness << SetMode((*aVect.begin()).className(), "Grid");
457  aBoardHVthickness << SetMode((*aVect.begin()).className(), "Grid");
458  for (std::vector<Z2i::Point>::const_iterator it = aVect.begin();
459  it != aVect.end(); it++){
460  aBoardHVthickness << *it;
461  aBoardEuclthickness << *it;
462  if (it+1 != aVect.end()){
463  Z2i::Point next = *(it+1);
464  aBoardEuclthickness.setPenColor(DGtal::Color::Gray);
465  aBoardHVthickness.setPenColor(DGtal::Color::Gray);
466  aBoardEuclthickness.drawLine((*it)[0], (*it)[1], next[0], next[1]);
467  aBoardHVthickness.drawLine((*it)[0], (*it)[1], next[0], next[1]);
468  }
469  }
470 
471  anAlphaSegmentEucl.init(aVect.begin());
472  while(anAlphaSegmentEucl.end() != aVect.end()
473  && anAlphaSegmentEucl.extendFront()){
474  }
475  anAlphaSegmentHV.init(aVect.begin());
476  while(anAlphaSegmentHV.end() != aVect.end()
477  && anAlphaSegmentHV.extendFront()){
478  }
479 
480 
481  trace.info() << "Euclidean thickness based segment, th= " << anAlphaSegmentEucl.getThickness() << std::endl;
482  trace.info() << "Horizontal/Vertical thickness based segment, th= " << anAlphaSegmentHV.getThickness() << std::endl;
483 
484 
485  aBoardHVthickness << CustomStyle( anAlphaSegmentEucl.className(), new CustomColors( DGtal::Color::Blue, DGtal::Color::None ) );
486  aBoardEuclthickness << CustomStyle( anAlphaSegmentHV.className(), new CustomColors( DGtal::Color::Blue, DGtal::Color::None ) );
487  aBoardHVthickness << anAlphaSegmentHV;
488  aBoardEuclthickness << anAlphaSegmentEucl;
489 
490  std::vector<Z2i::Point> hullHV = anAlphaSegmentHV.getConvexHull();
491  std::vector<Z2i::Point> hullEucl = anAlphaSegmentEucl.getConvexHull();
492  aBoardEuclthickness.setLineWidth(5);
493  aBoardHVthickness.setLineWidth(5);
494  aBoardEuclthickness.setPenColor(DGtal::Color::Purple);
495  aBoardHVthickness.setPenColor(DGtal::Color::Purple);
496  for (unsigned int i = 0; i < hullEucl.size(); i++){
497  aBoardEuclthickness.drawLine(hullEucl.at(i)[0], hullEucl.at(i)[1],
498  hullEucl.at((i+1)%hullEucl.size())[0],
499  hullEucl.at((i+1)%hullEucl.size())[1]);
500  }
501  for (unsigned int i = 0; i < hullHV.size(); i++){
502  aBoardHVthickness.drawLine(hullHV.at(i)[0], hullHV.at(i)[1],
503  hullHV.at((i+1)%hullHV.size())[0],
504  hullHV.at((i+1)%hullHV.size())[1]);
505  }
506 
507  Z2i::Point pEucl = anAlphaSegmentEucl.getAntipodalLeaningPoints().first.first;
508  Z2i::Point qEucl = anAlphaSegmentEucl.getAntipodalLeaningPoints().first.second;
509  Z2i::Point sEucl = anAlphaSegmentEucl.getAntipodalLeaningPoints().second;
510 
511  Z2i::Point pHV = anAlphaSegmentHV.getAntipodalLeaningPoints().first.first;
512  Z2i::Point qHV = anAlphaSegmentHV.getAntipodalLeaningPoints().first.second;
513  Z2i::Point sHV = anAlphaSegmentHV.getAntipodalLeaningPoints().second;
514  aBoardEuclthickness.setPenColor(DGtal::Color::Red);
515  aBoardHVthickness.setPenColor(DGtal::Color::Red);
516 
517  aBoardEuclthickness.drawCircle( pEucl[0], pEucl[1], 0.25);
518  aBoardHVthickness.drawCircle( pHV[0], pHV[1], 0.25);
519 
520  aBoardEuclthickness.drawCircle( qEucl[0], qEucl[1], 0.25);
521  aBoardHVthickness.drawCircle( qHV[0], qHV[1], 0.25);
522 
523  aBoardEuclthickness.setPenColor(DGtal::Color::Green);
524  aBoardHVthickness.setPenColor(DGtal::Color::Green);
525 
526  aBoardEuclthickness.drawCircle( sEucl[0], sEucl[1], 0.25);
527  aBoardHVthickness.drawCircle( sHV[0], sHV[1], 0.25);
528 
529  aBoardEuclthickness.saveEPS("testAlphaThickEucl.eps");
530  aBoardHVthickness.saveEPS("testAlphaThickHV.eps");
531 
532  trace.endBlock();
533  return nb==nbok;
534 }
535 
536 
537 
538 
540 // Standard services - public :
541 
542 int main( int argc, char** argv )
543 {
544  trace.beginBlock ( "Testing class AlphaThickSegmentComputer" );
545  trace.info() << "Args:";
546  for ( int i = 0; i < argc; ++i )
547  trace.info() << " " << argv[ i ];
548  trace.info() << endl;
549 
552 
553  trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
554 
555 
556  trace.endBlock();
557  return res ? 0 : 1;
558 }
559 // //
Aim: This class is devoted to the recognition of alpha thick segments as described in ....
Aim: This class specializes a 'Board' class so as to display DGtal objects more naturally (with <<)....
Definition: Board2D.h:71
static const Color Purple
Definition: Color.h:424
static const Color Yellow
Definition: Color.h:422
static const Color None
Definition: Color.h:412
static const Color Green
Definition: Color.h:417
static const Color Gray
Definition: Color.h:414
static const Color Red
Definition: Color.h:416
static const Color Blue
Definition: Color.h:419
static const Color Magenta
Definition: Color.h:421
ConstIterator end() const
ConstIterator begin() const
Aim: This class template may be used to (linearly) convert scalar values in a given range into a colo...
Aim: A parallel strip in the space is the intersection of two parallel half-planes such that each hal...
Definition: ParallelStrip.h:91
void beginBlock(const std::string &keyword="")
std::ostream & emphase()
std::ostream & info()
double endBlock()
Board & setPenColor(const DGtal::Color &color)
Definition: Board.cpp:297
void fillCircle(double x, double y, double radius, int depthValue=-1)
Definition: Board.cpp:470
void drawLine(double x1, double y1, double x2, double y2, int depthValue=-1)
Definition: Board.cpp:367
void drawCircle(double x, double y, double radius, int depthValue=-1)
Definition: Board.cpp:450
Board & setLineWidth(double width)
Definition: Board.cpp:328
void saveEPS(const char *filename, PageSize size=Board::BoundingBox, double margin=10.0) const
Definition: Board.cpp:804
DGtal is the top-level namespace which contains all DGtal functions and types.
Trace trace
Definition: Common.h:153
Custom style class redefining the pen color and the fill color. You may use Board2D::Color::None for ...
Definition: Board2D.h:279
Aim: Implements method to read a set of points represented in each line of a file.
Modifier class in a Board2D stream. Useful to choose your own mode for a given class....
Definition: Board2D.h:247
Functor that rounds to the nearest integer.
bool testAlphaThickSpecialInit()
int main(int argc, char **argv)
bool testAlphaThickSegmentComputerFloatingPointContour()
bool testThicknessDefinitions()
bool testAlphaThickSegmentConvexHullAndBox()
bool testAlphaThickSegmentFreeman()
MyPointD Point
Definition: testClone2.cpp:383
PointVector< 3, double > RealPoint