<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dev.enekoalonso.com &#187; deceleration</title>
	<atom:link href="http://dev.enekoalonso.com/tag/deceleration/feed/" rel="self" type="application/rss+xml" />
	<link>http://dev.enekoalonso.com</link>
	<description>having fun with code</description>
	<lastBuildDate>Wed, 12 Oct 2011 21:40:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Acceleration: slow down problem</title>
		<link>http://dev.enekoalonso.com/2009/01/20/acceleration-slow-down-problem/</link>
		<comments>http://dev.enekoalonso.com/2009/01/20/acceleration-slow-down-problem/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 06:34:54 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[acceleration]]></category>
		<category><![CDATA[deceleration]]></category>
		<category><![CDATA[equation]]></category>
		<category><![CDATA[kinematics]]></category>
		<category><![CDATA[motion]]></category>
		<category><![CDATA[speed]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=264</guid>
		<description><![CDATA[Moving objects in computing can be handled easily keeping a speed variable, let&#8217;s say in pixels per second (object.speed.x = 10). Then, on every step of the animation, we change the object position with this amount divided by the number of frames per second we are processing (object.x += object.speed.x / fps). Acceleration can be [...]]]></description>
			<content:encoded><![CDATA[<p>Moving objects in computing can be handled easily keeping a speed variable, let&#8217;s say in pixels per second (<code>object.speed.x = 10</code>). Then, on every step of the animation, we change the object position with this amount divided by the number of frames per second we are processing (<code>object.x += object.speed.x / fps</code>). Acceleration can be achieved easily to. On every step of the animation we can modify the speed with an acceleration factor (<code>object.speed.x += object.acceleration.x</code>).</p>
<h3>Slow down problem</h3>
<p>Today at work I&#8217;ve been trying to solve this problem: Giving an object moving at 50 px/s I want it to slow down to 0 px/s in exactly 400px. How can we calculate the acceleration for this? I need an amount to subtract to the speed on every step, so by the time the object has moved 400px the speed is 0.</p>
<p>There are a few <a href="http://en.wikipedia.org/wiki/Equations_of_Motion#Classic_version">equations of motion</a> that could be applied. In this case, we don&#8217;t care about how much time does it take to stop the object. So the formula is:</p>
<p><center><img src="http://l.wordpress.com/latex.php?latex=a%3D%5Cfrac%7Bv%5E2%20-%20v_0%5E2%7D%7B2%2As%7D&#038;bg=0D324F&#038;fg=FFFFFF&#038;s=1" title="a=\frac{v^2 - v_0^2}{2*s}" style="vertical-align:-20%;" class="tex" alt="a=\frac{v^2 - v_0^2}{2*s}" /></center><br />
<center><img src="http://l.wordpress.com/latex.php?latex=a%3D%5Cfrac%7B-50%5E2%7D%7B2%2A400%7D%3D-3.13&#038;bg=0D324F&#038;fg=FFFFFF&#038;s=1" title="a=\frac{-50^2}{2*400}=-3.13" style="vertical-align:-20%;" class="tex" alt="a=\frac{-50^2}{2*400}=-3.13" /></center></p>
<p>In Javascript:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">this</span>.<span class="me1">acceleration</span> = <span class="br0">&#40;</span>Math.<span class="me1">pow</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">finalSpeed</span>,<span class="nu0">2</span><span class="br0">&#41;</span> &#8211; Math.<span class="me1">pow</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">speed</span>,<span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">*</span><span class="kw1">this</span>.<span class="me1">brakingSpace</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Well, still <a href="http://enekoalonso.com/research/slowdown-problem.php">it doesn&#8217;t work perfectly on my demo</a>. The object, a 10px square div, decelerates properly, but stops at 375px instead of 400px. I&#8217;ll keep working on it.</p>
<h3>The code</h3>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Brake = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">Extends</span>: Thread,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; initialize: <span class="kw2">function</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">parent</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="kw1">item</span> = $<span class="br0">&#40;</span><span class="st0">&#39;item&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">speed</span> = <span class="nu0">50</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">finalSpeed</span> = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">brakingSpace</span> = <span class="nu0">400</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">currentPos</span> = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">acceleration</span> = <span class="br0">&#40;</span>Math.<span class="me1">pow</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">finalSpeed</span>,<span class="nu0">2</span><span class="br0">&#41;</span> &#8211; Math.<span class="me1">pow</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">speed</span>,<span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">*</span><span class="kw1">this</span>.<span class="me1">brakingSpace</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#39;acceleration&#39;</span><span class="br0">&#41;</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#39;html&#39;</span>, <span class="st0">&#39;Acceleration: &#39;</span> + <span class="kw1">this</span>.<span class="me1">acceleration</span>.<span class="me1">toFixed</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span> + <span class="st0">&#39; px/s&lt;sup&gt;2&lt;/sup&gt;&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; execute: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">speed</span> <span class="sy0">&lt;</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="kw1">item</span>.<span class="me1">setStyles</span><span class="br0">&#40;</span><span class="br0">&#123;</span>left: <span class="kw1">this</span>.<span class="me1">currentPos</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#39;position&#39;</span><span class="br0">&#41;</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#39;text&#39;</span>, <span class="st0">&#39;Position: &#39;</span> + <span class="kw1">this</span>.<span class="me1">currentPos</span>.<span class="me1">toFixed</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span> + <span class="st0">&#39; px&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#39;speed&#39;</span><span class="br0">&#41;</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#39;text&#39;</span>, <span class="st0">&#39;Speed: &#39;</span> + <span class="kw1">this</span>.<span class="me1">speed</span>.<span class="me1">toFixed</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span> + <span class="st0">&#39; px/s&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">speed</span> &nbsp; &nbsp; &nbsp;+= <span class="kw1">this</span>.<span class="me1">acceleration</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">currentPos</span> += <span class="kw1">this</span>.<span class="me1">speed</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>If I modify the position before adjusting the speed, the object goes farther than 400px. If I update the speed first (like above), the object stops before reaching 400px.</p>
<h3>Problem solved</h3>
<p>Turns out I wasn&#8217;t calculating the new position properly. The formula to calculate the new position is:</p>
<p><center><img src="http://l.wordpress.com/latex.php?latex=s%3Dv%20-%20%5Cfrac%7B1%7D%7B2%7Da&#038;bg=0D324F&#038;fg=FFFFFF&#038;s=1" title="s=v - \frac{1}{2}a" style="vertical-align:-20%;" class="tex" alt="s=v - \frac{1}{2}a" /></center></p>
<p>Or in Javascript:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">this</span>.<span class="me1">currentPos</span> += <span class="kw1">this</span>.<span class="me1">speed</span> &#8211; <span class="nu0">0.5</span><span class="sy0">*</span><span class="kw1">this</span>.<span class="me1">acceleration</span>;</div>
</li>
</ol>
</div>
<p>Here is the modified code:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1">execute: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">this</span>.<span class="me1">speed</span> += <span class="kw1">this</span>.<span class="me1">acceleration</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">this</span>.<span class="me1">currentPos</span> += <span class="kw1">this</span>.<span class="me1">speed</span> &#8211; <span class="nu0">0.5</span><span class="sy0">*</span><span class="kw1">this</span>.<span class="me1">acceleration</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">speed</span> <span class="sy0">&lt;</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">this</span>.<span class="kw1">item</span>.<span class="me1">setStyles</span><span class="br0">&#40;</span><span class="br0">&#123;</span>left: <span class="kw1">this</span>.<span class="me1">currentPos</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; $<span class="br0">&#40;</span><span class="st0">&#39;position&#39;</span><span class="br0">&#41;</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#39;text&#39;</span>, <span class="st0">&#39;Position: &#39;</span> + <span class="kw1">this</span>.<span class="me1">currentPos</span>.<span class="me1">toFixed</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span> + <span class="st0">&#39; px&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; $<span class="br0">&#40;</span><span class="st0">&#39;speed&#39;</span><span class="br0">&#41;</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#39;text&#39;</span>, <span class="st0">&#39;Speed: &#39;</span> + <span class="kw1">this</span>.<span class="me1">speed</span>.<span class="me1">toFixed</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span> + <span class="st0">&#39; px/s&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Of course, now the demo is accurate :) Thanks Jacob.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>No Related Post</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2009/01/20/acceleration-slow-down-problem/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

