Qt 贝塞尔样条求值正确性

Qt 贝塞尔样条求值正确性,qt,math,evaluation,bezier,spline,Qt,Math,Evaluation,Bezier,Spline,在任意点计算样条曲线的最佳/最正确方法是什么 我已经绘制了我的评估结果,并将它们与使用UI库得到的结果进行了比较,发现我的结果不正确 我用三次公式计算曲线的中心段,用二次公式计算曲线的第一段和最后一段 我认为我出现这个问题的原因是,在计算过程中,X坐标发生了变化(移位),而我目前在恒定阶跃坐标下对其进行计算,这导致输入X和输出X之间存在一些差异(我目前忽略了这一点) 如果需要,我可以提供代码。(我使用Qt作为一种检查正确性的方法,以防它有所帮助)结果证明它是数学和编程的结合 从那以后,我扩展了

在任意点计算样条曲线的最佳/最正确方法是什么

我已经绘制了我的评估结果,并将它们与使用UI库得到的结果进行了比较,发现我的结果不正确

我用三次公式计算曲线的中心段,用二次公式计算曲线的第一段和最后一段


我认为我出现这个问题的原因是,在计算过程中,X坐标发生了变化(移位),而我目前在恒定阶跃坐标下对其进行计算,这导致输入X和输出X之间存在一些差异(我目前忽略了这一点)


如果需要,我可以提供代码。(我使用Qt作为一种检查正确性的方法,以防它有所帮助)

结果证明它是数学和编程的结合

从那以后,我扩展了对我正在实施的特定类型曲线的了解,现在我可以更好地解释我试图实现的目标以及我的问题所在。对于由此造成的任何混乱,我深表歉意

我正在实现一个FCurve,需要能够在任意输入值下“评估”它。FCurve是表示函数的样条曲线(即对于任何给定的输入,它们返回一个唯一的输出)

在评估旧样条线实现时,我得到了错误的评估结果,因为我的评估代码没有考虑曲线弧长,除了FCurve稍微有点限制之外

我目前用于获得精确评估值的方法是,用一组“段样本”填充沿段的不同“t”,然后迭代以找到最接近的匹配项,并在它们之间进行线性插值。稍后我将返回到它,并试图找到一种聪明的方法,以获得在最小误差下评估片段所需的样本数量,但目前这非常有效

所有这些都是因为当应用上述公式(立方贝塞尔)时,从输入“x”和“t”得到不同的“x”值是相当常见的

下面是我在评估它时得到的一段代码:

    const uint32_t sampleCount = 20;
    Vec2 samples[sampleCount];
    fillSegmentSamples(x, &samples[0], sampleCount);

    uint32_t best = 0;
    for(uint32_t i = 0; i < sampleCount; i++)
    {
        if(samples[i].x > x)
            break;

        best = i;
    }

    uint32_t nxt = best + 1;
    if(nxt >= sampleCount)
    {
        best--;
        nxt--;
    }

    float t = (x - samples[best].x) / (samples[nxt].x - samples[best].x);

    y = lerp(samples[best].y, samples[nxt].y, t);
以下两个问题/答案帮助我了解出了什么问题:

他们并没有特别关注fcurves,但弧长给了我一个提示来解决这个问题


干杯

“我有这个问题的原因”什么问题??//“如果需要,我可以提供代码”当然需要“我使用Qt作为检查的一种方式…”只有Qt?基本语言是什么?@DYangu谢谢你的回答。这实际上是一个数学问题,而不是编程问题,这就是为什么我没有包括代码,也没有指定语言的原因。不过,我非常乐意提供它。我现在已经证实,问题来自于对曲线进行“恒定阶跃评估”,而不考虑曲线的导数。如果我考虑到弧长,它可能会起作用,但不能完全解决如何做到这一点。如果我这样做,我会更新帖子。干杯。是的,请。提供一些代码和错误输出。我还不清楚你的错误是什么。最好的办法是什么?使用他们的数学描述,你已经很清楚了。我投票结束这个问题,因为它实际上更像是一个数学问题,而不是一个程序问题。
Vec2 samples[1];
fillSegmentSamples(x, &samples[0], 1);
y = samples[0].y;