Qt 贝塞尔样条求值正确性
在任意点计算样条曲线的最佳/最正确方法是什么 我已经绘制了我的评估结果,并将它们与使用UI库得到的结果进行了比较,发现我的结果不正确 我用三次公式计算曲线的中心段,用二次公式计算曲线的第一段和最后一段Qt 贝塞尔样条求值正确性,qt,math,evaluation,bezier,spline,Qt,Math,Evaluation,Bezier,Spline,在任意点计算样条曲线的最佳/最正确方法是什么 我已经绘制了我的评估结果,并将它们与使用UI库得到的结果进行了比较,发现我的结果不正确 我用三次公式计算曲线的中心段,用二次公式计算曲线的第一段和最后一段 我认为我出现这个问题的原因是,在计算过程中,X坐标发生了变化(移位),而我目前在恒定阶跃坐标下对其进行计算,这导致输入X和输出X之间存在一些差异(我目前忽略了这一点) 如果需要,我可以提供代码。(我使用Qt作为一种检查正确性的方法,以防它有所帮助)结果证明它是数学和编程的结合 从那以后,我扩展了
我认为我出现这个问题的原因是,在计算过程中,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);
以下两个问题/答案帮助我了解出了什么问题:
干杯 “我有这个问题的原因”什么问题??//“如果需要,我可以提供代码”当然需要“我使用Qt作为检查的一种方式…”只有Qt?基本语言是什么?@DYangu谢谢你的回答。这实际上是一个数学问题,而不是编程问题,这就是为什么我没有包括代码,也没有指定语言的原因。不过,我非常乐意提供它。我现在已经证实,问题来自于对曲线进行“恒定阶跃评估”,而不考虑曲线的导数。如果我考虑到弧长,它可能会起作用,但不能完全解决如何做到这一点。如果我这样做,我会更新帖子。干杯。是的,请。提供一些代码和错误输出。我还不清楚你的错误是什么。最好的办法是什么?使用他们的数学描述,你已经很清楚了。我投票结束这个问题,因为它实际上更像是一个数学问题,而不是一个程序问题。
Vec2 samples[1];
fillSegmentSamples(x, &samples[0], 1);
y = samples[0].y;