如何基于动态曲线映射/补间数字

时间:2013-07-12 20:05:15

标签: parametric-equations

真的这里缺少术语,所以对此有任何帮助。即使它没有回答它可以让我更接近答案的问题。

如何从y的函数中获取p,其中曲线也是一个变量(可能介于0和1之间?或者什么是最好的?)。< / p>

badly drawn sketch

我认为p始终在1和0之间,输出y也是如此。
图形只是一个例子,我不需要那个精确的曲线,但是接近这个想法。

伪代码足以作为答案或c-style(c,javascript等)。

为了给出一点上下文,我有一个映射函数,其中一个参数可以是 - 我所谓的 - 缓动函数。有基于penner方程。所以,例如,如果我想做一个easyIn,我会提供:

 function (p) { return p * p; };

但我希望能够做到图像中的内容:动态地改变容易度。使用如下函数:

function (p, curviness) { return /* something */; }

2 个答案:

答案 0 :(得分:2)

您可能会尝试使用Superellipse,但它似乎具有您正在寻找的形状可塑性。 (特例:Squircle

<强>更新

好的,所以超椭圆的等​​式如下:

abs(x/a)^n + abs(y/b)^n = 1

您将在[0,1]范围内工作,因此我们可以放弃绝对值。

ab用于主要和次要椭圆轴;我们要将它们设置为1(以便超椭圆仅在任一方向上伸展到+/- 1)并且仅查看第一象限([0,1],再次)。

这给我们留下了:

x^n + y^n = 1

您希望您的结束函数看起来像:

y = f(p, n)

因此我们需要将事物纳入该形式(解决y)。

您对下一步操作的初步想法是正确的(但变量已切换):

y^n = 1 - p^n

将变量p替换为x

现在,我最初想过尝试使用log来隔离y,但这意味着我们必须双方log_y这不会孤立它。相反,我们可以取第n个根取消n,从而隔离y

y = nthRoot(n, 1 - p^n)

如果这令人困惑,那么这可能会有所帮助:平方根只是提升到1/2的幂,所以如果你采用x的平方根,你就会:

sqrt(x) == x^(1/2)

我们所做的是采用第n个根,这意味着我们将事物提升到1/n幂,这取消了n以来y所具有的(y^n)^(1/n) == y^(n * 1/n) == y^1 == y 幂将它们相乘:

y = (1 - p^n)^(1/n)

因此我们可以把事情写成

y = f(p, n)

让事情看起来更好。

所以,现在我们有了一个等式

的等式
y = 1 - (1 - p^n)^(1/n)

但我们还没有完成:这个等式正在处理超椭圆的第一象限中的值;这个象限的图形看起来与你想要的不同 - 你想要的是第二象限中出现的东西,只是移位了。

我们可以通过反转第一象限中的图来纠正这个问题。我们通过从1中减去它来做到这一点。因此,最终的等式将是:

n

我的TI-83计算工作得很好。

注意:在维基百科文章中,他们提到当0介于1n之间时,曲线将向下/向内弯曲1等于n你得到一条直线,当1大于1时,它会被剔除。 然而,因为我们从0中减去了某些内容,这种行为正好相反!(所以1通过1意味着它鞠躬,大于{{1}}意味着它鞠躬。)

而且你有它 - 我希望你能找到的东西:)

答案 1 :(得分:1)

您的curviness属性是指数。

function(p, exp) { return Math.pow(p, exp); }
  • exp = 1为您提供了直线
  • exp > 1为您提供指数线(底部两个)
  • 0 < exp < 1为您提供对数线(前两位)

要在上方和下方获得“匹配”曲线,exp = 2将匹配线性分界线上的exp = 1/2,因此您可以定义“曲线”功能,使其更直观。

function curvyInterpolator(p, curviness) {
    curviness = curviness > 0 ? curviness : 1/(-curviness);
    return Math.pow(p, curviness);
}