C # - использование сплайновой диаграммы для сопоставления значений

Я пытаюсь использовать объект .Net Chart для интерактивного определения функции сплайна, которую я использую для сопоставления одного диапазона значений с другим. Другими словами, у меня есть диапазон 0-4095 (ось x), который я хочу преобразовать в диапазон 0-100 (ось y) с помощью сплайна. Я успешно создал диаграмму, которая отображает сплайн через группу точек. Пользователь может интерактивно перемещать точки, чтобы получить желаемую функциональную форму. Работает отлично.

Теперь ... когда у меня есть сплайн, который нужен пользователю, как я могу (используя функцию сплайна) найти соответствующее значение y для любого значения x?

Кажется, я не могу найти способ сделать это. Я знаю, что объект диаграммы где-то выполняет вычисления, поскольку он рисует сплайн ... возможно, они не предоставляют к этому доступ.

Альтернатива - самому произвести расчеты сплайнов ... Я не хочу туда идти без крайней необходимости.

Спасибо.

Брайан


person Bryan Greenway    schedule 07.09.2012    source источник


Ответы (1)


Вам нужно найти значение «t» (параметр натяжения), которое дает желаемое значение x. если вы используете диапазон от 0 до 1, значение параметра «t» будет где-то около 0,5. Как только вы знаете t, вы можете вычислить соответствующее значение y. Решите кубическое уравнение, которое сгенерирует 3 значения для «t», что приведет к тому же значению x. Проверьте ссылку ниже.

http://algorithmist.wordpress.com/2009/09/28/cardinal-splines-part-2/

Кардинальные сплайны определяют касательные во внутренних точках на основе вектора от предыдущей точки к последующей. Каждая касательная параллельна этому вектору и кратна его длине. Например, касательное направление в точке P1 параллельно вектору P2 - P0, или мы могли бы просто написать что-то вроде T1 = s (P2 - P0), где s - действительное число.

Проверьте эту часть кода ниже, где xtarget - это входное значение x.

Код:

 for (Double t = 0; t<=1; t += 0.01)
  {
      s = (1 - t) / 2;
P(t)x = s(-t3 + 2t2 – t)P1X + s(-t3 + t2)P2X + (2t3 – 3t2 + 1)P2X + s(t3 – 2t2 + t)P3X + (-2t3 + 3t2)P3X + s(t3 – t2)P4X

P(t)y = s(-t3 + 2t2 – t)P1Y + s(-t3 + t2)P2Y + (2t3 – 3t2 + 1)P2Y + s(t3 – 2t2 + t)P3Y+ (-2t3 + 3t2)P3Y + s(t3 – t2)P4Y

if(P(t)x=>xtarget)
{
return P(t)y;
}
}

Вышеупомянутый метод даст приблизительную точку P (t) y на кривой.

person sharmila    schedule 11.09.2012
comment
Спасибо. Это подход, которого я ожидал ... просто надеялся, что класс диаграммы предоставит что-то, чтобы отменить эти значения для предоставленных сплайнов. - person Bryan Greenway; 13.09.2012