<?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; drag</title>
	<atom:link href="http://dev.enekoalonso.com/tag/drag/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>Repulsive force in Javascript with Mootools draggables</title>
		<link>http://dev.enekoalonso.com/2009/01/04/repulsive-force-in-javascript-with-mootols-draggables/</link>
		<comments>http://dev.enekoalonso.com/2009/01/04/repulsive-force-in-javascript-with-mootols-draggables/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 00:05:24 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[drag]]></category>
		<category><![CDATA[draggable]]></category>
		<category><![CDATA[force]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[repulsive]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=244</guid>
		<description><![CDATA[A couple of days ago I was reading about the Boids demo made by Ben from Coderholic. I though that was very interesting, specially since I hadn&#8217;t heard about boids before. I wanted to create my own version but instead I decided to play only with the repulsive force, making it interactive using Mootools drag [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of days ago I was reading about the <a href="http://www.coderholic.com/javascript-boids/">Boids demo made by Ben from Coderholic</a>. I though that was very interesting, specially since I hadn&#8217;t heard about <a href="http://en.wikipedia.org/wiki/Boids">boids</a> before.</p>
<p>I wanted to create my own version but instead I decided to play only with the <a href="http://en.wikipedia.org/wiki/Repulsive_force_(magnetism)">repulsive force</a>, making it interactive using <a href="http://mootools.net/docs/Plugins/Drag">Mootools drag &#038; drop functionality</a>. When the demo loads, 20 elements will be created and they will start moving on their own, trying to keep the minimum distance with any other element. This distance is configurable, as it is the option to keep the element speed or to make them slow down until they stop. At any time, the user can move elements on the screen dragging them with the mouse.</p>
<p><a href="http://dev.enekoalonso.com/research/repulsive-force.php"><img src="http://dev.enekoalonso.com/wp-content/uploads/2009/01/picture-155-424x300.png" alt="Repulsive Force Demo" title="Repulsive Force Demo" width="424" height="300" class="aligncenter size-medium wp-image-246" /></a></p>
<p>See the <a href="http://dev.enekoalonso.com/research/repulsive-force.php">demo in action</a>.</p>
<h3>Source code</h3>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> <span class="kw1">Item</span> = <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; Implements: Options,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; options: <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; radius: <span class="nu0">10</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; position: <span class="br0">&#123;</span> x: window.<span class="me1">clientWidth</span><span class="re0">/<span class="nu0">2</span>, y: window.<span class="me1">clientHeight</span><span class="sy0">/|</span>><span class="nu0">2</span> <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; speed: <span class="br0">&#123;</span> x: <span class="nu0">0</span>, y: <span class="nu0">0</span> <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; color: <span class="st0">&#39;#333&#39;</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; 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">setOptions</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="me1">addToDOM</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> self = <span class="kw1">this</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">dragController</span> = <span class="kw2">new</span> Drag<span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">element</span>, <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; onStart: <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; &nbsp; &nbsp; self.<span class="me1">dragging</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; onDrag: <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; &nbsp; &nbsp; self.<span class="me1">options</span>.<span class="me1">position</span> = self.<span class="me1">element</span>.<span class="me1">getPosition</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; onComplete: <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; &nbsp; &nbsp; self.<span class="me1">options</span>.<span class="me1">position</span> = self.<span class="me1">element</span>.<span class="me1">getPosition</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; self.<span class="me1">speed</span> = <span class="br0">&#123;</span>x:<span class="nu0">0</span>,y:<span class="nu0">0</span><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; self.<span class="me1">dragging</span> = <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">dragging</span> = <span class="kw2">false</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; destroy: <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">this</span>.<span class="me1">element</span>.<span class="me1">destroy</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">delete</span> <span class="kw1">this</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; addToDOM: <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">this</span>.<span class="me1">element</span> = <span class="kw2">new</span> Element<span class="br0">&#40;</span><span class="st0">&#39;div&#39;</span>, <span class="br0">&#123;</span> <span class="st0">&#39;class&#39;</span>: <span class="st0">&#39;item&#39;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">element</span>.<span class="me1">setStyles</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; background: <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">color</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; height: <span class="nu0">2</span><span class="sy0">*</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">radius</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; width: &nbsp;<span class="nu0">2</span><span class="sy0">*</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">radius</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; left: <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">x</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; top: &nbsp;<span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">y</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&#39;-moz-border-radius&#39;</span>: Math.<span class="me1">round</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">radius</span><span class="br0">&#41;</span> + <span class="st0">&#39;px&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&#39;-webkit-border-radius&#39;</span>: Math.<span class="me1">round</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">radius</span><span class="br0">&#41;</span> + <span class="st0">&#39;px&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&#39;border-radius&#39;</span>: Math.<span class="me1">round</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">radius</span><span class="br0">&#41;</span> + <span class="st0">&#39;px&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>.<span class="me1">inject</span><span class="br0">&#40;</span>document.<span class="me1">body</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; moveTo: <span class="kw2">function</span><span class="br0">&#40;</span>x, y<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">dragging</span><span class="br0">&#41;</span> <span class="kw1">return</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">options</span>.<span class="me1">position</span>.<span class="me1">x</span> = x;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">y</span> = y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Check bounds</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">options</span>.<span class="me1">position</span>.<span class="me1">x</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="me1">options</span>.<span class="me1">position</span>.<span class="me1">x</span> = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">speed</span>.<span class="me1">x</span> = <span class="nu0">0</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">if</span> <span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">x</span> <span class="sy0">&gt;</span> window.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; <span class="nu0">2</span><span class="sy0">*</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">radius</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="me1">options</span>.<span class="me1">position</span>.<span class="me1">x</span> = window.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; <span class="nu0">2</span><span class="sy0">*</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">radius</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">speed</span>.<span class="me1">x</span> = <span class="nu0">0</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">if</span> <span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">y</span> <span class="sy0">&lt;</span> $<span class="br0">&#40;</span><span class="st0">&#39;header&#39;</span><span class="br0">&#41;</span>.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</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="me1">options</span>.<span class="me1">position</span>.<span class="me1">y</span> = $<span class="br0">&#40;</span><span class="st0">&#39;header&#39;</span><span class="br0">&#41;</span>.<span class="me1">getHeight</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">this</span>.<span class="me1">options</span>.<span class="me1">speed</span>.<span class="me1">y</span> = <span class="nu0">0</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">if</span> <span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">y</span> <span class="sy0">&gt;</span> window.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; <span class="nu0">2</span><span class="sy0">*</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">radius</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="me1">options</span>.<span class="me1">position</span>.<span class="me1">y</span> = window.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; <span class="nu0">2</span><span class="sy0">*</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">radius</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">speed</span>.<span class="me1">y</span> = <span class="nu0">0</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;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Slow down</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>$<span class="br0">&#40;</span><span class="st0">&#39;chk-slowdown&#39;</span><span class="br0">&#41;</span>.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&#39;checked&#39;</span><span class="br0">&#41;</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="me1">options</span>.<span class="me1">speed</span>.<span class="me1">x</span> <span class="sy0">*</span>= <span class="nu0">0.7</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">speed</span>.<span class="me1">y</span> <span class="sy0">*</span>= <span class="nu0">0.7</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; </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">options</span>.<span class="me1">speed</span>.<span class="me1">x</span> <span class="sy0">&lt;</span> <span class="nu0">0.001</span><span class="br0">&#41;</span> <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">speed</span>.<span class="me1">x</span> = <span class="nu0">0</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">options</span>.<span class="me1">speed</span>.<span class="me1">y</span> <span class="sy0">&lt;</span> <span class="nu0">0.001</span><span class="br0">&#41;</span> <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">speed</span>.<span class="me1">y</span> = <span class="nu0">0</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; draw: <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">dragging</span><span class="br0">&#41;</span> <span class="kw1">return</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">element</span>.<span class="me1">setStyles</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; left: Math.<span class="me1">round</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">x</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; top: &nbsp;Math.<span class="me1">round</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">y</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</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"><span class="br0">&#125;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> ItemController = <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; items: <span class="br0">&#91;</span><span class="br0">&#93;</span>,</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; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; addItem: <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">items</span>.<span class="me1">push</span><span class="br0">&#40;</span><span class="kw2">new</span> <span class="kw1">Item</span><span class="br0">&#40;</span>options<span class="br0">&#41;</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">this</span>.<span class="me1">compute</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">draw</span><span class="br0">&#40;</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; compute: <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="kw2">var</span> self = <span class="kw1">this</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; self.<span class="me1">items</span>.<span class="me1">each</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>item1, index1<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; self.<span class="me1">items</span>.<span class="me1">each</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>item2, index2<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>index1 <span class="sy0">!</span>= index2<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> distance = <span class="br0">&#123;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; distance.<span class="me1">x</span> = <span class="br0">&#40;</span>item2.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">x</span> + item2.<span class="me1">options</span>.<span class="me1">radius</span><span class="br0">&#41;</span> -</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>item1.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">x</span> + item1.<span class="me1">options</span>.<span class="me1">radius</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; distance.<span class="me1">y</span> = <span class="br0">&#40;</span>item2.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">y</span> + item2.<span class="me1">options</span>.<span class="me1">radius</span><span class="br0">&#41;</span> -</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>item1.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">y</span> + item1.<span class="me1">options</span>.<span class="me1">radius</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; &nbsp; &nbsp; &nbsp; distance.<span class="me1">total</span> = Math.<span class="me1">sqrt</span><span class="br0">&#40;</span>Math.<span class="me1">pow</span><span class="br0">&#40;</span>distance.<span class="me1">x</span>, <span class="nu0">2</span><span class="br0">&#41;</span> + Math.<span class="me1">pow</span><span class="br0">&#40;</span>distance.<span class="me1">y</span>, <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>distance.<span class="me1">total</span> <span class="sy0">&lt;</span> $<span class="br0">&#40;</span><span class="st0">&#39;distance&#39;</span><span class="br0">&#41;</span>.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&#39;value&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> angle = Math.<span class="me1">atan2</span><span class="br0">&#40;</span>distance.<span class="me1">y</span>, distance.<span class="me1">x</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> speed = <span class="nu0">1000</span> <span class="sy0">/</span> distance.<span class="me1">total</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item1.<span class="me1">options</span>.<span class="me1">speed</span>.<span class="me1">x</span> += -speed <span class="sy0">*</span> Math.<span class="me1">cos</span><span class="br0">&#40;</span>angle<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item1.<span class="me1">options</span>.<span class="me1">speed</span>.<span class="me1">y</span> += -speed <span class="sy0">*</span> Math.<span class="me1">sin</span><span class="br0">&#40;</span>angle<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>item1.<span class="me1">options</span>.<span class="me1">speed</span>.<span class="me1">x</span> <span class="sy0">||</span> item1.<span class="me1">options</span>.<span class="me1">speed</span>.<span class="me1">y</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; item1.<span class="me1">moveTo</span><span class="br0">&#40;</span>item1.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">x</span> + item1.<span class="me1">options</span>.<span class="me1">speed</span>.<span class="me1">x</span> <span class="sy0">*</span> <span class="br0">&#40;</span>self.<span class="me1">options</span>.<span class="me1">interval</span><span class="sy0">/</span><span class="nu0">1000</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;item1.<span class="me1">options</span>.<span class="me1">position</span>.<span class="me1">y</span> + item1.<span class="me1">options</span>.<span class="me1">speed</span>.<span class="me1">y</span> <span class="sy0">*</span> <span class="br0">&#40;</span>self.<span class="me1">options</span>.<span class="me1">interval</span><span class="sy0">/</span><span class="nu0">1000</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</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; draw: <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">this</span>.<span class="me1">items</span>.<span class="me1">each</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="kw1">item</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">item</span>.<span class="me1">draw</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="br0">&#125;</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; addRandom: <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">this</span>.<span class="me1">addItem</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; position: <span class="br0">&#123;</span> x: Random.<span class="me1">get</span><span class="br0">&#40;</span><span class="nu0">100</span>,<span class="nu0">500</span><span class="br0">&#41;</span>, y: Random.<span class="me1">get</span><span class="br0">&#40;</span><span class="nu0">100</span>,<span class="nu0">400</span><span class="br0">&#41;</span> <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; color: <span class="st0">&#39;rgb(&#39;</span>+Random.<span class="me1">get</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">255</span><span class="br0">&#41;</span>+<span class="st0">&#39;,&#39;</span>+Random.<span class="me1">get</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">255</span><span class="br0">&#41;</span>+<span class="st0">&#39;,&#39;</span>+Random.<span class="me1">get</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">255</span><span class="br0">&#41;</span>+<span class="st0">&#39;)&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</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"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">window.<span class="me1">addEvent</span><span class="br0">&#40;</span><span class="st0">&#39;domready&#39;</span>, <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; window.<span class="me1">system</span> = <span class="kw2">new</span> ItemController<span class="br0">&#40;</span><span class="br0">&#123;</span>autostart: <span class="kw2">true</span>, interval: <span class="nu0">50</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <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">20</span>;i++<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; system.<span class="me1">addRandom</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; $<span class="br0">&#40;</span><span class="st0">&#39;btnAddRandom&#39;</span><span class="br0">&#41;</span>.<span class="me1">addEvent</span><span class="br0">&#40;</span><span class="st0">&#39;click&#39;</span>, <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; system.<span class="me1">addRandom</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>The code is very similar to the <a href="http://dev.enekoalonso.com/2008/12/18/gravity-in-the-dom/">Gravity demo</a>, although in this case the attraction becomes repulsion.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>February 19, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/19/having-fun-with-mooml-and-twitter/" title="Having fun with Mooml &#038; Twitter">Having fun with Mooml &#038; Twitter</a> (0)</li><li>October 5, 2010 -- <a href="http://dev.enekoalonso.com/2010/10/05/javascript-console-in-the-terminal-command-line/" title="Javascript console in the terminal (command line)">Javascript console in the terminal (command line)</a> (1)</li><li>September 17, 2010 -- <a href="http://dev.enekoalonso.com/2010/09/17/mootools-core-for-server-and-mobile-development/" title="MooTools Core for Server and Mobile Development">MooTools Core for Server and Mobile Development</a> (1)</li><li>May 22, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/" title="More WebSockets, now with Python!">More WebSockets, now with Python!</a> (9)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2009/01/04/repulsive-force-in-javascript-with-mootols-draggables/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

