// t: current time, b: begInnIng value, c: change In value, d: duration
def: 'easeOutQuad',
swing: function (x, t, b, c, d) {
//alert(jQuery.easing.default);
return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
},
easeInQuad: function (x, t, b, c, d) {
return c*(t/=d)*t + b;
},
easeOutQuad: function (x, t, b, c, d) {
return -c *(t/=d)*(t-2) + b;
},
我正在尝试将Robert Penner的Easing Functions转换为python并卡住! 任何帮助或其他任何人之前做过这个?
https://github.com/danro/jquery-easing/blob/master/jquery.easing.js
答案 0 :(得分:6)
在JavaScript和Python中,/=
是一个“扩充赋值”运算符,具有几乎相同的含义。
在JS中:
var i = 10;
i /= 2;
......相当于:
var i = 10;
i = i / 2;
而且,在Python中:
i = 10
i /= 2
...同样等同于(不完全相同,但足够接近数字):
i = 10
i = i / 2
但是,有一个很大的区别。
在JavaScript中,赋值是一个表达式 - 它有一个值,该值是赋给变量的值。所以:
var i = 10;
var j = i /= 2;
...大致相当于:
var i = 10;
i /= 2;
var j = i;
在Python中,赋值是一种陈述。它没有任何价值,不能在表达式中使用。所以:
i = 10
j = i /= 2
...提出SyntaxError
。
在表达式中间移植使用赋值(扩充或其他)的代码通常需要将该表达式分解为多行和/或找到重写表达式以不需要任何赋值的方法。 (但通常情况下,这不是一件坏事,因为无论如何原始表达都不是很可读......)
例如,假设JS从左到右评估操作数(我不确定是否可以保证?):
def easeInQuad(x, t, b, c, d):
t /= d
return c*t*t+b
更一般地说,你这样做:
old_t = t
t /= d
然后使用t
替换t/=d
之前old_t
的所有实例,并将所有实例保留在t/=d
之后。幸运的是,在这种情况下,没有先前的实例,因此我们不需要old_t
个东西。
如果您考虑一下,您可以轻松地获得相同的效果,而无需在一行中更改t
,更可读的是,通过以下任何方式:
return c * (t/d) * (t/d) + b
return c * (t/d)**2 + b
return c * t*t / d*d + b
在C中思考的人会立即抱怨这些都“太慢”了。毕竟,第一个进行额外的除法,第二个进行取幂而不是乘法,第三个进行两次乘法而不是一次乘法。恐怖!
当然,您总是可以使用临时变量:
t_over_d = t/d
return c * t_over_d * t_over_d + b
...但是对于C程序员来说,这意味着你正在使用一个有价值的寄存器。当然,在1985年之后编写的每个编译器都会在t
出现时检测到t_over_d
已经死亡并重复使用相同的寄存器,但为什么不强制它重用如果我们可以注册,特别是如果它也节省了一些击键?
在JS或Python中,乘法的成本只是调用函数和解释字节码的成本的一小部分,依此类推,你甚至都没有注意到它。同时,重新绑定局部变量(特别是在V8风格或PyPy风格的JIT解释器中)的成本可能远远高于传递未命名的临时结果的成本。
因此,这是误导“优化”的范例,使代码更难理解,同时可能减慢速度而不是加速,并且在一个不可能成为值得优化的瓶颈的领域。
由于gnibbler提出了JavaScript是否确实确保此评估顺序的问题......
首先,JavaScript被有效地定义为“Firefox所做的”(以及“Spidermonkey做什么”,但这应该是相同的 - 如果不是,那么JavaScript会做两件事,所以这就是两倍的好,对吗?)。但ECMAScript 是由标准定义的,并且每个JS实现(尽管名称)都支付口碑服务,并且我们可以假装ECMAScript 5.1是所有实现符合的标准(这是只要“所有实现”都意味着“Opera”),则为true。你可以找到它here。
因此,在ES 5.1中: 11.5乘法运算符保证在(t/=d)
之前评估t
的结果,并且 11.13.2复合赋值 strong>保证评估t/=d
将在t
完成之前设置值。 (你必须阅读“评估”的含义以及GetValue
和SetValue
的含义,但我确信这确实是有保障的。)
答案 1 :(得分:1)
/=
是一个增强的赋值运算符。 t /= d
与t = t / d
相同。 +=
,-=
和*=
也存在,等等......
答案 2 :(得分:1)
它是一个像+=
一样的短手操作符,但不是添加它而是分开。这是长篇
t = t / d
答案 3 :(得分:1)
c*(t/=d)*t + b;
相当于
t /= d # or t = t / d
c * t * t + b
因为Python无法分配内部表达式
请注意,如果t
和d
都是int
/ long
,那么这将是Python2中的截断分割
同样easeOutQuad
将是
def easeOutQuad (x, t, b, c, d):
t /= d
return -c * t * (t - 2) + b
答案 4 :(得分:0)
分割和分配。
>>> p = 6
>>> p /= 2
>>> p
3