{"id":81,"date":"2007-06-27T10:11:52","date_gmt":"2007-06-27T15:11:52","guid":{"rendered":"http:\/\/www.pixelwit.com\/blog\/2007\/06\/27\/actionscript-easing-functions\/"},"modified":"2009-08-13T22:19:28","modified_gmt":"2009-08-14T03:19:28","slug":"actionscript-easing-functions","status":"publish","type":"post","link":"https:\/\/www.pixelwit.com\/blog\/2007\/06\/27\/actionscript-easing-functions\/","title":{"rendered":"ActionScript Easing Functions"},"content":{"rendered":"<p>Unlike most other easing equations or functions, my easing functions are 0 to 1 based (like the &#8220;Math.random&#8221; function).  This makes it easier to isolate the concept of &#8220;easing&#8221; from the concept of &#8220;tweening&#8221;.  Tweening is responsible for creating a series of equidistant values between an initial state and a final state.  Easing is responsible for shifting those values so they are no longer equally spaced.<\/p>\n<p>There are times when you may want to weight a single random value to favor one number over another.  For example, you may want a random number between 0 and 100 but you would prefer a number closer to 0 than to 100.  In this situation, there is no need for a &#8220;tween&#8221; as you are only generating one number and there is nothing to go be&#8221;tween&#8221;.  This is where easing functions which have been isolated from their tweening counterparts can come in handy.<\/p>\n<p>Here are my most frequently used easing functions:<!--more--><\/p>\n<div class=\"codecolorer-container actionscript default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"actionscript codecolorer\"><span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw2\">function<\/span> easeIn <span class=\"br0\">&#40;<\/span>r, p, f<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>p == <span class=\"kw3\">undefined<\/span><span class=\"br0\">&#41;<\/span> p = <span class=\"nu0\">2<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">typeof<\/span> f <span class=\"sy0\">!<\/span>= <span class=\"st0\">&quot;function&quot;<\/span><span class=\"br0\">&#41;<\/span>f = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">pow<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> f<span class=\"br0\">&#40;<\/span>r, p<span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw2\">function<\/span> easeOut <span class=\"br0\">&#40;<\/span>r, p, f<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"nu0\">1<\/span>-easeIn<span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span>-r, p, f<span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw2\">function<\/span> easeInOut <span class=\"br0\">&#40;<\/span>r, p, f<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>r<span class=\"sy0\">&lt;<\/span>.5<span class=\"br0\">&#41;<\/span><span class=\"kw1\">return<\/span> easeIn<span class=\"br0\">&#40;<\/span>r<span class=\"sy0\">*<\/span><span class=\"nu0\">2<\/span>, p, f<span class=\"br0\">&#41;<\/span><span class=\"sy0\">\/<\/span><span class=\"nu0\">2<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> .5+easeOut<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>r-.5<span class=\"br0\">&#41;<\/span><span class=\"sy0\">*<\/span><span class=\"nu0\">2<\/span>, p, f<span class=\"br0\">&#41;<\/span><span class=\"sy0\">\/<\/span><span class=\"nu0\">2<\/span>;<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw2\">function<\/span> easeOutIn <span class=\"br0\">&#40;<\/span>r, p, f<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>r<span class=\"sy0\">&lt;<\/span>.5<span class=\"br0\">&#41;<\/span><span class=\"kw1\">return<\/span> easeOut<span class=\"br0\">&#40;<\/span>r<span class=\"sy0\">*<\/span><span class=\"nu0\">2<\/span>, p, f<span class=\"br0\">&#41;<\/span><span class=\"sy0\">\/<\/span><span class=\"nu0\">2<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> .5+easeIn<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>r-.5<span class=\"br0\">&#41;<\/span><span class=\"sy0\">*<\/span><span class=\"nu0\">2<\/span>, p, f<span class=\"br0\">&#41;<\/span><span class=\"sy0\">\/<\/span><span class=\"nu0\">2<\/span>;<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw2\">function<\/span> ezSine <span class=\"br0\">&#40;<\/span>r, p<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; r = <span class=\"nu0\">1<\/span>-<span class=\"kw3\">Math<\/span>.<span class=\"kw3\">cos<\/span><span class=\"br0\">&#40;<\/span>r<span class=\"sy0\">*<\/span><span class=\"kw3\">Math<\/span>.<span class=\"kw3\">PI<\/span><span class=\"sy0\">\/<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"sy0\">&gt;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">return<\/span> easeIn<span class=\"br0\">&#40;<\/span>r, --p, ezSine<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> r;<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw2\">function<\/span> ezExpo <span class=\"br0\">&#40;<\/span>r, p<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>r==<span class=\"nu0\">0<\/span> <span class=\"sy0\">||<\/span> r==<span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">return<\/span> r;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"sy0\">&lt;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span>p = <span class=\"nu0\">1<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">pow<\/span><span class=\"br0\">&#40;<\/span>p, <span class=\"nu0\">10<\/span><span class=\"sy0\">*<\/span><span class=\"br0\">&#40;<\/span>r-<span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw2\">function<\/span> ezCirc <span class=\"br0\">&#40;<\/span>r, p<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; r = -<span class=\"br0\">&#40;<\/span><span class=\"kw3\">Math<\/span>.<span class=\"kw3\">sqrt<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span>-r<span class=\"sy0\">*<\/span>r<span class=\"br0\">&#41;<\/span>-<span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"sy0\">&gt;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">return<\/span> easeIn<span class=\"br0\">&#40;<\/span>r, --p, ezCirc<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> r;<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"co1\">\/\/<\/span><\/div><\/div>\n<p>It&#8217;s important to note that the above easing functions expect initial values between 0 and 1 and will also return values between 0 and 1.  If you would like to ease between values other than 0 and 1, you will need to scale and shift the values just like you would when working with the &#8220;Math.random&#8221; function.  For example, to get a random number between 0 and 100 we would use code like this:<\/p>\n<div class=\"codecolorer-container actionscript default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"actionscript codecolorer\"><span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw2\">var<\/span> randNum = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">random<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">*<\/span><span class=\"nu0\">100<\/span>;<br \/>\n<span class=\"co1\">\/\/<\/span><\/div><\/div>\n<p>To get a random number between 0 and 100 that&#8217;s probably closer to <strong>0<\/strong> we would use ActionScript like this:<\/p>\n<div class=\"codecolorer-container actionscript default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"actionscript codecolorer\"><span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw2\">var<\/span> randNum = easeIn<span class=\"br0\">&#40;<\/span><span class=\"kw3\">Math<\/span>.<span class=\"kw3\">random<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">*<\/span><span class=\"nu0\">100<\/span>;<br \/>\n<span class=\"co1\">\/\/<\/span><\/div><\/div>\n<p>To get a random number between 0 and 100 that&#8217;s probably closer to <strong>100<\/strong> we would use ActionScript like this:<\/p>\n<div class=\"codecolorer-container actionscript default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"actionscript codecolorer\"><span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw2\">var<\/span> randNum = easeOut<span class=\"br0\">&#40;<\/span><span class=\"kw3\">Math<\/span>.<span class=\"kw3\">random<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">*<\/span><span class=\"nu0\">100<\/span>;<br \/>\n<span class=\"co1\">\/\/<\/span><\/div><\/div>\n<p>To get a random number between 0 and 100 that&#8217;s probably closer to <strong>50<\/strong> we would use ActionScript like this:<\/p>\n<div class=\"codecolorer-container actionscript default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"actionscript codecolorer\"><span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw2\">var<\/span> randNum = easeOutIn<span class=\"br0\">&#40;<\/span><span class=\"kw3\">Math<\/span>.<span class=\"kw3\">random<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">*<\/span><span class=\"nu0\">100<\/span>;<br \/>\n<span class=\"co1\">\/\/<\/span><\/div><\/div>\n<p>That seems pretty straight-forward.  The next step is to control the amount of easing applied.  The &#8220;strength&#8221; or &#8220;power&#8221; of the easing is controlled by a second argument in the easing equations.  For example, to get a random number between 0 and 100 that has a really good chance of being close to 50, you could use code similar to the following:<\/p>\n<div class=\"codecolorer-container actionscript default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"actionscript codecolorer\"><span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw2\">var<\/span> randNum = easeOutIn<span class=\"br0\">&#40;<\/span><span class=\"kw3\">Math<\/span>.<span class=\"kw3\">random<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>, <span class=\"nu0\">4<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">*<\/span><span class=\"nu0\">100<\/span>;<br \/>\n<span class=\"co1\">\/\/<\/span><\/div><\/div>\n<p>The &#8220;4&#8221; in the code above is the &#8220;power&#8221; or &#8220;strength&#8221; argument.  Higher numbers increase the easing effect.<\/p>\n<p>The default easing function is acceptable for most circumstances, but occasionally you need a special easing function like sinusoidal or exponential easing.  If this is the case, you can provide a third argument to the easing functions which specifies a custom easing equation.  The following code provides an example:<\/p>\n<div class=\"codecolorer-container actionscript default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"actionscript codecolorer\"><span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw2\">var<\/span> randNum = easeOutIn<span class=\"br0\">&#40;<\/span><span class=\"kw3\">Math<\/span>.<span class=\"kw3\">random<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>, <span class=\"nu0\">1<\/span>, ezSine<span class=\"br0\">&#41;<\/span><span class=\"sy0\">*<\/span><span class=\"nu0\">100<\/span>;<br \/>\n<span class=\"co1\">\/\/<\/span><\/div><\/div>\n<p>You can achieve some fairly complex results by implementing the simple concepts above.  To illustrate this fact I&#8217;ve included the SWF below as an easing visualization tool.  The initial un-eased value is within the dotted line at the top middle while the eased values are within the red and blue boxes.  The dotted lines move at the same constant rate while the red and blue lines follow their eased values.<br \/>\n<br \/>\n\n<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t\t\tid=\"fm_easing_visualization_1813360886\"\n\t\t\tclass=\"flashmovie\"\n\t\t\twidth=\"500\"\n\t\t\theight=\"610\">\n\t<param name=\"movie\" value=\"\/blog\/wp-content\/uploads\/2007\/06\/easing_visualization.swf\" \/>\n\t<!--[if !IE]>-->\n\t<object\ttype=\"application\/x-shockwave-flash\"\n\t\t\tdata=\"\/blog\/wp-content\/uploads\/2007\/06\/easing_visualization.swf\"\n\t\t\tname=\"fm_easing_visualization_1813360886\"\n\t\t\twidth=\"500\"\n\t\t\theight=\"610\">\n\t<!--<![endif]-->\n\t\t\n\t<!--[if !IE]>-->\n\t<\/object>\n\t<!--<![endif]-->\n<\/object><\/p>\n<p>The core of the code in the above SWF looks something like this:<\/p>\n<div class=\"codecolorer-container actionscript default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"actionscript codecolorer\"><span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw1\">for<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw2\">var<\/span> i=<span class=\"nu0\">0<\/span>; i<span class=\"sy0\">&lt;<\/span>=<span class=\"nu0\">100<\/span>; i++<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> ratio = i<span class=\"sy0\">\/<\/span><span class=\"nu0\">100<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> x = xEaseType<span class=\"br0\">&#40;<\/span>ratio, xEaseStrength, xEaseModifier<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> gridSize;<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> y = yEaseType<span class=\"br0\">&#40;<\/span>ratio, yEaseStrength, yEaseModifier<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> gridSize;<br \/>\n&nbsp; &nbsp; Grid.<span class=\"me1\">PurpleCurve<\/span>.<span class=\"kw3\">lineTo<\/span><span class=\"br0\">&#40;<\/span>x, y<span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"co1\">\/\/<\/span><\/div><\/div>\n<p>Let me know if you have any questions, comments or suggestions.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PixelWit&#8217;s popular &#8220;RATIOnal&#8221; easing equations for ActionScript are 0 to 1 based and isolate the concept of easing from that of tweening.  Includes a handy and insightful easing visualization tool.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[8],"tags":[23,36,37],"class_list":["post-81","post","type-post","status-publish","format-standard","hentry","category-flash","tag-actionscript","tag-swfs","tag-tutorial"],"_links":{"self":[{"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/posts\/81","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/comments?post=81"}],"version-history":[{"count":0,"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/posts\/81\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/media?parent=81"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/categories?post=81"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/tags?post=81"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}