如何将'hermite'曲线转换为贝塞尔曲线?

时间:2011-10-24 19:30:32

标签: c# wpf math xna bezier

正如主题所述:如何将Hermite曲线转换为Bezier曲线?具体来说,我正在寻找一种方法来转换使用Hermite插值的Curve类,使用Windows Presentation Foundation的StreamGeometry或PathGeometry绘制Microsoft XNA Framework。

我遇到了一个类似的问题([在OpenGL中绘制Hermite曲线],答案如下。

[b0] = 1 [ 3  0  0  0] [h0]
[b1]   - [ 3  0  1  0] [h1]
[b2]   3 [ 0  3  0 -1] [v0]
[b3]     [ 0  3  0  0] [v1]

简化为:

b0 = h0
b1 = h0 + v0/3
b2 = h1 - v1/3
b3 = h1

即使有这些信息,我实际上仍然坚持计算控制点。问题是Curve类将TangentIn和TangentOut公开为标量。鉴于多项式的绘制发生在二维空间(时间,值)中,该标量需要被转换为二维向量以便将其应用于该公式。但是我不确定这个转换过程涉及的步骤是什么,但我怀疑我需要应用Hermite微分方程。

如果有帮助,这就是使用Reflector在给定时刻评估曲线的代码。

private static float Hermite(CurveKey k0, CurveKey k1, float t)
{
     if (k0.Continuity == CurveContinuity.Step)
     { 
         if (t >= 1f)
         {
             return k1.internalValue;
         }
         return k0.internalValue;
     }

     float num = t * t;
     float num2 = num * t;
     float internalValue = k0.internalValue;
     float num5 = k1.internalValue;
     float tangentOut = k0.tangentOut;
     float tangentIn = k1.tangentIn;
     return ((((internalValue * (((2f * num2) - (3f * num)) + 1f)) + (num5 * ((-2f * num2) + (3f * num)))) + (tangentOut * ((num2 - (2f * num)) + t))) + (tangentIn * (num2 -  num)));
}

非常感谢任何信息。

1 个答案:

答案 0 :(得分:3)

我从来没有使用过XNA,但是看了一下文档,看起来Curve类对应的是一维Bezier曲线。你引用的转换公式应该可以正常工作:一维贝塞尔曲线中的“坐标”都是标量。

因此,尝试将单个XNA曲线绘制为二维贝塞尔曲线并不合理。曲线时间值对应于贝塞尔曲线参数t,而不是空间轴之一。

正如曲线类文档中所述:“要表示二维或三维的时间路径,您可以定义两个或三个曲线对象,每个对应一个不同的空间轴。”

即。你需要两个Curve对象,一个用于提供x值,另一个用于在特定时间提供y值。