#c# #charts #interpolation #extrapolation
Вопрос:
Например, у меня есть график с 2 точками — 0,0 и 10,10, и тип графика-быстрая линия. Я хочу знать, какое значение Y будет на графике в выбранном значении X.
Например, когда X равно 5, я хочу знать, что Y равно 5.
Мои диаграммы более сложные и имеют массу точек, мне нужно получить значение Y через X.
Как я могу это сделать?
Комментарии:
1. Это на самом деле невозможно, если у вас на самом деле нет одной или нескольких точек при заданном значении x. Все, что вы можете сделать, это попытаться интерполировать значение y с помощью простой математики. Обратите внимание, что линейные диаграммы позволяют перемещаться туда и обратно с помощью линий, поэтому любое значение x может иметь множество значений y, и линия, проходящая через него, может пересекать многие линии диаграммы. — Для интерполяции вам нужно найти две соседние точки и поработать с ними. Математика действительно тривиальна.
2. Я подумал, что если линия уже была рассчитана и нарисована, я могу получить значение Y на X даже без точки там. Я хочу получить значение Y каждой серии по определенному X, чтобы суммировать их позже и создать 1 диаграмму, например, общий баланс.
3. Да, если это действительно просто линия, а не кривая, вы можете вычислить на ней любую точку, как я уже сказал. Но это означает, что вам нужно знать конечные точки этой линии. Оттуда все просто, и если вы знаете, что x-vlu всегда будут двигаться вперед, это совсем не сложно..
Ответ №1:
Проблема сводится к двум задачам:
- Нахождение соседних точек для значения x
- Интерполируя их значения y для заданного значения x.
Если значения x действительно неуклонно растут, это должно решить обе проблемы:
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);
}
Он использует Linq для поиска предыдущей и следующей точек данных, а затем использует простую математику для поиска интерполированного значения.
Обратите внимание, что большинство проверок пропущено!
Здесь я добавил идентичный ряд точек и третий, чтобы добавить интерполированные значения:
Для преобразования между пикселями диаграммы и значениями существуют Axis
функции ValueToPixelPosition
и PixelPositionToValue
, кстати.