DGtal 1.3.0
Searching...
No Matches
testCOBANaivePlaneComputer.cpp
Go to the documentation of this file.
1
31#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
41using namespace std;
42using namespace DGtal;
43using namespace DGtal::concepts;
44
46// Functions for testing class COBANaivePlaneComputer.
48
49template <typename Integer>
50Integer getRandomInteger( const Integer & first, const Integer & after_last )
51{
52 Integer r = (Integer) rand();
53 return ( r % (after_last - first) ) + first;
54}
55
59template <typename Integer, typename NaivePlaneComputer>
60bool
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;
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
156template <typename Integer, typename GenericNaivePlaneComputer>
157bool
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
251template <typename Integer, typename NaivePlaneComputer>
252bool
253checkPlanes( 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
370template <typename NaivePlaneComputer>
371bool
372checkManyPlanes( unsigned int diameter,
373 unsigned int nbplanes,
374 unsigned int nbpoints )
375{
376 unsigned int nbok = 0;
377 unsigned int nb = 0;
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
393template <typename NaivePlaneComputer>
394unsigned 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
406template <typename GenericNaivePlaneComputer>
407bool
408checkExtendWithManyPoints( 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
484int 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// //
Aim: A class that recognizes pieces of digital planes of given axis width. When the width is 1,...
void init(Dimension axis, InternalInteger diameter, InternalInteger widthNumerator=NumberTraits< InternalInteger >::ONE, InternalInteger widthDenominator=NumberTraits< InternalInteger >::ONE)
bool isExtendable(const Point &p) const
bool extend(const Point &p)
Aim: This class gathers several types and methods to make computation with integers.
static Integer abs(IntegerParamType a)
Integer ceilDiv(IntegerParamType na, IntegerParamType nb) const
void beginBlock(const std::string &keyword="")
std::ostream & warning()
std::ostream & emphase()
std::ostream & info()
double endBlock()
Point::Coordinate Integer
COBANaivePlaneComputer< Z3, InternalInteger > NaivePlaneComputer
Aim: Gathers several functions useful for concept checks.
DGtal is the top-level namespace which contains all DGtal functions and types.
DGtal::uint32_t Dimension
Definition: Common.h:137
Trace trace
Definition: Common.h:154
mpz_class BigInteger
Multi-precision integer with GMP implementation.
Definition: BasicTypes.h:79
STL namespace.
Aim: The traits class for all models of Cinteger.
Definition: NumberTraits.h:564
Aim: Defines the concept describing an object that computes some primitive from input points given gr...
Aim: Defines a predicate on a point.
Go to http://www.sgi.com/tech/stl/ForwardContainer.html.
Definition: Boost.dox:110
int max(int a, int b)
int main()
Definition: testBits.cpp:56
unsigned int maxDiameter(unsigned int min, unsigned int max)
bool checkPlane(Integer a, Integer b, Integer c, Integer d, int diameter, unsigned int nbtries)
bool checkPlanes(unsigned int nbplanes, int diameter, unsigned int nbtries)
bool checkGenericPlane(Integer a, Integer b, Integer c, Integer d, int diameter, unsigned int nbtries)
Integer getRandomInteger(const Integer &first, const Integer &after_last)
bool checkExtendWithManyPoints(unsigned int diameter, unsigned int nbplanes, unsigned int nbpoints)
bool testCOBANaivePlaneComputer()
bool checkManyPlanes(unsigned int diameter, unsigned int nbplanes, unsigned int nbpoints)
MyPointD Point
Definition: testClone2.cpp:383