1

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

现在......一旦我拥有用户想要的样条,我如何(使用样条函数)找到任何 x 值对应的 y 值?

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

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

谢谢。

布莱恩

4

1 回答 1

1

您需要找到产生所需 x 值的“t”(张力参数)值。如果您使用 0 到 1 的范围,则参数“t”值将接近 0.5。一旦知道 t,就可以计算 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。

于 2012-09-11T05:08:16.263 回答