【问题标题】:Defining a curve from three points从三个点定义曲线
【发布时间】:2014-09-10 03:01:03
【问题描述】:

我有一个类,其中存储了三个任意的float 值。我们称它们为 A B 和 C。该类有一个方法,该方法将输入 -1 到 +1 范围内的浮点数,然后根据输入返回一个值。

用值-1调用方法将产生A的值,用0调用它会产生B,用1调用它会产生C。现在的问题是,我怎样才能为所有东西插入一个输出之间?

我正在考虑基于定义为 -1xA 0xB 和 1xC 的三个点的假想曲线/样条曲线。使用可以绘制此曲线的函数,可以计算范围内任何浮点数的输出。

注意:

  • 曲线的确切形式并不那么重要,但它绝不能提供高于 AB 或 C 的输出,也不能提供低于 A、B 或 C 的输出。因为我需要测试一下看看哪种效果最好,我不能说曲线是否必须平滑。
  • 对于存储的浮点值哪个更高或更低没有限制。其中两个甚至可能是相同的。
  • 起初我想用三个点来定义一个圆,但是这可能会导致输出值超出 A B 和 C 的范围

通常我会在这里发布一些代码来说明我到目前为止所拥有的内容,但由于我真的不知道如何解决这个问题,所以我认为只发布一个空函数定义没有任何意义。

PS:

如果有人好奇为什么,我使用来自控制器的输入来定义关节的角度,所以输出值永远不会超出 -180 到 +180 的范围

【问题讨论】:

  • 如果插值曲线的形式不重要,可以只用三个点创建一个分段线性函数吗?
  • 只是澄清一下,A B 和 C 是一维点正确吗?
  • @Ben 我在想,是的,但是如上所述,我不确定最终哪种方法效果最好,所以我也希望有一种方法能够获得一些平滑的结果。另外,由于 A
  • 嗯,如果点是一维的,那么线性方法是否“平滑”?
  • 看来这三个“点”是二维的:第一个在(-1,A),第二个在(0,B),第三个在(1, C)。

标签: java algorithm interpolation


【解决方案1】:

最简单的答案是分段线性函数,如other answer

但是,评论说“任何不会导致尖峰或狭窄坑的平滑曲线”。

第二个最简单的答案是使用通过 3 个点的唯一抛物线(二次插值),但这违反了所有值必须介于 min(A,B,C)max(A,B,C) 之间的要求。

所以我们坚持第 3 个最简单的答案:在 0 处使用导数为 0 的分段二次函数:

f(x) = B + (C-B) * x^2  when x is in [0,1]
       B + (A-B) * x^2  when x is in [-1,0]

【讨论】:

  • 这如何转化为 Java?
  • @Jarmund 三元运算符,或者只是一个 if... 这个函数很简单
  • 事实上,当 A
【解决方案2】:

让我们使用三个点(-1,A),(0,B),(1,C)来定义一个分段线性函数

f(x) = (B-A)(x+1)+A if x in [-1, 0)
     = (C-B)x+B if x in [0, 1]

(如果有人知道 TeX 并且想通过各种方式使它变得漂亮)......

平滑函数有一些非常奇特的插值方法,通过使 f(x) 在 x = B 处可微,但是自从我的数值分析课以来已经有一段时间了......

【讨论】:

    【解决方案3】:

    分段线性插值尊重约束,但仅 C0 连续。

    您可以通过分段抛物线插值 (y = A x(x-1)/2 + B (x+1)(1-x) + C x(x+1)/2) 实现 C1 连续性,但您必须确保这两个部分是单调的(没有最大值,可能在端点处除外)。

    首先尝试抛物线插值。导数是线性的 (y' = A (2x-1)/2 + B 2x + C (2x+1)/2))。如果 -1 和 +1 处的导数符号相同,则完成。否则使用3.@sds的解决方案。

    【讨论】:

      【解决方案4】:

      只找到合适的两点之间的中点怎么样?

      给定 i 作为 -1 和 1 之间的输入:

      if i < 0 then point.x = (a.x+b.x)/2 and point.y = (a.y+b.y)/2
      if i > 0 then point.x = (b.x+c.x)/2 and point.y = (b.y+c.y)/2
      

      【讨论】:

        猜你喜欢
        • 2019-12-10
        • 2018-10-02
        • 1970-01-01
        • 1970-01-01
        • 2018-08-04
        • 1970-01-01
        • 1970-01-01
        • 2016-02-28
        • 1970-01-01
        相关资源
        最近更新 更多