如何将C++中的缓动函数转换为Python?
我一直在尝试把一个C++的函数翻译成Python,但我对这个函数的理解不够深,自己翻译不出来。
//C++
float Cubic::easeInOut(float t,float b , float c, float d) {
if ((t/=d/2) < 1) return c/2*t*t*t + b;
return c/2*((t-=2)*t*t + 2) + b;
}
//Python
def rotate(t, b, c, d):
t = t/(d/2)
if (t < 1):
return c/2*t*t*t + b
t = t-2
return c/2*((t)*t*t + 2) + b
补充一下:这是我目前得到的结果,但它没有返回一个从0.0到1.0的列表。有没有人之前在Python中做过这个?
3 个回答
1
你的代码翻译得没问题,但它并不是用来返回一个列表的。这个缓动函数是用来返回一个单一的缓动时间值,针对你提供的时间(t)。它的设计是可以多次调用,每次传入的t值从0变化到d,返回的结果则是从b变化到b+c,以一种平滑(非线性)的方式。
你希望返回的值从0到1,所以你应该把b设置为0.0,c设置为1.0。d的值应该设定为你想要缓动的时间长度。
如果你想要得到从0到1的缓动值列表,t的范围从0到10,你可以这样做:
[rotate(t,0.0,1.0,10.0) for t in range(11)]
结果:
[0.0, 0.004000000000000001, 0.03200000000000001, 0.108, 0.25600000000000006, 0.5, 0.744, 0.8919999999999999, 0.968, 0.996, 1.0]
1
把所有的数字常量(比如2)换成它们的浮点数常量(比如2.0)这样做有帮助吗?
def rotate(t, b, c, d):
t = t/(d/2.0)
if t < 1.0:
return c/2.0*t*t*t + b
t = t-2.0
return c/2.0*((t)*t*t + 2.0) + b
1
提示:首先,简化一下C++的代码。
struct Cubic {
float easeInOut(float t,float b , float c, float d) {
t = t / (d/2);
if (t < 1)
return c/2*t*t*t + b;
t = t - 2;
return c/2*(t*t*t + 2) + b;
}
}
如果你还不知道怎么把这个翻译成Python,那你就需要多学学Python了。我能把这个转成Python,甚至我对Python还不是很了解。
其实,现在你已经发了你的Python代码,并且说它是错的,我想到一个问题:在Python中,所有的数字(我猜测)都是双精度浮点数,这意味着每次你进行除法运算时,结果可能和C++的稍微有点不同。快速看一下Python的文档,上面说“/(除法)和//(整除)运算符会返回它们参数的商。
”,所以如果你想让它的行为像C++那样,你应该使用//
。