41 template <
typename TConstIterator>
45 myCircle(), myFlagIsInit(
false)
49 template <
typename TConstIterator>
52 :myBegin(other.myBegin), myEnd(other.myEnd), mySegPtr(other.mySegPtr),
53 myCircle(other.myCircle), myFlagIsInit(other.myFlagIsInit)
57 template <
typename TConstIterator>
73 template <
typename TConstIterator>
79 template <
typename TConstIterator>
90 while ( ( ( first1 != myEnd )
91 ||( first2 != other.
myEnd ) )
94 Pair pair1( *first1 );
95 Pair pair2( *first2 );
96 if ( (pair1.first != pair2.first)||(pair1.second != pair2.second) ) flag1 =
false;
99 if ( (first1 != myEnd) || (first2 != other.
myEnd) ) flag1 =
false;
103 std::reverse_iterator<ConstIterator> rfirst1(myEnd);
105 while ( ( ( rfirst1 != std::reverse_iterator<ConstIterator>(myBegin) )
106 ||( first2 != other.
myEnd ) )
109 Pair pair1( *rfirst1 );
110 Pair pair2( *first2 );
111 if ( (pair1.first != pair2.first)||(pair1.second != pair2.second) ) flag2 =
false;
114 if ( (rfirst1 != std::reverse_iterator<ConstIterator>(myBegin))
115 || (first2 != other.
myEnd) ) flag2 =
false;
118 return ( flag1 || flag2 );
122 return ( (!isValid()) && (!other.
isValid()) );
126 template <
typename TConstIterator>
131 return !(*
this == other);
134 template <
typename TConstIterator>
143 template <
typename TConstIterator>
156 template <
typename TConstIterator>
161 if ( mySegPtr.get() != 0 )
171 template <
typename TConstIterator>
179 template <
typename TConstIterator>
187 template <
typename TConstIterator>
192 return !myFlagIsInit;
195 template <
typename TConstIterator>
203 template <
typename TConstIterator>
214 template <
typename TConstIterator>
215 template <
typename TIterator>
219 const TIterator& itb,
const TIterator& ite,
223 ASSERT( itb != ite );
225 Pair currentPair( *it );
230 thePreimage( currentPair.first, currentPair.second, aCircle );
237 if ( thePreimage.
addFront(currentPair.first, currentPair.second) )
240 while ( (it != ite)&&(isOK) )
243 isOK = thePreimage.
addFront(currentPair.first, currentPair.second);
247 else if ( thePreimage.
addBack(currentPair.first, currentPair.second) )
250 while ( (it != ite)&&(isOK) )
253 isOK = thePreimage.
addBack(currentPair.first, currentPair.second);
262 Pf = thePreimage.
getUf();
263 Pl = thePreimage.
getUl();
264 Qf = thePreimage.
getLf();
265 Ql = thePreimage.
getLl();
270 template <
typename TConstIterator>
275 myFlagIsInit =
false;
283 mySegPtr->
init( anIt );
287 myCircle =
Circle(aPair.first, aPair.first, aPair.first);
290 template <
typename TConstIterator>
295 ASSERT( mySegPtr.get() != 0 );
296 Pair aPair( *myEnd );
297 Point aP( aPair.first );
298 Point aQ( aPair.second );
308 if ( p1(aP)&&p2(aQ) )
314 Point Pf, Pl, Qf, Ql;
315 if (isCircularlySeparable(myBegin,myEnd,aP,Pf,Pl,Qf,Ql))
320 Point Pf, Pl, Qf, Ql;
321 if (isCircularlySeparable(myBegin,myEnd,aQ,Pf,Pl,Qf,Ql))
324 else ASSERT(
false && (
"DGtal::GeometricalDCA<TConstIterator>::isExtendableForward(): impossible case") );
330 if ( mySegPtr->extendForward() ) isOK =
true;
333 Point Pf, Pl, Qf, Ql;
334 if (mySegPtr->isConvex())
336 if (isCircularlySeparable(myBegin,myEnd,aQ,Pf,Pl,Qf,Ql))
339 else if (mySegPtr->isConcave())
341 if (isCircularlySeparable(myBegin,myEnd,aP,Pf,Pl,Qf,Ql))
344 else ASSERT(
false && (
"DGtal::GeometricalDCA<TConstIterator>::isExtendableForward(): impossible case") );
351 template <
typename TConstIterator>
356 ASSERT( mySegPtr.get() != 0 );
357 Pair aPair( *myEnd );
358 Point aP( aPair.first );
359 Point aQ( aPair.second );
369 if ( p1(aP)&&p2(aQ) )
375 Point Pf, Pl, Qf, Ql;
376 if (isCircularlySeparable(myBegin,myEnd,aP,Pf,Pl,Qf,Ql))
378 myCircle.init(Pf,Ql,aP);
384 Point Pf, Pl, Qf, Ql;
385 if (isCircularlySeparable(myBegin,myEnd,aQ,Pf,Pl,Qf,Ql))
387 myCircle.init(Qf,Pl,aQ);
391 else ASSERT(
false && (
"DGtal::GeometricalDCA<TConstIterator>::extendForward(): impossible case") );
397 if ( mySegPtr->extendForward() ) isOK =
true;
400 Point Pf, Pl, Qf, Ql;
401 if (mySegPtr->isConvex())
404 if (isCircularlySeparable(myBegin,myEnd,aQ,Pf,Pl,Qf,Ql))
406 myCircle.init(Qf,Pl,aQ);
411 else if (mySegPtr->isConcave())
414 if (isCircularlySeparable(myBegin,myEnd,aP,Pf,Pl,Qf,Ql))
416 myCircle.init(Pf,Ql,aP);
421 else ASSERT(
false && (
"DGtal::GeometricalDCA<TConstIterator>::extendForward(): impossible case") );
432 template <
typename TConstIterator>
437 ASSERT( mySegPtr.get() != 0 );
441 Point aP( aPair.first );
442 Point aQ( aPair.second );
452 if ( p1(aP)&&p2(aQ) )
458 Point Pf, Pl, Qf, Ql;
459 std::reverse_iterator<ConstIterator> ritb(myEnd);
460 std::reverse_iterator<ConstIterator> rite(myBegin);
461 if (isCircularlySeparable(ritb,rite,aP,Pf,Pl,Qf,Ql))
466 Point Pf, Pl, Qf, Ql;
467 std::reverse_iterator<ConstIterator> ritb(myEnd);
468 std::reverse_iterator<ConstIterator> rite(myBegin);
469 if (isCircularlySeparable(ritb,rite,aQ,Pf,Pl,Qf,Ql))
472 else ASSERT(
false && (
"DGtal::GeometricalDCA<TConstIterator>::extendBackward(): impossible case") );
478 if ( mySegPtr->extendBackward() ) isOK =
true;
481 Point Pf, Pl, Qf, Ql;
482 std::reverse_iterator<ConstIterator> ritb(myEnd);
483 std::reverse_iterator<ConstIterator> rite(myBegin);
484 if (mySegPtr->isOppositeEndConvex())
486 if (isCircularlySeparable(ritb,rite,aQ,Pf,Pl,Qf,Ql))
489 else if (mySegPtr->isOppositeEndConcave())
491 if (isCircularlySeparable(ritb,rite,aP,Pf,Pl,Qf,Ql))
494 else ASSERT(
false && (
"DGtal::GeometricalDCA<TConstIterator>::extendBackward(): impossible case") );
501 template <
typename TConstIterator>
506 ASSERT( mySegPtr.get() != 0 );
510 Point aP( aPair.first );
511 Point aQ( aPair.second );
521 if ( p1(aP)&&p2(aQ) )
527 Point Pf, Pl, Qf, Ql;
528 std::reverse_iterator<ConstIterator> ritb(myEnd);
529 std::reverse_iterator<ConstIterator> rite(myBegin);
530 if (isCircularlySeparable(ritb,rite,aP,Pf,Pl,Qf,Ql))
532 myCircle.init(aP,Pf,Ql);
538 Point Pf, Pl, Qf, Ql;
539 std::reverse_iterator<ConstIterator> ritb(myEnd);
540 std::reverse_iterator<ConstIterator> rite(myBegin);
541 if (isCircularlySeparable(ritb,rite,aQ,Pf,Pl,Qf,Ql))
543 myCircle.init(aQ,Qf,Pl);
547 else ASSERT(
false && (
"DGtal::GeometricalDCA<TConstIterator>::extendBackward(): impossible case") );
553 if ( mySegPtr->extendBackward() ) isOK =
true;
556 Point Pf, Pl, Qf, Ql;
557 std::reverse_iterator<ConstIterator> ritb(myEnd);
558 std::reverse_iterator<ConstIterator> rite(myBegin);
559 if (mySegPtr->isOppositeEndConvex())
562 if (isCircularlySeparable(ritb,rite,aQ,Pf,Pl,Qf,Ql))
564 myCircle.init(aQ,Qf,Pl);
569 else if (mySegPtr->isOppositeEndConcave())
572 if (isCircularlySeparable(ritb,rite,aP,Pf,Pl,Qf,Ql))
574 myCircle.init(aP,Pf,Ql);
579 else ASSERT(
false && (
"DGtal::GeometricalDCA<TConstIterator>::extendBackward(): impossible case") );
593 template <
typename TConstIterator>
599 out <<
"[GeometricalDCA]" << std::endl;
602 Pair firstPair( *myBegin );
603 out <<
"\t From " << firstPair.first << firstPair.second << std::endl;
606 Pair lastPair( *it );
607 out <<
"\t To " << lastPair.first << lastPair.second << std::endl;
609 out << myCircle << std::endl;
611 out <<
"infinite radius" << std::endl;
615 out <<
"\t not valid" << std::endl;
617 out <<
"[end of GeometricalDCA]" << std::endl;
620 template <
typename TConstIterator>
625 return "GeometricalDCA";
632 template <
typename TConstIterator>
638 object.selfDisplay( out );