从三点定义一条曲线



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

调用值为-1的方法将得到A的值,用0调用它将得到B,用1调用它将得到c。现在的问题是,我如何为两者之间的所有内容插入输出?

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

注:

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

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

PS:

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

最简单的答案是一个分段线性函数,就像另一个答案一样。

然而,评论说:"任何光滑的曲线,不会导致尖顶或窄坑"。

第二个最简单的答案是使用经过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,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处可微,但是自从我的数值分析课以来已经有一段时间了…

分段线性插值尊重约束条件,但只有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 .

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

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

最新更新