从三个点定义曲线

时间:2014-07-18 21:27:16

标签: java algorithm interpolation

我有一个包含三个任意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的范围

4 个答案:

答案 0 :(得分:2)

最简单的答案是other answer中的分段线性函数。

然而,评论说"任何类型的平滑曲线都不会导致尖顶山顶或狭窄的坑#34;

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

所以我们坚持第三个最简单的答案:在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]

答案 1 :(得分:1)

让我们使用三个点(-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处可微分,但是自从我的数值分析类以来已经有一段时间......

答案 2 :(得分:1)

分段线性插值遵循约束,但只是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。

的解决方案

答案 3 :(得分:0)

如何才能找到适当的两点之间的中点?

给出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