DGtal  1.0.0
testCOBANaivePlaneComputer.cpp
Go to the documentation of this file.
1
30 #include <cstdlib>
32 #include <iostream>
33 #include "DGtal/base/Common.h"
34 #include "DGtal/helpers/StdDefs.h"
35 #include "DGtal/kernel/CPointPredicate.h"
37 #include "DGtal/geometry/surfaces/COBANaivePlaneComputer.h"
38 #include "DGtal/geometry/surfaces/COBAGenericNaivePlaneComputer.h"
40
41 using namespace std;
42 using namespace DGtal;
43 using namespace DGtal::concepts;
44
46 // Functions for testing class COBANaivePlaneComputer.
48
49 template <typename Integer>
50 Integer getRandomInteger( const Integer & first, const Integer & after_last )
51 {
52  Integer r = (Integer) rand();
53  return ( r % (after_last - first) ) + first;
54 }
55
59 template <typename Integer, typename NaivePlaneComputer>
60 bool
61 checkPlane( Integer a, Integer b, Integer c, Integer d,
62  int diameter, unsigned int nbtries )
63 {
64  typedef typename NaivePlaneComputer::Point Point;
65  typedef typename Point::Component PointInteger;
67  Integer absA = ic.abs( a );
68  Integer absB = ic.abs( b );
69  Integer absC = ic.abs( c );
70  Integer x, y, z;
71  Dimension axis;
72  if ( ( absA >= absB ) && ( absA >= absC ) )
73  axis = 0;
74  else if ( ( absB >= absA ) && ( absB >= absC ) )
75  axis = 1;
76  else
77  axis = 2;
78  Point p;
79  NaivePlaneComputer plane;
80  plane.init( axis, diameter, 1, 1 );
81  // Checks that points within the naive plane are correctly recognized.
82  unsigned int nb = 0;
83  unsigned int nbok = 0;
84  while ( nb != nbtries )
85  {
86  p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
87  p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
88  p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
89  x = (Integer) p[ 0 ];
90  y = (Integer) p[ 1 ];
91  z = (Integer) p[ 2 ];
92  switch ( axis ) {
93  case 0: p[ 0 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - b * y - c * z, a ) ); break;
94  case 1: p[ 1 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - c * z, b ) ); break;
95  case 2: p[ 2 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - b * y, c ) ); break;
96  }
97  bool ok_ext = plane.isExtendable( p ); // should be ok
98  bool ok = plane.extend( p ); // should be ok
99  ++nb; nbok += ok_ext ? 1 : 0;
100  ++nb; nbok += ok ? 1 : 0;
101  if ( ! ok )
102  {
103  std::cerr << "[ERROR] p=" << p << " NOT IN plane=" << plane << std::endl;
104  break;
105  }
106  if ( ! ok_ext )
107  {
108  std::cerr << "[ERROR] p=" << p << " was NOT extendable IN plane=" << plane << std::endl;
109  break;
110  }
111  // else
112  // std::cerr << "[OK] p=" << p << " IN plane=" << plane << std::endl;
113  }
114
115  // Checks that points outside the naive plane are correctly recognized as outliers.
116  while ( nb != (nbtries * 11 ) / 10 )
117  {
118  p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
119  p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
120  p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
121  x = (Integer) p[ 0 ];
122  y = (Integer) p[ 1 ];
123  z = (Integer) p[ 2 ];
124  switch ( axis ) {
125  case 0: p[ 0 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - b * y - c * z, a ) ); break;
126  case 1: p[ 1 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - c * z, b ) ); break;
127  case 2: p[ 2 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - b * y, c ) ); break;
128  }
129  PointInteger tmp = getRandomInteger<PointInteger>( 2, 5 )
130  * (2*getRandomInteger<PointInteger>( 0, 2 ) - 1 );
131  p[ axis ] += tmp;
132  bool ok_ext = ! plane.isExtendable( p ); // should *not* be ok
133  bool ok = ! plane.extend( p ); // should *not* be ok
134  ++nb; nbok += ok ? 1 : 0;
135  ++nb; nbok += ok_ext ? 1 : 0;
136  if ( ! ok )
137  {
138  std::cerr << "[ERROR] p=" << p << " IN plane=" << plane << std::endl;
139  break;
140  }
141  if ( ! ok_ext )
142  {
143  std::cerr << "[ERROR] p=" << p << " was extendable IN plane=" << plane << std::endl;
144  break;
145  }
146  // else
147  // std::cerr << "[OK] p=" << p << " IN plane=" << plane << std::endl;
148  }
149  return nb == nbok;
150 }
151
152
156 template <typename Integer, typename GenericNaivePlaneComputer>
157 bool
158 checkGenericPlane( Integer a, Integer b, Integer c, Integer d,
159  int diameter, unsigned int nbtries )
160 {
161  typedef typename GenericNaivePlaneComputer::Point Point;
162  typedef typename Point::Component PointInteger;
164  Integer absA = ic.abs( a );
165  Integer absB = ic.abs( b );
166  Integer absC = ic.abs( c );
167  Integer x, y, z;
168  Dimension axis;
169  if ( ( absA >= absB ) && ( absA >= absC ) )
170  axis = 0;
171  else if ( ( absB >= absA ) && ( absB >= absC ) )
172  axis = 1;
173  else
174  axis = 2;
175  Point p;
176  GenericNaivePlaneComputer plane;
177  plane.init( diameter, 1, 1 );
178  // Checks that points within the naive plane are correctly recognized.
179  unsigned int nb = 0;
180  unsigned int nbok = 0;
181  while ( nb != nbtries )
182  {
183  p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
184  p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
185  p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
186  x = (Integer) p[ 0 ];
187  y = (Integer) p[ 1 ];
188  z = (Integer) p[ 2 ];
189  switch ( axis ) {
190  case 0: p[ 0 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - b * y - c * z, a ) ); break;
191  case 1: p[ 1 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - c * z, b ) ); break;
192  case 2: p[ 2 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - b * y, c ) ); break;
193  }
194  bool ok_ext = plane.isExtendable( p ); // should be ok
195  bool ok = plane.extend( p ); // should be ok
196  ++nb; nbok += ok_ext ? 1 : 0;
197  ++nb; nbok += ok ? 1 : 0;
198  if ( ! ok )
199  {
200  std::cerr << "[ERROR] p=" << p << " NOT IN plane=" << plane << std::endl;
201  break;
202  }
203  if ( ! ok_ext )
204  {
205  std::cerr << "[ERROR] p=" << p << " was NOT extendable IN plane=" << plane << std::endl;
206  break;
207  }
208  // else
209  // std::cerr << "[OK] p=" << p << " IN plane=" << plane << std::endl;
210  }
211
212  // Checks that points outside the naive plane are correctly recognized as outliers.
213  while ( nb != (nbtries * 11 ) / 10 )
214  {
215  p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
216  p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
217  p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
218  x = (Integer) p[ 0 ];
219  y = (Integer) p[ 1 ];
220  z = (Integer) p[ 2 ];
221  switch ( axis ) {
222  case 0: p[ 0 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - b * y - c * z, a ) ); break;
223  case 1: p[ 1 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - c * z, b ) ); break;
224  case 2: p[ 2 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - b * y, c ) ); break;
225  }
226  PointInteger tmp = getRandomInteger<PointInteger>( 2, 5 )
227  * (2*getRandomInteger<PointInteger>( 0, 2 ) - 1 );
228  p[ axis ] += tmp;
229  bool ok_ext = ! plane.isExtendable( p ); // should *not* be ok
230  bool ok = ! plane.extend( p ); // should *not* be ok
231  ++nb; nbok += ok ? 1 : 0;
232  ++nb; nbok += ok_ext ? 1 : 0;
233  if ( ! ok )
234  {
235  std::cerr << "[ERROR] p=" << p << " IN plane=" << plane << std::endl;
236  break;
237  }
238  if ( ! ok_ext )
239  {
240  std::cerr << "[ERROR] p=" << p << " was extendable IN plane=" << plane << std::endl;
241  break;
242  }
243  // else
244  // std::cerr << "[OK] p=" << p << " IN plane=" << plane << std::endl;
245  }
246  std::cerr << "plane = " << plane << std::endl;
247  return nb == nbok;
248 }
249
250
251 template <typename Integer, typename NaivePlaneComputer>
252 bool
253 checkPlanes( unsigned int nbplanes, int diameter, unsigned int nbtries )
254 {
255  //using namespace Z3i;
256  //typedef COBANaivePlaneComputer<Z3, Integer> NaivePlaneComputer;
257  unsigned int nb = 0;
258  unsigned int nbok = 0;
259  for ( unsigned int nbp = 0; nbp < nbplanes; ++nbp )
260  {
261  Integer a = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
262  Integer b = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
263  Integer c = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
264  Integer d = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
265  if ( ( a != 0 ) || ( b != 0 ) || ( c != 0 ) )
266  {
267  ++nb; nbok += checkPlane<Integer, NaivePlaneComputer>( a, b, c, d, diameter, nbtries ) ? 1 : 0;
268  if ( nb != nbok )
269  {
270  std::cerr << "[ERROR] for plane " << a << " * x + "
271  << b << " * y + " << c << " * z = " << d << std::endl;
272  break;
273  }
274  }
275  }
276  return nb == nbok;
277 }
278
284 {
285  unsigned int nbok = 0;
286  unsigned int nb = 0;
287  using namespace Z3i;
288  typedef BigInteger Integer;
290  typedef COBAGenericNaivePlaneComputer<Z3, BigInteger> GenericNaivePlaneComputer;
291
292  BOOST_CONCEPT_ASSERT(( CAdditivePrimitiveComputer< NaivePlaneComputer > ));
294  BOOST_CONCEPT_ASSERT(( boost::ForwardContainer< NaivePlaneComputer > ));
296  BOOST_CONCEPT_ASSERT(( CPointPredicate< NaivePlaneComputer::Primitive > ));
298
299  trace.beginBlock ( "Testing block: COBANaivePlaneComputer instantiation." );
300  NaivePlaneComputer plane;
301  Point pt0( 0, 0, 0 );
302  plane.init( 2, 100, 3, 2 );
303  bool pt0_inside = plane.extend( pt0 );
304  FATAL_ERROR(pt0_inside);
305
306  trace.info() << "(" << nbok << "/" << nb << ") Plane=" << plane
307  << std::endl;
308  Point pt1( Point( 8, 1, 3 ) );
309  bool pt1_inside = plane.extend( pt1 );
310  ++nb; nbok += pt1_inside == true ? 1 : 0;
311  trace.info() << "(" << nbok << "/" << nb << ") add " << pt1
312  << " Plane=" << plane << std::endl;
313  Point pt2( Point( 2, 7, 1 ) );
314  bool pt2_inside = plane.extend( pt2 );
315  ++nb; nbok += pt2_inside == true ? 1 : 0;
316  trace.info() << "(" << nbok << "/" << nb << ") add " << pt2
317  << " Plane=" << plane << std::endl;
318
319  Point pt3( Point( 0, 5, 17 ) );
320  bool pt3_inside = plane.extend( pt3 );
321  ++nb; nbok += pt3_inside == false ? 1 : 0;
322  trace.info() << "(" << nbok << "/" << nb << ") add " << pt3
323  << " Plane=" << plane << std::endl;
324
325  Point pt4( Point( -10, -10, 10 ) );
326  bool pt4_inside = plane.extend( pt4 );
327  ++nb; nbok += pt4_inside == false ? 1 : 0;
328  trace.info() << "(" << nbok << "/" << nb << ") add " << pt4
329  << " Plane=" << plane << std::endl;
330
331  Point pt5 = pt0 + pt1 + pt2 + Point( 0, 0, 2 );
332  bool pt5_inside = plane.extend( pt5 );
333  ++nb; nbok += pt5_inside == true ? 1 : 0;
334  trace.info() << "(" << nbok << "/" << nb << ") add " << pt5
335  << " Plane=" << plane << std::endl;
336
337  NaivePlaneComputer plane2;
338  plane2.init( 2, 100, 1, 1 );
339  plane2.extend( Point( 10, 0, 0 ) );
340  plane2.extend( Point( 0, 8, 0 ) );
341  plane2.extend( Point( 0, 0, 6 ) );
342  trace.info() << "(" << nbok << "/" << nb << ") "
343  << " Plane2=" << plane2 << std::endl;
344
345  ++nb; nbok += checkPlane<Integer,NaivePlaneComputer>( 11, 5, 19, 20, 100, 100 ) ? 1 : 0;
346  trace.info() << "(" << nbok << "/" << nb
347  << ") checkPlane<Integer,NaivePlaneComputer>( 11, 5, 19, 20, 100, 100 )"
348  << std::endl;
349
350  ++nb; nbok += checkGenericPlane<Integer,GenericNaivePlaneComputer>( 11, 5, 19, 20, 100, 100 ) ? 1 : 0;
351  trace.info() << "(" << nbok << "/" << nb
352  << ") checkGenericPlane<Integer,GenericNaivePlaneComputer>( 11, 5, 19, 20, 100, 100 )"
353  << std::endl;
354  ++nb; nbok += checkGenericPlane<Integer,GenericNaivePlaneComputer>( 17, 33, 7, 10, 100, 100 ) ? 1 : 0;
355  trace.info() << "(" << nbok << "/" << nb
356  << ") checkGenericPlane<Integer,GenericNaivePlaneComputer>( 17, 33, 7, 10, 100, 100 )"
357  << std::endl;
358  ++nb; nbok += checkPlane<Integer,NaivePlaneComputer>( 15, 8, 13, 15, 100, 100 ) ? 1 : 0;
359  trace.info() << "(" << nbok << "/" << nb
360  << ") checkPlane<Integer,NaivePlaneComputer>( 15, 8, 13, 15, 100, 100 )"
361  << std::endl;
362  ++nb; nbok += checkGenericPlane<Integer,GenericNaivePlaneComputer>( 15, 8, 13, 15, 100, 100 ) ? 1 : 0;
363  trace.info() << "(" << nbok << "/" << nb
364  << ") checkGenericPlane<Integer,GenericNaivePlaneComputer>( 15, 8, 13, 15, 100, 100 )"
365  << std::endl;
366  trace.endBlock();
367  return nbok == nb;
368 }
369
370 template <typename NaivePlaneComputer>
371 bool
372 checkManyPlanes( unsigned int diameter,
373  unsigned int nbplanes,
374  unsigned int nbpoints )
375 {
376  unsigned int nbok = 0;
377  unsigned int nb = 0;
378  typedef typename NaivePlaneComputer::InternalInteger Integer;
379  stringstream ss (stringstream::out);
380  ss << "Testing block: Diameter is " << diameter << ". Check " << nbplanes << " planes with " << nbpoints << " points each.";
381  trace.beginBlock ( ss.str() );
382  ++nb; nbok += checkPlanes<Integer,NaivePlaneComputer>( nbplanes, diameter, nbpoints ) ? 1 : 0;
383  trace.info() << "(" << nbok << "/" << nb
384  << ") checkPlanes<Integer,NaivePlaneComputer>()"
385  << std::endl;
386  trace.endBlock();
387  return nbok == nb;
388 }
389
393 template <typename NaivePlaneComputer>
394 unsigned int maxDiameter( unsigned int min, unsigned int max )
395 {
396  while ( min < max )
397  {
398  unsigned int middle = (min+max)/2;
399  bool ok = checkManyPlanes<NaivePlaneComputer>( middle, 2, 2000 );
400  if ( ok ) min = middle+1;
401  else max = middle;
402  }
403  return min-1;
404 }
405
406 template <typename GenericNaivePlaneComputer>
407 bool
408 checkExtendWithManyPoints( unsigned int diameter,
409  unsigned int nbplanes,
410  unsigned int nbpoints )
411 {
412  unsigned int nbok = 0;
413  unsigned int nb = 0;
414  typedef typename GenericNaivePlaneComputer::InternalInteger Integer;
415  typedef typename GenericNaivePlaneComputer::Point Point;
416  typedef typename Point::Coordinate PointInteger;
418
419  trace.beginBlock( "checkExtendWithManyPoints" );
420  for ( unsigned int j = 0; j < nbplanes; ++j )
421  {
422  Integer a = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
423  Integer b = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
424  Integer c = getRandomInteger<Integer>( (Integer) 1, (Integer) diameter / 2 );
425  Integer d = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
426  GenericNaivePlaneComputer plane;
427  Dimension axis;
428  if ( ( a >= b ) && ( a >= c ) ) axis = 0;
429  else if ( ( b >= a ) && ( b >= c ) ) axis = 1;
430  else axis = 2;
431  plane.init( diameter, 1, 1 );
432
433  std::vector<Point> pts;
434  for ( unsigned int i = 0; i < nbpoints; ++i )
435  {
436  Point p;
437  p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
438  p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
439  p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
440  Integer x = (Integer) p[ 0 ];
441  Integer y = (Integer) p[ 1 ];
442  Integer z = (Integer) p[ 2 ];
443  switch( axis ) {
444  case 0: p[ 0 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - b * y - c * z, a ) ); break;
445  case 1: p[ 1 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - c * z, b ) ); break;
446  case 2: p[ 2 ] = NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - b * y, c ) ); break;
447  }
448  pts.push_back( p );
449  }
450  ++nb; nbok += plane.isExtendable( pts.begin(), pts.end() ); // should be ok
451  trace.info() << "(" << nbok << "/" << nb
452  << ") plane.isExtendable( pts.begin(), pts.end() )"
453  << std::endl;
454  Point & any0 = pts[ getRandomInteger<int>( 0, pts.size() ) ];
455  pts.push_back( any0 + Point(1,0,0) );
456  Point & any1 = pts[ getRandomInteger<int>( 0, pts.size() ) ];
457  pts.push_back( any1 + Point(0,1,0) );
458  Point & any2 = pts[ getRandomInteger<int>( 0, pts.size() ) ];
459  pts.push_back( any2 + Point(0,0,1) );
460  bool check = ! plane.isExtendable( pts.begin(), pts.end() ); // should not be ok
461  ++nb; nbok += check ? 1 : 0;
462  trace.info() << "(" << nbok << "/" << nb
463  << ") ! plane.isExtendable( pts.begin(), pts.end() )"
464  << std::endl;
465  if ( ! check )
466  trace.warning() << plane << " last=" << pts.back() << std::endl
467  << "a=" << a << " b=" << b << " c=" << c << " d=" << d << std::endl;
468  ++nb; nbok += plane.extend( pts.begin(), pts.end() - 3 ); // should be ok
469  trace.info() << "(" << nbok << "/" << nb
470  << ") plane.extend( pts.begin(), pts.end() - 3)"
471  << std::endl;
472  ++nb; nbok += ! plane.extend( pts.end() - 3, pts.end() ); // should not be ok
473  trace.info() << "(" << nbok << "/" << nb
474  << ") ! plane.extend( pts.end() - 3, pts.end() )"
475  << std::endl;
476  }
477  trace.endBlock();
478  return nb == nbok;
479 }
480
482 // Standard services - public :
483
484 int main( int /*argc*/, char** /*argv*/ )
485 {
486  using namespace Z3i;
487
488  // Max diameter is ~20 for int32_t, ~500 for int64_t, any with BigInteger.
489  trace.beginBlock ( "Testing class COBANaivePlaneComputer" );
490  bool res = true
492  && checkManyPlanes<COBANaivePlaneComputer<Z3, DGtal::int32_t> >( 20, 100, 200 )
494  && checkManyPlanes<COBANaivePlaneComputer<Z3, DGtal::BigInteger> >( 10000, 10, 200 )
496
497  trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
498  trace.endBlock();
499  // trace.beginBlock ( "Max diameter for COBANaivePlaneComputer<Z3, int32_t>" );
500  // unsigned int maxd = maxDiameter<COBANaivePlaneComputer<Z3, DGtal::int32_t> >( 10, 1000 );
501  // trace.emphase() << maxd << endl;
502  // trace.endBlock();
503  // trace.beginBlock ( "Max diameter for COBANaivePlaneComputer<Z3, int64_t>" );
504  // unsigned int maxd2 = maxDiameter<COBANaivePlaneComputer<Z3, DGtal::int32_t> >( 100, 100000 );
505  // trace.emphase() << maxd2 << endl;
506  // trace.endBlock();
507  return res ? 0 : 1;
508 }
509 // //
void beginBlock(const std::string &keyword="")
bool checkPlanes(unsigned int nbplanes, int diameter, unsigned int nbtries)
void init(Dimension axis, InternalInteger diameter, InternalInteger widthNumerator=NumberTraits< InternalInteger >::ONE, InternalInteger widthDenominator=NumberTraits< InternalInteger >::ONE)
Aim: A class that recognizes pieces of digital planes of given axis width. When the width is 1,...
bool checkManyPlanes(unsigned int diameter, unsigned int nbplanes, unsigned int nbpoints)
Trace trace
Definition: Common.h:144
COBANaivePlaneComputer< Z3, InternalInteger > NaivePlaneComputer
DGtal::uint32_t Dimension
Definition: Common.h:127
double endBlock()
bool isExtendable(const Point &p) const
Aim: Gathers several functions useful for concept checks.
mpz_class BigInteger
Multi-precision integer with GMP implementation.
Definition: BasicTypes.h:79
bool checkPlane(Integer a, Integer b, Integer c, Integer d, int diameter, unsigned int nbtries)
Aim: Defines the concept describing an object that computes some primitive from input points given gr...
static Integer abs(IntegerParamType a)
unsigned int maxDiameter(unsigned int min, unsigned int max)
Aim: Defines a predicate on a point.
std::ostream & emphase()
bool checkExtendWithManyPoints(unsigned int diameter, unsigned int nbplanes, unsigned int nbpoints)
bool extend(const Point &p)
Aim: The traits class for all models of Cinteger.
Definition: NumberTraits.h:531
Integer getRandomInteger(const Integer &first, const Integer &after_last)
int main(int, char **)
DGtal is the top-level namespace which contains all DGtal functions and types.
MyPointD Point
Definition: testClone2.cpp:383
int max(int a, int b)
std::ostream & warning()
std::ostream & info()
bool checkGenericPlane(Integer a, Integer b, Integer c, Integer d, int diameter, unsigned int nbtries)
DGtal::int64_t InternalInteger
Go to http://www.sgi.com/tech/stl/ForwardContainer.html.
Definition: Boost.dox:110
Integer ceilDiv(IntegerParamType na, IntegerParamType nb) const
bool testCOBANaivePlaneComputer()