【问题标题】:An approach towards achieving non-linear interpolation?实现非线性插值的方法?
【发布时间】:2012-04-10 20:12:31
【问题描述】:

我需要实现一种方法,用于值之间的非线性插值、缓入、缓出、一般缓动曲线以及用户定义的曲线。

我对如何做到这一点有一个基本的想法 - 但我不确定这是否是最有效的解决方案。我的想法基本上是这样的:

使用二维三次、二次或 n 阶贝塞尔曲线来控制插值。线性遍历曲线得到非线性的 Y 分量,并用它来赋值给一个简单的线性插值方法:

value = v1 + (v2 - v1) * t;

其中 t 是控制曲线的非线性 Y 分量。

这允许自定义、用户定义的插值方法,但这是有代价的,一个非线性插值的成本等于:

1 + 2 * (n-1)

总插值,其中 n 是控制曲线的阶数或控制点数。

我不是数学家,这是我能想到的最好的方法,所以我的问题是是否有更好的解决方案?

编辑:我可能解释不正确,我不是母语人士,所以希望每个人都能理解:

【问题讨论】:

  • 一个更好的解决方案,具体来说是什么?一般是插值,还是只是更有效的贝塞尔算法?你的限制是什么?
  • 您将如何创建三次或二次曲线来“控制插值”?只是猜测?
  • @DanW - 曲线的变化斜率用作插值的 t,基本上不是从 v1 到 v2 的线性变化,插值的“位置”由控制曲线的Y 分量。
  • 贝塞尔曲线是非线性插值的完美示例。如果您希望对象以恒定速度穿过曲线,请参阅this answer。否则,我不明白你的问题是什么。
  • @BlueRaja-DannyPflughoeft - 实际上,您的链接在另一个方面很有帮助,所以感谢您提出它,但这不是这个问题的主题,请参阅我添加的图像,也许它会得到更清晰。谢谢!

标签: algorithm interpolation bezier curve


【解决方案1】:

据我了解,您的 t 实际上是一系列函数 fi(u),其中 ufi(u) 介于 0 和 1 之间。如果是这样,它不会比你已经提出的更好。

您似乎担心在实际曲线计算期间评估这些 fi(u) 值。如果您不想预先计算,则无法避免评估。如果性能是一个大问题并且您不需要非常精确,您可以计算 fi(uj) 的表任意多的 uj 值(比如 0 和 1 之间的 100 或 1000 个离散点),以及当您需要采样点之间的值时,对所需点周围的两个缓存值进行简单的线性插值。

【讨论】:

  • 谢谢,这就是我需要知道的。这个想法基本上是创建一系列类,其中一个是您描述的类,返回从 0 到 1 的值,还有其他用户可以设置其他值和类型,例如您可能想要一个介于 0 和3,但您希望控制返回任何这些数字的几率,例如,您希望 0 的几率为 70%,1 的几率为 20%,2 的几率为 7%,1 的几率仅为 3%,还可以控制 while 循环创建自定义的、非线性的 for 循环和其他类似的东西......
猜你喜欢
  • 1970-01-01
  • 2014-11-29
  • 2015-07-22
  • 2011-11-12
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多