The problem boils down to two tasks:
- Finding the neighbouring points for an x-value
- Interpolating their y-values for the given x-value.
If the x-values are indeed steadily increasing this should solve both:
double interpolatedY(Series s, double xval)
{
DataPoint pPrev = s.Points.Last(x => x.XValue <= xval);
DataPoint pNext = s.Points.First(x => x.XValue >= xval);
if (pPrev == pNext) return pPrev.YValues[0];
return pPrev.YValues[0] + (pNext.YValues[0] - pPrev.YValues[0])
* (xval - pPrev.XValue)/ (pNext.XValue - pPrev.XValue);
}
It uses Linq to find the previous and next datapoint and then uses simple math to find the interpolated value.
Note that most checks are omitted!
Here I have added an identical point series and a third one to add the interpolated values:
To convert between chart pixels and values there are Axis
functions ValueToPixelPosition
and PixelPositionToValue
, btw.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…