【问题标题】:Bezier spline evaluation correctness贝塞尔样条评估正确性
【发布时间】:2016-06-10 10:31:40
【问题描述】:

在任意点评估样条曲线的最佳/最正确方法是什么?

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

我对中心线段使用三次公式,对曲线的第一段和最后一段使用二次公式。

我认为我遇到此问题的原因是因为在其评估中 X 坐标发生了变化(移位),而我目前正在以恒定的步进坐标对其进行评估,这会导致输入 x 和输出之间存在一些差异(我目前忽略了)

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

【问题讨论】:

  • “我遇到这个问题的原因” 什么问题? // “如果需要,我可以提供代码” 当然需要! // “我正在使用 Qt 作为一种检查方式……” 只有 Qt?什么是基础语言?
  • @DYangu 感谢您的回复。这确实是一个数学问题,而不是编程问题,这就是为什么我一开始没有包含代码或指定语言的原因。不过,我很乐意提供它。我现在已经确认问题来自对曲线进行“恒定阶梯评估”而不考虑曲线的导数。如果我要考虑弧长,它可能会起作用,但不能完全弄清楚如何做到这一点。如果我这样做,我会更新帖子。干杯。
  • 是的,请。提供一些代码和您的错误输出。我仍然不清楚你的错误是什么。
  • 最好的方法?使用他们已经清楚地拥有的数学描述。 What is the actual programming problem that you need help with?
  • 我投票决定将此问题作为题外话结束,因为这确实是一个数学问题,而不是程序问题

标签: qt math evaluation bezier spline


【解决方案1】:

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

我已经扩展了我对我正在实施的特定曲线类型的知识,现在我可以更好地解释我想要实现的目标以及我的问题是什么。对于由此可能造成的任何混乱,我们深表歉意。

我正在实现一个 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);

之前,我运行了以下等价的程序,这是错误的,因为它没有对 x 轴移动进行任何形式的补偿。 (请注意,在这种情况下,“t”是从“x”中提取的)

Vec2 samples[1];
fillSegmentSamples(x, &samples[0], 1);
y = samples[0].y;

这两个问题/答案帮助我了解出了什么问题:

他们并没有专门针对 fcurves,但弧长给了我解决这个问题的提示。

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 2011-04-07
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2015-06-26
    相关资源
    最近更新 更多