缓和函数的数学公式(ElasticEase,CircleEase,BounceEase,BackEase,PowerEase)?

时间:2011-04-29 22:53:02

标签: wpf math

我可以找出所有多项式函数的公式, 像例如QuinticEase的公式是:

  

(x - 1)^ 5 + 1

但ElasticEase,CircleEase,BounceEase,BackEase或PowerEase的数学公式是什么?

它们都应该在0..1

的范围内

3 个答案:

答案 0 :(得分:7)

看到这个JavaScript项目http://jstween.blogspot.com,在底部你会找到里面需要公式的Tween.js文件。

答案 1 :(得分:4)

大多数公式都可以on MSDN找到,如果它不正确,请查看相应的易用子网站。

对于引用未命名函数的更复杂的函数,您可以使用ILSpy之类的反编译器来查看相应类的EaseInCore方法的代码。

答案 2 :(得分:1)

我发现包含不同语言实现的网站很好:Robert Penner's Easing Functions

例如,弹性缓动C ++代码:

float Elastic::easeIn (float t,float b , float c, float d) {
    if (t==0) return b;  if ((t/=d)==1) return b+c;  
    float p=d*.3f;
    float a=c; 
    float s=p/4;
    float postFix =a*pow(2,10*(t-=1)); // this is a fix, again, with post-increment operators
    return -(postFix * sin((t*d-s)*(2*PI)/p )) + b;
}

float Elastic::easeOut(float t,float b , float c, float d) {
    if (t==0) return b;  if ((t/=d)==1) return b+c;  
    float p=d*.3f;
    float a=c; 
    float s=p/4;
    return (a*pow(2,-10*t) * sin( (t*d-s)*(2*PI)/p ) + c + b);  
}

float Elastic::easeInOut(float t,float b , float c, float d) {
    if (t==0) return b;  if ((t/=d/2)==2) return b+c; 
    float p=d*(.3f*1.5f);
    float a=c; 
    float s=p/4;

    if (t < 1) {
        float postFix =a*pow(2,10*(t-=1)); // postIncrement is evil
        return -.5f*(postFix* sin( (t*d-s)*(2*PI)/p )) + b;
    } 
    float postFix =  a*pow(2,-10*(t-=1)); // postIncrement is evil
    return postFix * sin( (t*d-s)*(2*PI)/p )*.5f + c + b;
}