我真的这里缺少术语,所以对此有任何帮助。即使它没有回答它可以让我更接近答案的问题。
如何从y
的函数中获取p
,其中曲线也是一个变量(可能介于0和1之间?或者什么是最好的?)。< / p>
我认为p
始终在1和0之间,输出y
也是如此。
图形只是一个例子,我不需要那个精确的曲线,但是接近这个想法。
伪代码足以作为答案或c-style(c,javascript等)。
为了给出一点上下文,我有一个映射函数,其中一个参数可以是 - 我所谓的 - 缓动函数。有基于penner方程。所以,例如,如果我想做一个easyIn,我会提供:
function (p) { return p * p; };
但我希望能够做到图像中的内容:动态地改变容易度。使用如下函数:
function (p, curviness) { return /* something */; }
答案 0 :(得分:2)
您可能会尝试使用Superellipse,但它似乎具有您正在寻找的形状可塑性。 (特例:Squircle)
<强>更新强>
好的,所以超椭圆的等式如下:
abs(x/a)^n + abs(y/b)^n = 1
您将在[0,1]范围内工作,因此我们可以放弃绝对值。
a
和b
用于主要和次要椭圆轴;我们要将它们设置为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
介于1
和n
之间时,曲线将向下/向内弯曲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);
}