получите значение диаграммы в точке

#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 , кстати.