如何在C#Unity中绘制四点b样条三次曲线

如何在C#Unity中绘制四点b样条三次曲线,c#,bezier,bspline,C#,Bezier,Bspline,我需要计算一个四点三次非均匀B样条(p0,p1,p2,p3),它插值p0和p3 直到现在,我才能够让函数计算曲线,但我不知道如何在点p0和p3处添加多重性来进行插值。到目前为止创建的代码如下所示 private Vector2 CalculaB_Spline(float t, Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3) { //(t)=0×B0(u−2)−1×B1(u−2)+1×B2(u−2)+2×B3(u−2) float t

我需要计算一个四点三次非均匀B样条(p0,p1,p2,p3),它插值p0和p3

直到现在,我才能够让函数计算曲线,但我不知道如何在点p0和p3处添加多重性来进行插值。到目前为止创建的代码如下所示

private Vector2 CalculaB_Spline(float t, Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3)
{
    //(t)=0×B0(u−2)−1×B1(u−2)+1×B2(u−2)+2×B3(u−2)
    float tt = t * t;
    float ttt = t * t * t;
    float u = 1 - t;
    float uuu = u * u * u;
    float q3 = uuu;
    float q2 = 3f * ttt - 6f * tt + 4f;
    float q1 =-3f * ttt + 3f * tt + 3f * t + 1f;
    float q0 = ttt;
    Vector2 p = (p0 * q3 + 
    p1 * q2 +
    p2 * q1 +
    p3 * q0) ;
    p /= 6;
    return p;
}

我希望能够使用此函数通过连接5级Bezier曲线来实现C2连续性。

我不确定B样条曲线应该具有什么节点向量,以及如何获得
q0
q3

我建议使用三次Bezier曲线(这是非均匀B样条的特例,在您的情况下应该足够了)。它插值
p0
p3
;稍后,您可以根据C2连续性条件选择
p1
p2

试着将函数的变化保持在最小,在纸上乘以,然后让我得出以下结论

private Vector2 evalBezier(float t, Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3)
{
    float tt = t * t;
    float ttt = t * t * t;
    float u = 1 - t;
    float uuu = u * u * u;
    float q3 = uuu;
    // q1 and q2 changed:
    float q2 = 3f * ttt - 6f * tt + 3f * t;
    float q1 =-3f * ttt + 3f * tt;
    float q0 = ttt;
    Vector2 p = (p0 * q3 + 
    p1 * q2 +
    p2 * q1 +
    p3 * q0) ;
    // No division by 6.
    return p;
}
然而,与以单项式为基础计算Bezier曲线(如您所做的)不同,使用它通常更稳定。如果你想了解更多关于贝塞尔曲线和B样条曲线的知识,我可以举个例子