c# - 贝塞尔曲线弧长参数化

标签 c# bezier

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

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

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是我开发这个算法的引用,所以我不确定我的实现是否不正确,或者它是否只适用于低维曲线。

提前致谢!

最佳答案

真尴尬,我忘了计算第 0 个点!

关于c# - 贝塞尔曲线弧长参数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51006377/

相关文章:

iOS : Animate transformation from a line to a bezier curve

c# - 如何使用 Dapper-dot-net 从单个 SP 映射多个记录

javascript - 我可以从全贝塞尔曲线制作半贝塞尔曲线吗?

c# - LINQ FirstOrDefault 与谓词,如果没有找到只是 FirstOrDefault

c# - LINQ:不同值和合并值

javascript - 寻找三次贝塞尔曲线控制点的算法(实现细节)

swift - 从贝塞尔路径计算点

javascript - 给定 x 立方贝塞尔曲线的 y 坐标

c# - 如何用twain/emgu/open cv达到好的清晰度?

c# - 在多线程上下文中使用超时监视文件锁释放