我有一个类,其中存储了三个任意的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