首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从三点定义曲线

从三点定义曲线
EN

Stack Overflow用户
提问于 2014-07-18 13:27:15
回答 4查看 704关注 0票数 1

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

用值调用方法-1将得到A的值,用0调用它将导致B,用1调用它将导致C。现在的问题是,如何在两者之间插值输出?

我在想一条假想曲线/样条,它基于定义为-1xA0xB和1xC的三个点。通过一个可以绘制这条曲线的函数,可以为范围内的任何浮点数提供输出。

注:

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

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

PS:

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-18 13:45:08

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

然而,一条评论说“任何一种光滑的曲线都不会导致尖顶或狭窄的凹坑”。

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

因此,我们被困在第三个最简单的答案:使用分段二次函数,0导数在0:

代码语言:javascript
运行
AI代码解释
复制
f(x) = B + (C-B) * x^2  when x is in [0,1]
       B + (A-B) * x^2  when x is in [-1,0]
票数 2
EN

Stack Overflow用户

发布于 2014-07-18 13:37:44

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

代码语言:javascript
运行
AI代码解释
复制
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处可微,但我的数值分析类已经有一段时间了。

票数 1
EN

Stack Overflow用户

发布于 2014-07-18 14:00:50

分段线性插值只考虑约束条件,但仅为C0连续插值。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24834050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文