43 template <
typename Value>
44 bool absComparator(
const Value& i,
const Value& j)
46 return ( std::abs(static_cast<double>(i)) < std::abs(static_cast<double>(j)) );
50 template <
typename Pair>
51 bool secondAbsComparator(
const Pair& i,
const Pair& j)
53 return absComparator( i.second, j.second );
64 template <
typename TImage,
typename TSet>
67 (
Image& aImg, TSet& aSet): myImgPtr(&aImg), mySetPtr(&aSet)
74 template <
typename TImage,
typename TSet>
84 template <
typename TImage,
typename TSet>
101 template <
typename TImage,
typename TSet>
109 template <
typename TImage,
typename TSet>
118 v.reserve(Point::dimension);
121 Point neighbor1 = aPoint;
122 Point neighbor2 = aPoint;
124 typename Point::Iterator it1 = neighbor1.begin();
125 typename Point::Iterator it2 = neighbor2.begin();
126 typename Point::ConstIterator it = aPoint.begin();
127 typename Point::ConstIterator itEnd = aPoint.end();
128 for ( ; it != itEnd; ++it, ++it1, ++it2)
131 typename Point::Coordinate c = *it;
139 if ( flag1 || flag2 )
141 if ( flag1 && flag2 )
143 if (std::abs(d1) < std::abs(d2))
161 return this->compute(v);
166 template <
typename TImage,
typename TSet>
172 ASSERT(aValueList.size() > 0);
174 if ( aValueList.size() == 1 )
176 Value d = aValueList.back();
177 if (d >= 0)
return d + 1.0;
183 typename Values::iterator itMax =
184 std::max_element( aValueList.begin(), aValueList.end(), absComparator<Value> );
185 if ( gradientNorm( *itMax, aValueList ) > 1 )
187 aValueList.erase( itMax );
188 return this->compute(aValueList);
196 for (
typename Values::iterator it = aValueList.begin();
197 it != aValueList.end(); ++it)
202 b -=
static_cast<double>(2*d);
203 c +=
static_cast<double>(d*d);
207 double disc = b*b - 4*a*c;
211 return static_cast<Value>( ( -b + std::sqrt(disc) ) / (2*a) );
213 return static_cast<Value>( ( -b - std::sqrt(disc) ) / (2*a) );
220 template <
typename TImage,
typename TSet>
227 for (
typename Values::const_iterator it = aValueList.begin();
228 it != aValueList.end(); ++it)
230 Value d = (aValue - *it);
237 template <
typename TImage,
typename TSet>
248 template <
typename TImage,
typename TSet>
251 (
Image& aImg, TSet& aSet): myImgPtr(&aImg), mySetPtr(&aSet)
258 template <
typename TImage,
typename TSet>
268 template <
typename TImage,
typename TSet>
285 template <
typename TImage,
typename TSet>
293 template <
typename TImage,
typename TSet>
302 l.reserve(Point::dimension);
305 Point neighbor1 = aPoint;
306 Point neighbor2 = aPoint;
308 typename Point::Iterator it1 = neighbor1.begin();
309 typename Point::Iterator it2 = neighbor2.begin();
310 typename Point::ConstIterator it = aPoint.begin();
311 typename Point::ConstIterator itEnd = aPoint.end();
312 for ( ; it != itEnd; ++it, ++it1, ++it2)
315 typename Point::Coordinate c = *it;
324 if ( flag1 || flag2 )
333 if ( flag1 && flag2 )
336 if ( flag12 && flag22 )
338 d1 = getValue( d1, d12 );
339 d2 = getValue( d2, d22 );
340 if (std::abs(d1) < std::abs(d2))
349 if (std::abs(d1) < std::abs(d2))
363 d1 = getValue( d1, d12 );
375 d2 = getValue( d2, d22 );
391 return this->compute(l);
396 template <
typename TImage,
typename TSet>
402 ASSERT(aList.size() > 0);
404 if ( aList.size() == 1 )
407 if (pair.second >= 0)
408 return ( (pair.second + 1.0)/(pair.first) );
410 return ( (pair.second - 1.0)/(pair.first) );
418 for (
typename List::iterator it = aList.begin();
419 it != aList.end(); ++it)
421 double coeff = it->first;
422 Value v = it->second;
425 b -= 2 * coeff *
static_cast<double>(v);
426 c +=
static_cast<double>(v*v);
430 double disc = b*b - 4*a*c;
434 return static_cast<Value>( ( -b + std::sqrt(disc) ) / (2*a) );
436 return static_cast<Value>( ( -b - std::sqrt(disc) ) / (2*a) );
441 template <
typename TImage,
typename TSet>
447 return (2.0*aValue1 - aValue2/2.0);
451 template <
typename TImage,
typename TSet>
462 template <
typename TImage,
typename TSet>
465 (
Image& aImg, TSet& aSet): myImgPtr(&aImg), mySetPtr(&aSet)
472 template <
typename TImage,
typename TSet>
482 template <
typename TImage,
typename TSet>
499 template <
typename TImage,
typename TSet>
506 template <
typename TImage,
typename TSet>
515 v.reserve(Point::dimension);
518 Point neighbor1 = aPoint;
519 Point neighbor2 = aPoint;
521 typename Point::Iterator it1 = neighbor1.begin();
522 typename Point::Iterator it2 = neighbor2.begin();
523 typename Point::ConstIterator it = aPoint.begin();
524 typename Point::ConstIterator itEnd = aPoint.end();
525 for ( ; it != itEnd; ++it, ++it1, ++it2)
528 typename Point::Coordinate c = *it;
536 if ( flag1 || flag2 )
538 if ( flag1 && flag2 )
540 if (std::abs(d1) < std::abs(d2))
559 return this->compute(v);
564 template <
typename TImage,
typename TSet>
571 ASSERT(aValueList.size() > 0);
573 if ( aValueList.size() == 1 )
575 Value d = aValueList.back();
582 typename Values::iterator it =
583 std::max_element( aValueList.begin(), aValueList.end(), absComparator<Value> );
589 template <
typename TImage,
typename TSet>
600 template <
typename TImage,
typename TSet>
603 (
Image& aImg, TSet& aSet): myImgPtr(&aImg), mySetPtr(&aSet)
610 template <
typename TImage,
typename TSet>
620 template <
typename TImage,
typename TSet>
637 template <
typename TImage,
typename TSet>
644 template <
typename TImage,
typename TSet>
653 v.reserve(2*Point::dimension);
656 Point neighbor1 = aPoint;
657 Point neighbor2 = aPoint;
659 typename Point::Iterator it1 = neighbor1.begin();
660 typename Point::Iterator it2 = neighbor2.begin();
661 typename Point::ConstIterator it = aPoint.begin();
662 typename Point::ConstIterator itEnd = aPoint.end();
663 for ( ; it != itEnd; ++it, ++it1, ++it2)
666 typename Point::Coordinate c = *it;
674 if (flag1) v.push_back( d1 );
675 if (flag2) v.push_back( d2 );
682 return this->compute(v);
687 template <
typename TImage,
typename TSet>
693 ASSERT(aValueList.size() > 0);
696 typename Values::iterator it =
697 std::min_element( aValueList.begin(), aValueList.end(), absComparator<Value> );
708 template <
typename TImage,
typename TSet>
726 template<
bool complementToOne>
727 struct ValueBetween0And1
729 template<
typename Value>
730 static Value
get(
const Value& v)
732 ASSERT( (v>=0)&&(v<=1) );
738 struct ValueBetween0And1<true>
740 template<
typename Value>
741 static Value
get(
const Value& v)
743 ASSERT( (v>=0)&&(v<=1) );
751 template <
typename TKSpace,
typename TMap,
bool isIndirect>
755 (
const KSpace& aK,
Map& aMap): myKSpace(&aK), myMap(&aMap)
760 template <
typename TKSpace,
typename TMap,
bool isIndirect>
770 template <
typename TKSpace,
typename TMap,
bool isIndirect>
786 template <
typename TKSpace,
typename TMap,
bool isIndirect>
795 template <
typename TKSpace,
typename TMap,
bool isIndirect>
804 v.reserve(Point::dimension);
806 Cell spel = myKSpace->uSpel( aPoint );
807 for (
typename KSpace::DirIterator q = myKSpace->uDirs( spel );
813 Cell surfel1 = myKSpace->uIncident( spel, dir,
true );
814 ASSERT( myKSpace->uDim( surfel1 ) == (KSpace::dimension - 1) );
817 Cell surfel2 = myKSpace->uIncident( spel, dir,
false );
818 ASSERT( myKSpace->uDim( surfel2 ) == (KSpace::dimension - 1) );
822 typename Map::iterator it1 = myMap->find( surfel1 );
823 typename Map::iterator it2 = myMap->find( surfel2 );
824 bool flag1 = ( it1 != myMap->end() );
825 bool flag2 = ( it2 != myMap->end() );
826 if ( flag1 || flag2 )
828 if ( flag1 && flag2 )
830 ASSERT( (it1->second >= 0)&&(it1->second <= 1) );
831 ASSERT( (it2->second >= 0)&&(it2->second <= 1) );
832 if (it1->second < it2->second)
833 d = ValueBetween0And1<isIndirect>
834 ::get( it1->second );
836 d = ValueBetween0And1<isIndirect>
837 ::get( it2->second );
842 ASSERT( (it1->second >= 0)&&(it1->second <= 1) );
843 d = ValueBetween0And1<isIndirect>
844 ::get( it1->second );
848 ASSERT( (it2->second >= 0)&&(it2->second <= 1) );
849 d = ValueBetween0And1<isIndirect>
850 ::get( it2->second );
854 if (d == 0)
return 0;
862 return this->compute(v);
867 template <
typename TKSpace,
typename TMap,
bool isIndirect>
873 ASSERT(aValueList.size() > 0);
875 if ( aValueList.size() == 1 )
877 return aValueList.back();
883 for (
typename Values::iterator it = aValueList.begin();
884 it != aValueList.end(); ++it)
887 a += ( 1.0 /
static_cast<double>( d*d ) );
890 return static_cast<Value>( std::sqrt(a) / a );
895 template <
typename TKSpace,
typename TMap,
bool isIndirect>
906 template <
typename TDistanceImage,
typename TSet,
typename TSpeedFunctor>
910 : myDistImgPtr(&aDistImg), mySetPtr(&aSet), mySpeedFuncPtr(&aSpeedFunc)
912 ASSERT( myDistImgPtr );
914 ASSERT( mySpeedFuncPtr );
918 template <
typename TDistanceImage,
typename TSet,
typename TSpeedFunctor>
924 ASSERT( myDistImgPtr );
926 ASSERT( mySpeedFuncPtr );
930 template <
typename TDistanceImage,
typename TSet,
typename TSpeedFunctor>
941 ASSERT( myDistImgPtr );
943 ASSERT( mySpeedFuncPtr );
949 template <
typename TDistanceImage,
typename TSet,
typename TSpeedFunctor>
957 template <
typename TDistanceImage,
typename TSet,
typename TSpeedFunctor>
960 DGtal::SpeedExtrapolator<TDistanceImage,TSet,TSpeedFunctor>::operator()
968 Point neighbor1 = aPoint;
969 Point neighbor2 = aPoint;
971 typename Point::Iterator it1 = neighbor1.begin();
972 typename Point::Iterator it2 = neighbor2.begin();
973 typename Point::ConstIterator it = aPoint.begin();
974 typename Point::ConstIterator itEnd = aPoint.end();
975 for ( ; it != itEnd; ++it, ++it1, ++it2)
978 typename Point::Coordinate c = *it;
992 bool flag1 =
findAndGetValue( *myDistImgPtr, *mySetPtr, neighbor1, d1 );
993 bool flag2 =
findAndGetValue( *myDistImgPtr, *mySetPtr, neighbor2, d2 );
994 if ( flag1 || flag2 )
996 if ( flag1 && flag2 )
998 if (std::abs(d1) < std::abs(d2))
1001 s = (*mySpeedFuncPtr)( neighbor1 );
1006 s = (*mySpeedFuncPtr)( neighbor2 );
1013 s = (*mySpeedFuncPtr)( neighbor1 );
1018 s = (*mySpeedFuncPtr)( neighbor2 );
1023 num += ( s * diff );