C# - 使用样条图来映射值

时间:2012-09-07 15:47:20

标签: c# charts spline

我正在尝试使用.Net Chart对象以交互方式定义样条函数,该函数用于从一个值范围映射到另一个值。换句话说,我有一个0-4095范围(x轴),我想使用样条曲线转换为0-100范围(y轴)。我已成功设置了一个图表,通过一组点绘制样条曲线。用户可以交互式地移动点以获得期望的功能形状。效果很好。

现在......一旦我有了用户想要的样条曲线,我怎么能(使用样条函数)找到任何x值的相应y值?

我似乎无法找到办法。我知道图表对象正在某处进行计算,因为它正在绘制样条曲线......也许它们不提供对它的访问。

另一种方法是自己进行样条计算......除非绝对必要,否则我不想去那里。

感谢。

布赖恩

1 个答案:

答案 0 :(得分:1)

您需要找到产生所需x值的“t”(张力参数)的值。如果您使用的范围为0到1,则参数“t”值将接近0.5。一旦你知道你就可以计算y的相应值。求解一个三次方程式,它将为“t”生成3个值,这将导致相同的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。