0

一段时间以来,我一直在尝试将函数从 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中做过这个?

4

3 回答 3

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++ 一样The / (division) and // (floor division) operators yield the quotient of their arguments.工作,显然你应该使用它。//

于 2013-03-20T17:15:17.787 回答
1

您的代码是正确的翻译,但它不打算返回一个列表。此缓动函数返回给定时间 (t) 的单个缓动时间值。它旨在以从 0 到 d 变化的 at 值多次调用,并以平滑(非线性)的方式返回从 b 到 b+c 变化的结果。

您希望返回值从 0 变为 1,因此您应该使用 b=0.0 和 c=1.0 调用它。您应该将 d 值设置为要缓和的持续时间。

要获得从 0 到 1 的缓和值列表,对于从 0 到 10 的 t,您可以执行以下操作:

[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]
于 2013-04-30T21:24:04.603 回答
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
于 2013-03-20T17:32:32.257 回答