33 #include "DGtal/base/Common.h"
34 #include "DGtal/helpers/StdDefs.h"
35 #include "DGtal/kernel/CPointPredicate.h"
36 #include "DGtal/geometry/surfaces/COBANaivePlane.h"
37 #include "DGtal/geometry/surfaces/COBAGenericNaivePlane.h"
41 using namespace DGtal;
47 template <
typename Integer>
48 Integer getRandomInteger(
const Integer & first,
const Integer & after_last )
51 return ( r % (after_last - first) ) + first;
57 template <
typename Integer,
typename NaivePlane>
59 checkPlane( Integer a, Integer b, Integer c, Integer d,
60 int diameter,
unsigned int nbtries )
62 typedef typename NaivePlane::Point
Point;
63 typedef typename Point::Component PointInteger;
70 if ( ( absA >= absB ) && ( absA >= absC ) )
72 else if ( ( absB >= absA ) && ( absB >= absC ) )
78 plane.init( axis, diameter, 1, 1 );
81 unsigned int nbok = 0;
82 while ( nb != nbtries )
84 p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
85 p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
86 p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
95 bool ok_ext = plane.isExtendable( p );
96 bool ok = plane.extend( p );
97 ++nb, nbok += ok_ext ? 1 : 0;
98 ++nb, nbok += ok ? 1 : 0;
101 std::cerr <<
"[ERROR] p=" << p <<
" NOT IN plane=" << plane << std::endl;
106 std::cerr <<
"[ERROR] p=" << p <<
" was NOT extendable IN plane=" << plane << std::endl;
114 while ( nb != (nbtries * 11 ) / 10 )
116 p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
117 p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
118 p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
127 PointInteger tmp = getRandomInteger<PointInteger>( 2, 5 )
128 * (2*getRandomInteger<PointInteger>( 0, 2 ) - 1 );
130 bool ok_ext = ! plane.isExtendable( p );
131 bool ok = ! plane.extend( p );
132 ++nb, nbok += ok ? 1 : 0;
133 ++nb, nbok += ok_ext ? 1 : 0;
136 std::cerr <<
"[ERROR] p=" << p <<
" IN plane=" << plane << std::endl;
141 std::cerr <<
"[ERROR] p=" << p <<
" was extendable IN plane=" << plane << std::endl;
154 template <
typename Integer,
typename GenericNaivePlane>
156 checkGenericPlane( Integer a, Integer b, Integer c, Integer d,
157 int diameter,
unsigned int nbtries )
159 typedef typename GenericNaivePlane::Point Point;
160 typedef typename Point::Component PointInteger;
167 if ( ( absA >= absB ) && ( absA >= absC ) )
169 else if ( ( absB >= absA ) && ( absB >= absC ) )
174 GenericNaivePlane plane;
175 plane.init( diameter, 1, 1 );
178 unsigned int nbok = 0;
179 while ( nb != nbtries )
181 p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
182 p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
183 p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
192 bool ok_ext = plane.isExtendable( p );
193 bool ok = plane.extend( p );
194 ++nb, nbok += ok_ext ? 1 : 0;
195 ++nb, nbok += ok ? 1 : 0;
198 std::cerr <<
"[ERROR] p=" << p <<
" NOT IN plane=" << plane << std::endl;
203 std::cerr <<
"[ERROR] p=" << p <<
" was NOT extendable IN plane=" << plane << std::endl;
211 while ( nb != (nbtries * 11 ) / 10 )
213 p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
214 p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
215 p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
224 PointInteger tmp = getRandomInteger<PointInteger>( 2, 5 )
225 * (2*getRandomInteger<PointInteger>( 0, 2 ) - 1 );
227 bool ok_ext = ! plane.isExtendable( p );
228 bool ok = ! plane.extend( p );
229 ++nb, nbok += ok ? 1 : 0;
230 ++nb, nbok += ok_ext ? 1 : 0;
233 std::cerr <<
"[ERROR] p=" << p <<
" IN plane=" << plane << std::endl;
238 std::cerr <<
"[ERROR] p=" << p <<
" was extendable IN plane=" << plane << std::endl;
244 std::cerr <<
"plane = " << plane << std::endl;
249 template <
typename Integer,
typename NaivePlane>
251 checkPlanes(
unsigned int nbplanes,
int diameter,
unsigned int nbtries )
256 unsigned int nbok = 0;
257 for (
unsigned int nbp = 0; nbp < nbplanes; ++nbp )
259 Integer a = getRandomInteger<Integer>( (
Integer) 0, (Integer) diameter / 2 );
260 Integer b = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
261 Integer c = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
262 Integer d = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
263 if ( ( a != 0 ) || ( b != 0 ) || ( c != 0 ) )
265 ++nb, nbok += checkPlane<Integer, NaivePlane>( a, b, c, d, diameter, nbtries ) ? 1 : 0;
268 std::cerr <<
"[ERROR] for plane " << a <<
" * x + "
269 << b <<
" * y + " << c <<
" * z = " << d << std::endl;
281 bool testCOBANaivePlane()
283 unsigned int nbok = 0;
291 BOOST_CONCEPT_ASSERT(( boost::ForwardContainer< NaivePlane > ));
293 BOOST_CONCEPT_ASSERT(( boost::ForwardContainer< GenericNaivePlane > ));
297 Point pt0( 0, 0, 0 );
298 plane.init( 2, 100, 3, 2 );
299 bool pt0_inside = plane.extend( pt0 );
300 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Plane=" << plane
302 Point pt1( Point( 8, 1, 3 ) );
303 bool pt1_inside = plane.extend( pt1 );
304 ++nb, nbok += pt1_inside ==
true ? 1 : 0;
305 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") add " << pt1
306 <<
" Plane=" << plane << std::endl;
307 Point pt2( Point( 2, 7, 1 ) );
308 bool pt2_inside = plane.extend( pt2 );
309 ++nb, nbok += pt2_inside ==
true ? 1 : 0;
310 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") add " << pt2
311 <<
" Plane=" << plane << std::endl;
313 Point pt3( Point( 0, 5, 17 ) );
314 bool pt3_inside = plane.extend( pt3 );
315 ++nb, nbok += pt3_inside ==
false ? 1 : 0;
316 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") add " << pt3
317 <<
" Plane=" << plane << std::endl;
319 Point pt4( Point( -10, -10, 10 ) );
320 bool pt4_inside = plane.extend( pt4 );
321 ++nb, nbok += pt4_inside ==
false ? 1 : 0;
322 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") add " << pt4
323 <<
" Plane=" << plane << std::endl;
325 Point pt5 = pt0 + pt1 + pt2 + Point( 0, 0, 2 );
326 bool pt5_inside = plane.extend( pt5 );
327 ++nb, nbok += pt5_inside ==
true ? 1 : 0;
328 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") add " << pt5
329 <<
" Plane=" << plane << std::endl;
332 plane2.init( 2, 100, 1, 1 );
333 plane2.extend( Point( 10, 0, 0 ) );
334 plane2.extend( Point( 0, 8, 0 ) );
335 plane2.extend( Point( 0, 0, 6 ) );
336 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") "
337 <<
" Plane2=" << plane2 << std::endl;
339 ++nb, nbok += checkPlane<Integer,NaivePlane>( 11, 5, 19, 20, 100, 100 ) ? 1 : 0;
341 <<
") checkPlane<Integer,NaivePlane>( 11, 5, 19, 20, 100, 100 )"
344 ++nb, nbok += checkGenericPlane<Integer,GenericNaivePlane>( 11, 5, 19, 20, 100, 100 ) ? 1 : 0;
346 <<
") checkGenericPlane<Integer,GenericNaivePlane>( 11, 5, 19, 20, 100, 100 )"
348 ++nb, nbok += checkGenericPlane<Integer,GenericNaivePlane>( 17, 33, 7, 10, 100, 100 ) ? 1 : 0;
350 <<
") checkGenericPlane<Integer,GenericNaivePlane>( 17, 33, 7, 10, 100, 100 )"
352 ++nb, nbok += checkPlane<Integer,NaivePlane>( 15, 8, 13, 15, 100, 100 ) ? 1 : 0;
354 <<
") checkPlane<Integer,NaivePlane>( 15, 8, 13, 15, 100, 100 )"
356 ++nb, nbok += checkGenericPlane<Integer,GenericNaivePlane>( 15, 8, 13, 15, 100, 100 ) ? 1 : 0;
358 <<
") checkGenericPlane<Integer,GenericNaivePlane>( 15, 8, 13, 15, 100, 100 )"
364 template <
typename NaivePlane>
366 checkManyPlanes(
unsigned int diameter,
367 unsigned int nbplanes,
368 unsigned int nbpoints )
370 unsigned int nbok = 0;
372 typedef typename NaivePlane::InternalInteger
Integer;
373 stringstream ss (stringstream::out);
374 ss <<
"Testing block: Diameter is " << diameter <<
". Check " << nbplanes <<
" planes with " << nbpoints <<
" points each.";
376 ++nb, nbok += checkPlanes<Integer,NaivePlane>( nbplanes, diameter, nbpoints ) ? 1 : 0;
378 <<
") checkPlanes<Integer,NaivePlane>()"
387 template <
typename NaivePlane>
388 unsigned int maxDiameter(
unsigned int min,
unsigned int max )
392 unsigned int middle = (min+max)/2;
393 bool ok = checkManyPlanes<NaivePlane>( middle, 2, 2000 );
394 if ( ok ) min = middle+1;
402 int main(
int ,
char** )
408 && testCOBANaivePlane()
409 && checkManyPlanes<COBANaivePlane<Z3, DGtal::int32_t> >( 20, 100, 200 )
411 && checkManyPlanes<COBANaivePlane<Z3, DGtal::BigInteger> >( 10000, 10, 200 );
412 trace.
emphase() << ( res ?
"Passed." :
"Error." ) << endl;