Law*_*Kok 6 c# math wpf 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]
Run Code Online (Sandbox Code Playgroud)
这简化为:
b0 = h0
b1 = h0 + v0/3
b2 = h1 - v1/3
b3 = h1
Run Code Online (Sandbox Code Playgroud)
即使有这些信息,我实际上仍然坚持计算控制点.问题是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)));
}
Run Code Online (Sandbox Code Playgroud)
任何信息都非常感谢.
我从未使用过 XNA,但浏览了文档后,Curve 类似乎对应于一维贝塞尔曲线。您引用的转换公式应该可以正常工作:一维贝塞尔曲线中的“坐标”都是标量。
因此,尝试将单个 XNA 曲线绘制为二维贝塞尔曲线并没有真正的意义。曲线时间值对应于贝塞尔曲线参数 t,而不是空间轴之一。
正如 Curve 类文档中所述:“要表示二维或三维的时间路径,您可以定义两个或三个 Curve 对象,每个对象对应一个不同的空间轴。”
即您需要两个 Curve 对象,一个提供特定时间的 x 值,另一个提供 y 值。
归档时间: |
|
查看次数: |
3197 次 |
最近记录: |