首页 文章

Bezier曲线弧长参数化

提问于
浏览
2

我正在学习贝塞尔曲线,并希望使用估计方法参数化距离方程 . 到目前为止,我的代码似乎适用于单点(EG Bezier(start=0, mid=1, end=5, nPoints=6) 产生 [0 1 2 3 4 5] ) . 但是,当我尝试将其应用于多维曲线时,我的结果并不像预期的那样 .

C#代码(在Unity中执行以实现可视化) . 函数(应该)在曲线上获得一个点(由点 pts 定义),长度为 l % .

Vector3 BezierL(Vector3[] pts, float l)
{
    int i;
    float[] tVals = new float[n];
    Vector3[] points = new Vector3[n];
    float[] cumDist = new float[n];
    for (i = 1; i < n; i++)
    {
        tVals[i] = i / (float)(n - 1);
        points[i] = Bezier(pts, tVals[i]);
        cumDist[i] = cumDist[i - 1] + 
            (points[i] - points[i - 1]).magnitude;
    }
    // Interpolate to estimate t
    float targetLen = l * cumDist[n - 1];
    int ind = Array.BinarySearch(cumDist, targetLen);
    if (ind < 0)
        ind = ~ind;
    float t = Mathf.Lerp(tVals[ind - 1], tVals[ind],
        (targetLen - cumDist[ind - 1]) / (cumDist[ind] - cumDist[ind - 1]));
    return Bezier(pts, t);
}

其中 Bezier(Vector3[] pts, t) 获取 pts 在时间 t 定义的曲线上的一个点 . 无论出于何种原因,这部分起作用的是所有点都是等间隔的,但是一些点在初始点处堆叠而不是沿着曲线分布 .

This是我开发此算法的参考,因此我不确定我的实现是否不正确,或者它是否仅适用于低维曲线 .

提前致谢!

1 回答

  • 0

    Oof多么尴尬,我只是忘了计算第0点!

相关问题