42 template <
typename TSpace,
typename TInternalInteger>
49 template <
typename TSpace,
typename TInternalInteger>
57 template <
typename TSpace,
typename TInternalInteger>
61 : myAxis( other.myAxis ),
63 myWidth( other.myWidth ),
64 myPointSet( other.myPointSet ),
65 myState( other.myState ),
66 myCst1( other.myCst1 ),
67 myCst2( other.myCst2 )
71 template <
typename TSpace,
typename TInternalInteger>
90 template <
typename TSpace,
typename TInternalInteger>
96 return myState.cip.
ic();
99 template <
typename TSpace,
typename TInternalInteger>
112 computeCentroidAndNormal( myState );
115 template <
typename TSpace,
typename TInternalInteger>
124 myWidth[ 0 ] = widthNumerator;
125 myWidth[ 1 ] = widthDenominator;
127 myG = 2*diameter; myG *= diameter; myG *= diameter;
131 myCst1 = ( ( myG * myWidth[ 0 ] - 1 ) / myWidth[ 1 ] ) + 2;
132 myCst2 = ( ( myG * myWidth[ 0 ] ) / myWidth[ 1 ] ) - 1;
136 template <
typename TSpace,
typename TInternalInteger>
142 return myPointSet.
size();
145 template <
typename TSpace,
typename TInternalInteger>
151 return myPointSet.
empty();
154 template <
typename TSpace,
typename TInternalInteger>
163 template <
typename TSpace,
typename TInternalInteger>
172 template <
typename TSpace,
typename TInternalInteger>
178 return myState.cip.
size();
181 template <
typename TSpace,
typename TInternalInteger>
187 ic().getDotProduct( _v, myState.N, p );
188 return ( _v >= myState.min ) && ( _v <= myState.max );
191 template <
typename TSpace,
typename TInternalInteger>
197 ASSERT( isValid() && ! empty() );
198 bool ok = this->operator()( p );
199 if ( ok ) myPointSet.insert( p );
204 template <
typename TSpace,
typename TInternalInteger>
213 myPointSet.insert( p );
214 ic().getDotProduct( myState.max, myState.N, p );
215 myState.min = myState.max;
216 myState.ptMax = myState.ptMin = p;
221 if ( myPointSet.find( p ) != myPointSet.end() )
224 _state.N = myState.N;
225 _state.min = myState.min;
226 _state.max = myState.max;
227 _state.ptMin = myState.ptMin;
228 _state.ptMax = myState.ptMax;
229 bool changed = updateMinMax( _state, &p, (&p)+1 );
233 myPointSet.insert( p );
237 if ( checkPlaneWidth( _state ) )
239 myState.min = _state.min;
240 myState.max = _state.max;
241 myState.ptMin = _state.ptMin;
242 myState.ptMax = _state.ptMax;
243 myPointSet.insert( p );
247 computeGradient( _grad, _state );
258 _state.cip = myState.cip;
259 doubleCut( _grad, _state );
262 while ( ! _state.cip.empty() )
264 computeCentroidAndNormal( _state );
266 computeMinMax( _state, myPointSet.begin(), myPointSet.end() );
267 updateMinMax( _state, &p, (&p)+1 );
269 if ( checkPlaneWidth( _state ) )
271 myState.min = _state.min;
272 myState.max = _state.max;
273 myState.ptMin = _state.ptMin;
274 myState.ptMax = _state.ptMax;
275 myState.cip.swap( _state.cip );
276 myState.centroid = _state.centroid;
277 myState.N = _state.N;
278 myPointSet.insert( p );
283 computeGradient( _grad, _state );
294 doubleCut( _grad, _state );
300 template <
typename TSpace,
typename TInternalInteger>
307 if ( empty() )
return true;
310 if ( myPointSet.find( p ) != myPointSet.end() )
313 _state.N = myState.N;
314 _state.min = myState.min;
315 _state.max = myState.max;
316 _state.ptMin = myState.ptMin;
317 _state.ptMax = myState.ptMax;
318 bool changed = updateMinMax( _state, (&p), (&p)+1 );
320 if ( ! changed )
return true;
322 if ( checkPlaneWidth( _state ) )
325 computeGradient( _grad, _state );
334 _state.cip = myState.cip;
335 doubleCut( _grad, _state );
338 while ( ! _state.cip.empty() )
340 computeCentroidAndNormal( _state );
342 computeMinMax( _state, myPointSet.begin(), myPointSet.end() );
343 updateMinMax( _state, (&p), (&p)+1 );
345 if ( checkPlaneWidth( _state ) )
350 computeGradient( _grad, _state );
359 doubleCut( _grad, _state );
365 template <
typename TSpace,
typename TInternalInteger>
366 template <
typename TInputIterator>
369 extend( TInputIterator it, TInputIterator itE )
371 BOOST_CONCEPT_ASSERT(( boost::InputIterator<TInputIterator> ));
377 _state.N = myState.N;
381 computeMinMax( _state, it, itE );
385 _state.min = myState.min;
386 _state.max = myState.max;
387 _state.ptMin = myState.ptMin;
388 _state.ptMax = myState.ptMax;
389 changed = updateMinMax( _state, it, itE );
394 for ( TInputIterator tmpIt = it; tmpIt != itE; ++tmpIt )
395 myPointSet.insert( *tmpIt );
399 if ( checkPlaneWidth( _state ) )
401 myState.min = _state.min;
402 myState.max = _state.max;
403 myState.ptMin = _state.ptMin;
404 myState.ptMax = _state.ptMax;
405 for ( TInputIterator tmpIt = it; tmpIt != itE; ++tmpIt )
406 myPointSet.insert( *tmpIt );
410 computeGradient( _grad, _state );
421 _state.cip = myState.cip;
422 doubleCut( _grad, _state );
425 while ( ! _state.cip.empty() )
427 computeCentroidAndNormal( _state );
429 computeMinMax( _state, myPointSet.begin(), myPointSet.end() );
430 updateMinMax( _state, it, itE );
432 if ( checkPlaneWidth( _state ) )
434 myState.min = _state.min;
435 myState.max = _state.max;
436 myState.ptMin = _state.ptMin;
437 myState.ptMax = _state.ptMax;
438 myState.cip.swap( _state.cip );
439 myState.centroid = _state.centroid;
440 myState.N = _state.N;
441 for ( TInputIterator tmpIt = it; tmpIt != itE; ++tmpIt )
442 myPointSet.insert( *tmpIt );
447 computeGradient( _grad, _state );
458 doubleCut( _grad, _state );
464 template <
typename TSpace,
typename TInternalInteger>
465 template <
typename TInputIterator>
470 BOOST_CONCEPT_ASSERT(( boost::InputIterator<TInputIterator> ));
475 _state.N = myState.N;
479 computeMinMax( _state, it, itE );
483 _state.N = myState.N;
484 _state.min = myState.min;
485 _state.max = myState.max;
486 _state.ptMin = myState.ptMin;
487 _state.ptMax = myState.ptMax;
488 changed = updateMinMax( _state, it, itE );
492 if ( ! changed )
return true;
494 if ( checkPlaneWidth( _state ) )
497 computeGradient( _grad, _state );
506 _state.cip = myState.cip;
507 doubleCut( _grad, _state );
510 while ( ! _state.cip.empty() )
512 computeCentroidAndNormal( _state );
514 computeMinMax( _state, myPointSet.begin(), myPointSet.end() );
515 updateMinMax( _state, it, itE );
517 if ( checkPlaneWidth( _state ) )
522 computeGradient( _grad, _state );
531 doubleCut( _grad, _state );
539 template <
typename TSpace,
typename TInternalInteger>
540 template <
typename Vector3D>
566 template <
typename TSpace,
typename TInternalInteger>
567 template <
typename Vector3D>
574 double l = sqrt( normal[ 0 ] * normal[ 0 ]
575 + normal[ 1 ] * normal[ 1 ]
576 + normal[ 2 ] * normal[ 2 ] );
582 template <
typename TSpace,
typename TInternalInteger>
591 double l = sqrt( nx*nx + ny*ny + nz*nz );
596 template <
typename TSpace,
typename TInternalInteger>
602 ASSERT( ! this->empty() );
603 return *(myState.indMin);
606 template <
typename TSpace,
typename TInternalInteger>
612 ASSERT( ! this->empty() );
613 return *(myState.indMax);
625 template <
typename TSpace,
typename TInternalInteger>
632 out <<
"[COBANaivePlane"
633 <<
" axis=" << myAxis <<
" w=" << myWidth[ 0 ] <<
"/" << myWidth[ 1 ]
634 <<
" size=" << size() <<
" complexity=" << complexity() <<
" N=" << myState.N <<
": ";
635 this->getUnitNormal( N );
636 this->getBounds( min, max );
638 << N[ 0 ] <<
" * x + "
639 << N[ 1 ] <<
" * y + "
641 <<
" <= " << max <<
" ]";
648 template <
typename TSpace,
typename TInternalInteger>
661 template <
typename TSpace,
typename TInternalInteger>
672 state.
N[ 0 ] = state.
centroid[ 2 ] * myG;
678 state.
N[ 1 ] = state.
centroid[ 2 ] * myG;
684 state.
N[ 2 ] = state.
centroid[ 2 ] * myG;
690 template <
typename TSpace,
typename TInternalInteger>
699 _v = myG * ( state.
ptMin[ myAxis ]
700 - state.
ptMax[ myAxis ] );
708 template <
typename TSpace,
typename TInternalInteger>
709 template <
typename TInputIterator>
714 BOOST_CONCEPT_ASSERT(( boost::InputIterator<TInputIterator> ));
716 ASSERT( itB != itE );
717 ic().getDotProduct( state.
min, state.
N, *itB );
722 for ( ; itB != itE; ++itB )
724 ic().getDotProduct( _v, state.
N, *itB );
725 if ( _v > state.
max )
730 else if ( _v < state.
min )
738 template <
typename TSpace,
typename TInternalInteger>
739 template <
typename TInputIterator>
745 BOOST_CONCEPT_ASSERT(( boost::InputIterator<TInputIterator> ));
747 bool changed =
false;
749 for ( ; itB != itE; ++itB )
751 ic().getDotProduct( _v, state.
N, *itB );
752 if ( _v > state.
max )
758 else if ( _v < state.
min )
768 template <
typename TSpace,
typename TInternalInteger>
773 _v = ic().abs( state.
N[ myAxis ] );
774 return ( ( state.
max - state.
min )
775 < ( _v * myWidth[ 0 ] / myWidth[ 1 ] ) );
778 template <
typename TSpace,
typename TInternalInteger>
786 grad[ 0 ] = state.
ptMin[ 1 ] - state.
ptMax[ 1 ];
787 grad[ 1 ] = state.
ptMin[ 2 ] - state.
ptMax[ 2 ];
790 grad[ 0 ] = state.
ptMin[ 0 ] - state.
ptMax[ 0 ];
791 grad[ 1 ] = state.
ptMin[ 2 ] - state.
ptMax[ 2 ];
794 grad[ 0 ] = state.
ptMin[ 0 ] - state.
ptMax[ 0 ];
795 grad[ 1 ] = state.
ptMin[ 1 ] - state.
ptMax[ 1 ];
804 template <
typename TSpace,
typename TInternalInteger>
810 object.selfDisplay( out );