+// Given an x value, linearly interpolate the y value from the table
+double SGInterpTable::interpolate(double x) const
+{
+ // Empty table??
+ if (_table.empty())
+ return 0;
+
+ // Find the table bounds for the requested input.
+ Table::const_iterator upBoundIt = _table.upper_bound(x);
+ // points to a value outside the map. That is we are out of range.
+ // use the last entry
+ if (upBoundIt == _table.end())
+ return _table.rbegin()->second;
+
+ // points to the first key must be lower
+ // use the first entry
+ if (upBoundIt == _table.begin())
+ return upBoundIt->second;
+
+ // we know that we do not stand at the beginning, so it is safe to do so
+ Table::const_iterator loBoundIt = upBoundIt;
+ --loBoundIt;
+
+ // Just do linear interpolation.
+ double loBound = loBoundIt->first;
+ double upBound = upBoundIt->first;
+ double loVal = loBoundIt->second;
+ double upVal = upBoundIt->second;
+
+ // division by zero should not happen since the std::map
+ // has sorted out duplicate entries before. Also since we have a
+ // map, we know that we get different first values for different iterators
+ return loVal + (upVal - loVal)*(x - loBound)/(upBound - loBound);