gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:51:41 25 4
gpt4 key购买 nike

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

我遇到过类似的问题([Drawing Hermite curves in OpenGL),答案如下。

[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)));
}

非常感谢任何信息。

最佳答案

我从未使用过 XNA,但浏览了文档后发现 Curve 类似乎对应于一维贝塞尔曲线。您引用的转换公式应该可以正常工作:一维贝塞尔曲线中的“坐标”都是标量。

因此,尝试将单个 XNA 曲线绘制为二维贝塞尔曲线实际上没有任何意义。曲线时间值对应于贝塞尔曲线参数 t,而不是空间轴之一。

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

即您需要两个 Curve 对象,一个提供特定时间的 x 值,一个提供 y 值。

关于c# - 如何将 'hermite' 曲线转换为贝塞尔曲线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7880884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com