如何将'Hermite'曲线转换为Bezier曲线?

6
正如主题所述:如何将Hermite曲线转换为Bezier曲线?具体而言,我正在寻找一种将Microsoft XNA Framework的使用Hermite插值的Curve类转换为使用Windows Presentation Foundation的StreamGeometry或PathGeometry绘制的方法。
我遇到了一个类似的问题([在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个回答

3
我从未使用过XNA,但是浏览了文档后发现Curve类对应于一维的贝塞尔曲线。您提供的转换公式应该可以正常工作:一维贝塞尔曲线中的"坐标"都是标量。
因此,尝试将单个XNA Curve绘制为二维贝塞尔曲线并没有太多意义。Curve时间值对应于贝塞尔参数t,而不是空间轴之一。正如Curve类文档中所说:"为了表示二维或三维中的时间路径,您可以定义两个或三个Curve对象,每个对象对应一个不同的空间轴"。也就是说,您需要两个Curve对象,一个用于在特定时间提供x值,另一个用于提供y值。

@phr34k:我不确定是不是我无意中编辑了您的评论而不是添加新评论,还是您已将其删除。无论如何,您问如何绘制时间与值的图表:使用您所拥有的曲线的值作为y坐标。想象一下您还有另一条曲线,其值仅为时间参数,并将其用于x坐标。现在您有两条曲线,因此有两组位置和切线来参数化您的二维Bezier曲线。 - arx
我认为你误解了实际目标。这不是关于在两个维度中表达曲率,因此我需要像你所说的两个曲线对象。而是要可视化实际的曲率。或者更具体地说,监测应用该曲率的变量随时间如何变异。请参考:http://tinyurl.com/5w3q5mz实现这一点最常见的方法是使用离散采样,即在每个时间点评估值,然后简单地在所有相邻采样之间绘制一条直线。但我更喜欢将多项式本身转换 - Lawrence Kok
是的,抱歉我删除了第一条评论以进行更新。没想到按回车键会自动发布评论。 - Lawrence Kok
就像我之前所说的,如果你创建第二条曲线 x(t)=t,并将第一条曲线作为 y(t),那么得到的贝塞尔曲线将会是第一条曲线随时间变化的值,正如所需。 - arx
@arx 生成的贝塞尔曲线应该是一个控制点数组,即Vector[](x(t0), y(t0))(x(t1), y(t1)),.... 我应该使用什么样的*t0,t1,...*值? - zwcloud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接