/* * ---------------------------------------------------- * Application: EasingEquations.as * ---------------------------------------------------- * Version: 1.5 * ---------------------------------------------------- * Latest update: May 1, 2003 * ---------------------------------------------------- * Developer: Richard Wright 2003 [wisolutions2002@shaw.ca] * ---------------------------------------------------- * Copyright: (c) 2003 Robert Penner [www.robertpenner.com] * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of this software nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------- * These tweening functions provide different flavors of * math-based motion under a consistent API. * ---------------------------------------------------- * Functions: * - Math object extensions * Math. * Linear * 1. linearTween(t,b,c,d) * Quadratic * 2. easeInQuad(t,b,c,d) ( 3. easeOutQuad(t,b,c,d) * 4. easeInOutQuad(t,b,c,d) * Cubic * 5. easeInCubic(t,b,c,d) * 6. easeOutCubic(t,b,c,d) * 7. easeInOutCubic(t,b,c,d) * Quartic * 8. easeInQuart(t,b,c,d) * 9. easeOutQuart(t,b,c,d) * 10. easeInOutQuart(t,b,c,d) * Quintic * 11. easeInQuint(t,b,c,d) * 12. easeOutQuint(t,b,c,d) * 13. easeInOutQuint(t,b,c,d) * Sinusoidal * 14. easeInSine(t,b,c,d) * 15. easeOutSine(t,b,c,d) * 16. easeInOutSine(t,b,c,d) * Exponential * 17. easeInExpo(t,b,c,d) * 18. easeOutExpo(t,b,c,d) * 19. easeInOutExpo(t,b,c,d) * Circular * 20. easeInCirc(t,b,c,d) * 21. easeOutCirc(t,b,c,d) * 22. easeInOutCirc(t,b,c,d) * Elastic * 23. easeInElastic(t,b,c,d,a,p) * 24. easeOutElastic(t,b,c,d,a,p) * 25. easeInOutElastic(t,b,c,d,a,p) * Back * 26. easeInBack(t,b,c,d,s) * 27. easeOutBack(t,b,c,d,s) * 28. easeInOutBack(t,b,c,d,s) * Bounce * 29. easeInBounce(t,b,c,d) * 30. easeOutBounce(t,b,c,d) * 31. easeInOutBounce(t,b,c,d) * ---------------------------------------------------- * Changes: * 1.5 - added bounce easing * 1.4 - added elastic and back easing * 1.3 - tweaked the exponential easing functions to make endpoints exact * 1.2 - inline optimizations (changing t and multiplying in one step)--thanks to Tatsuo Kato for the idea * * Discussed in Chapter 7 of * Robert Penner's Programming Macromedia Flash MX * (including graphs of the easing equations) * * http://www.robertpenner.com/profmx * http://www.amazon.com/exec/obidos/ASIN/0072223561/robertpennerc-20 * ---------------------------------------------------- * Updates may be available at: * http://members.shaw.ca/flashmath101/as/ * ---------------------------------------------------- */ // simple linear tweening - no easing // t: current time, b: beginning value, c: change in value, d: duration Math.linearTween = function(t,b,c,d) { return c*t/d+b; }; ///////////// QUADRATIC EASING: t^2 /////////////////// // quadratic easing in - accelerating from zero velocity // t: current time, b: beginning value, c: change in value, d: duration // t and d can be in frames or seconds/milliseconds Math.easeInQuad = function(t,b,c,d) { return c*(t/=d)*t+b; }; // quadratic easing out - decelerating to zero velocity Math.easeOutQuad = function(t,b,c,d) { return -c*(t/=d)*(t-2)+b; }; // quadratic easing in/out - acceleration until halfway, then deceleration Math.easeInOutQuad = function(t,b,c,d) { if ((t/=d/2)<1) return c/2*t*t+b; return -c/2*((--t)*(t-2)-1)+b; }; ///////////// CUBIC EASING: t^3 /////////////////////// // cubic easing in - accelerating from zero velocity // t: current time, b: beginning value, c: change in value, d: duration // t and d can be frames or seconds/milliseconds Math.easeInCubic = function(t,b,c,d) { return c*(t/=d)*t*t+b; }; // cubic easing out - decelerating to zero velocity Math.easeOutCubic = function(t,b,c,d) { return c*((t=t/d-1)*t*t+1)+b; }; // cubic easing in/out - acceleration until halfway, then deceleration Math.easeInOutCubic = function(t,b,c,d) { if ((t/=d/2)<1) return c/2*t*t*t+b; return c/2*((t-=2)*t*t+2)+b; }; ///////////// QUARTIC EASING: t^4 ///////////////////// // quartic easing in - accelerating from zero velocity // t: current time, b: beginning value, c: change in value, d: duration // t and d can be frames or seconds/milliseconds Math.easeInQuart = function(t,b,c,d) { return c*(t/=d)*t*t*t+b; }; // quartic easing out - decelerating to zero velocity Math.easeOutQuart = function(t,b,c,d) { return -c*((t=t/d-1)*t*t*t-1)+b; }; // quartic easing in/out - acceleration until halfway, then deceleration Math.easeInOutQuart = function(t,b,c,d) { if ((t/=d/2)<1) return c/2*t*t*t*t+b; return -c/2*((t-=2)*t*t*t-2)+b; }; ///////////// QUINTIC EASING: t^5 //////////////////// // quintic easing in - accelerating from zero velocity // t: current time, b: beginning value, c: change in value, d: duration // t and d can be frames or seconds/milliseconds Math.easeInQuint = function(t,b,c,d) { return c*(t/=d)*t*t*t*t+b; }; // quintic easing out - decelerating to zero velocity Math.easeOutQuint = function(t,b,c,d) { return c*((t=t/d-1)*t*t*t*t+1)+b; }; // quintic easing in/out - acceleration until halfway, then deceleration Math.easeInOutQuint = function(t,b,c,d) { if ((t/=d/2)<1) return c/2*t*t*t*t*t+b; return c/2*((t-=2)*t*t*t*t+2)+b; }; ///////////// SINUSOIDAL EASING: sin(t) /////////////// // sinusoidal easing in - accelerating from zero velocity // t: current time, b: beginning value, c: change in position, d: duration Math.easeInSine = function(t,b,c,d) { return -c*Math.cos(t/d*(Math.PI/2))+c+b; }; // sinusoidal easing out - decelerating to zero velocity Math.easeOutSine = function(t,b,c,d) { return c*Math.sin(t/d*(Math.PI/2))+b; }; // sinusoidal easing in/out - accelerating until halfway, then decelerating Math.easeInOutSine = function(t,b,c,d) { return -c/2*(Math.cos(Math.PI*t/d)-1)+b; }; ///////////// EXPONENTIAL EASING: 2^t ///////////////// // exponential easing in - accelerating from zero velocity // t: current time, b: beginning value, c: change in position, d: duration Math.easeInExpo = function(t,b,c,d) { return (t==0) ? b : c *Math.pow(2,10*(t/d-1))+b; }; // exponential easing out - decelerating to zero velocity Math.easeOutExpo = function(t,b,c,d) { return (t==d) ? b+c : c *(-Math.pow(2,-10*t/d)+1)+b; }; // exponential easing in/out - accelerating until halfway, then decelerating Math.easeInOutExpo = function(t,b,c,d) { if (t==0) return b; if (t==d) return b+c; if ((t/=d/2)<1) return c/2*Math.pow(2,10*(t-1))+b; return c/2*(-Math.pow(2,-10*--t)+2)+b; }; /////////// CIRCULAR EASING: sqrt(1-t^2) ////////////// // circular easing in - accelerating from zero velocity // t: current time, b: beginning value, c: change in position, d: duration Math.easeInCirc = function(t,b,c,d) { return -c*(Math.sqrt(1-(t/=d)*t)-1)+b; }; // circular easing out - decelerating to zero velocity Math.easeOutCirc = function(t,b,c,d) { return c*Math.sqrt(1-(t=t/d-1)*t)+b; }; // circular easing in/out - acceleration until halfway, then deceleration Math.easeInOutCirc = function(t,b,c,d) { if ((t/=d/2)<1) return -c/2*(Math.sqrt(1-t*t)-1)+b; return c/2*(Math.sqrt(1-(t-=2)*t)+1)+b; }; /////////// ELASTIC EASING: exponentially decaying sine wave ////////////// // t: current time, b: beginning value, c: change in value, d: duration, a: amplitude (optional), p: period (optional) // t and d can be in frames or seconds/milliseconds Math.easeInElastic = function(t,b,c,d,a,p) { if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p = d*.3; if (a> Penner easing equations loaded");