diff --git a/Intervals.cpp b/Intervals.cpp index 6f8e976..b140235 100644 --- a/Intervals.cpp +++ b/Intervals.cpp @@ -285,3 +285,67 @@ Intervals::GetPrev( double& dMin, double& dMax) const dMax = m_Iter->second ; return true ; } + +//---------------------------------------------------------------------------- +bool +Intervals::IsInside( double dP) const +{ + for ( const auto& Interv : m_vInts) { + if ( dP > Interv.first - m_dToler && dP < Interv.second + m_dToler) + return true ; + } + return false ; +} + +//---------------------------------------------------------------------------- +bool +Intervals::GetPrevNearest( double dP, double& dPrev) const +{ + // se non ci sono intervalli validi + if ( m_vInts.empty()) + return false ; + // se prima dell'inizio + if ( dP < m_vInts.front().first - m_dToler) + return false ; + for ( int i = int( m_vInts.size()) - 1 ; i >= 0 ; -- i) { + // se tra due intervalli validi + if ( dP > m_vInts[i].second + m_dToler) { + dPrev = m_vInts[i].second ; + return true ; + } + // se in un intervallo valido + else if ( dP > m_vInts[i].first - m_dToler) { + dPrev = dP ; + return true ; + } + } + // non trovato + return false ; +} + +//---------------------------------------------------------------------------- +bool +Intervals::GetNextNearest( double dP, double& dNext) const +{ + // se non ci sono intervalli validi + if ( m_vInts.empty()) + return false ; + // se dopo la fine + if ( dP > m_vInts.back().second + m_dToler) + return false ; + // ricerca tra e negli intervalli + for ( int i = 0 ; i < int( m_vInts.size()) ; ++ i) { + // se tra due intervalli validi + if ( dP < m_vInts[i].first - m_dToler) { + dNext = m_vInts[i].first ; + return true ; + } + // se in un intervallo valido + else if ( dP < m_vInts[i].second + m_dToler) { + dNext = dP ; + return true ; + } + } + // non trovato + return false ; +}