如何将C++中的缓动函数转换为Python?

0 投票
3 回答
880 浏览
提问于 2025-04-17 19:46

我一直在尝试把一个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++那样,你应该使用//

撰写回答