UNPKG

vector2-node

Version:

An object representing a 2D vector.

555 lines (406 loc) 20.7 kB
<!DOCTYPE html> <html> <head> <title>Vector2</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <ul class="sections"> <li id="section-1"> <div class="annotation"> <div class="pilwrap for-h1"> <a class="pilcrow" href="#section-1">&#182;</a> </div> <h1>Vector2</h1> <p>An object representing a 2D vector. Based on the <a href="http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Vector2.html">Vector2 class from LibGDX.</a></p> </div> </li> <li id="section-2"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-2">&#182;</a> </div> <p>Written by <a href="http://rahatah.me/d">Rahat Ahmed</a>.</p> </div> </li> <li id="section-3"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-3">&#182;</a> </div> <h2>Vector2(Vector2)</h2> <h2>Vector2(x, y)</h2> <p>Constructor for Vector2.</p> </div> <div class="content"><div class='highlight'><pre><span class="function"><span class="keyword">function</span> <span class="title">Vector2</span><span class="params">(x, y)</span> {</span> <span class="keyword">this</span>.set(x, y); }</pre></div></div> </li> <li id="section-4"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-4">&#182;</a> </div> <h2>add(Vector2)</h2> <h2>add(x, y)</h2> <p>Adds given values to this vector. Returns this vector for chaining.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.add = <span class="keyword">function</span>(x, y) { <span class="keyword">if</span>(x <span class="keyword">instanceof</span> Vector2) { <span class="keyword">this</span>.x += x.x; <span class="keyword">this</span>.y += x.y; } <span class="keyword">else</span> { <span class="keyword">this</span>.x += x || <span class="number">0</span>; <span class="keyword">this</span>.y += y || <span class="number">0</span>; } <span class="keyword">return</span> <span class="keyword">this</span>; };</pre></div></div> </li> <li id="section-5"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-5">&#182;</a> </div> <h2>angle</h2> <h3>angle()</h3> <p>Returns the angle in radians of this vector relative to the x-axis (counter-clockwise) in the range 0 to 2 * PI.</p> <h3>angle(radians)</h3> <p>Rotates this vector to the given angle in radians. Returns this vector for chaining.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.angle = <span class="keyword">function</span>(rad) { <span class="keyword">if</span>(rad !== <span class="literal">undefined</span>) <span class="keyword">return</span> <span class="keyword">this</span>.set(<span class="keyword">this</span>.length(), <span class="number">0</span>).rotate(rad); <span class="keyword">var</span> angle = Math.atan2(<span class="keyword">this</span>.y, <span class="keyword">this</span>.x); <span class="keyword">if</span>(angle &lt; <span class="number">0</span>) angle += Math.PI*<span class="number">2</span>; <span class="keyword">return</span> angle; };</pre></div></div> </li> <li id="section-6"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-6">&#182;</a> </div> <h2>angleDeg</h2> <h3>angleDeg()</h3> <p>Same as angle() but in degrees.</p> <h3>angleDeg(degrees)</h3> <p>Same as angle(radians) but in degrees.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.angleDeg = <span class="keyword">function</span>(deg) { <span class="keyword">if</span>(deg !== <span class="literal">undefined</span>) <span class="keyword">return</span> <span class="keyword">this</span>.angle(deg / <span class="number">180</span> * Math.PI); <span class="keyword">return</span> <span class="keyword">this</span>.angle() * <span class="number">180</span> / Math.PI; };</pre></div></div> </li> <li id="section-7"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-7">&#182;</a> </div> <h2>clone()</h2> <h2>copy()</h2> <p>Returns a new identical Vector2.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.clone = Vector2.prototype.copy = <span class="keyword">function</span>() { <span class="keyword">return</span> <span class="keyword">new</span> Vector2(<span class="keyword">this</span>.x, <span class="keyword">this</span>.y); };</pre></div></div> </li> <li id="section-8"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-8">&#182;</a> </div> <h2>cross(Vector2)</h2> <h2>cross(x, y)</h2> <p>Returns the cross product of this vector and another.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.cross = <span class="keyword">function</span>(x, y) { <span class="keyword">if</span>(x <span class="keyword">instanceof</span> Vector2) <span class="keyword">return</span> <span class="keyword">this</span>.x * x.y - <span class="keyword">this</span>.y * x.x; <span class="keyword">return</span> <span class="keyword">this</span>.x * y - <span class="keyword">this</span>.y * x; };</pre></div></div> </li> <li id="section-9"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-9">&#182;</a> </div> <h2>distance(Vector2)</h2> <h2>distance(x, y)</h2> <p>Returns the distance between this vector and another.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.distance = <span class="keyword">function</span>(x, y) { <span class="keyword">var</span> distSq = <span class="keyword">this</span>.distanceSq(x, y); <span class="keyword">if</span>(distSq === <span class="literal">undefined</span>) <span class="keyword">return</span> <span class="literal">undefined</span>; <span class="keyword">return</span> Math.sqrt(distSq); };</pre></div></div> </li> <li id="section-10"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-10">&#182;</a> </div> <h2>distanceSq(Vector2)</h2> <h2>distanceSq(x, y)</h2> <p>Returns the distance squared of this vector and another.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.distanceSq = <span class="keyword">function</span>(x, y) { <span class="keyword">var</span> dx, dy; <span class="keyword">if</span>(x <span class="keyword">instanceof</span> Vector2) { dx = x.x - <span class="keyword">this</span>.x; dy = x.y - <span class="keyword">this</span>.y; } <span class="keyword">else</span> <span class="keyword">if</span>(y !== <span class="literal">undefined</span>) { dx = x - <span class="keyword">this</span>.x; dy = y - <span class="keyword">this</span>.y; } <span class="keyword">else</span> <span class="keyword">return</span> <span class="literal">undefined</span>; <span class="keyword">return</span> dx * dx + dy * dy; };</pre></div></div> </li> <li id="section-11"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-11">&#182;</a> </div> <h2>dot(Vector2)</h2> <h2>dot(x, y)</h2> <p>Returns the dot product of this vector and another.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.dot = <span class="keyword">function</span>(x, y) { <span class="keyword">if</span>(x <span class="keyword">instanceof</span> Vector2) <span class="keyword">return</span> <span class="keyword">this</span>.x * x.x + <span class="keyword">this</span>.y * x.y; <span class="keyword">return</span> <span class="keyword">this</span>.x * x + <span class="keyword">this</span>.y * y; };</pre></div></div> </li> <li id="section-12"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-12">&#182;</a> </div> <h2>equals</h2> <h3>equals(Vector2)</h3> <p>Returns true if this and another vector2 are equal.</p> <h3>equals(Vector2, epsilon)</h3> <p>Returns true if this and another vector2 are equal within an epsilon.</p> <h3>equals(x, y)</h3> <p>Returns true if this vector equals given x, y components.</p> <h3>equals(x, y, epsilon)</h3> <p>Returns true if this vector equasl given x, y components within an epsilon.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.equals = <span class="keyword">function</span>(x, y, epsilon) { <span class="keyword">if</span>(x <span class="keyword">instanceof</span> Vector2) { y = y || <span class="number">0</span>; <span class="keyword">return</span> Math.abs(<span class="keyword">this</span>.x - x.x) &lt;= y &amp;&amp; Math.abs(<span class="keyword">this</span>.y - x.y) &lt;= y; } <span class="keyword">else</span> <span class="keyword">if</span>(y !== <span class="literal">undefined</span>) { epsilon = epsilon || <span class="number">0</span>; <span class="keyword">return</span> Math.abs(<span class="keyword">this</span>.x - x) &lt;= epsilon &amp;&amp; Math.abs(<span class="keyword">this</span>.y - y) &lt;= epsilon; } <span class="keyword">else</span> <span class="keyword">return</span> <span class="literal">false</span>; };</pre></div></div> </li> <li id="section-13"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-13">&#182;</a> </div> <h2>length()</h2> <p>Returns the length of this vector.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.length = <span class="keyword">function</span>() { <span class="keyword">return</span> Math.sqrt(<span class="keyword">this</span>.lengthSq()); };</pre></div></div> </li> <li id="section-14"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-14">&#182;</a> </div> <h2>lengthSq()</h2> <p>Returns the length squared of this vector.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.lengthSq = <span class="keyword">function</span>() { <span class="keyword">return</span> <span class="keyword">this</span>.x * <span class="keyword">this</span>.x + <span class="keyword">this</span>.y * <span class="keyword">this</span>.y; };</pre></div></div> </li> <li id="section-15"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-15">&#182;</a> </div> <h2>negate()</h2> <p>Negates this vector. (Multiplies x and y by -1). Returns this vector for chaining.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.negate = <span class="keyword">function</span>() { <span class="keyword">return</span> <span class="keyword">this</span>.scale(-<span class="number">1</span>); };</pre></div></div> </li> <li id="section-16"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-16">&#182;</a> </div> <h2>normalize()</h2> <p>Normalizes this vector. Returns this vector for chaining.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.normalize = <span class="keyword">function</span>() { <span class="keyword">return</span> <span class="keyword">this</span>.scale(<span class="number">1</span>/<span class="keyword">this</span>.length()); };</pre></div></div> </li> <li id="section-17"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-17">&#182;</a> </div> <h2>rotate(radians)</h2> <p>Rotates this vector by an angle in degrees counter-clockwise. Returns this vector for chaining.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.rotate = <span class="keyword">function</span>(rad) { <span class="keyword">var</span> cos = Math.cos(rad); <span class="keyword">var</span> sin = Math.sin(rad); <span class="keyword">return</span> <span class="keyword">this</span>.set(<span class="keyword">this</span>.x * cos - <span class="keyword">this</span>.y * sin, <span class="keyword">this</span>.x * sin + <span class="keyword">this</span>.y * cos); };</pre></div></div> </li> <li id="section-18"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-18">&#182;</a> </div> <h2>rotateDeg(degrees)</h2> <p>Same as rotate but in degrees.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.rotateDeg = <span class="keyword">function</span>(deg) { <span class="keyword">return</span> <span class="keyword">this</span>.rotate(deg / <span class="number">180</span> * Math.PI) };</pre></div></div> </li> <li id="section-19"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-19">&#182;</a> </div> <h2>scale(scale)</h2> <h2>scale(scaleX, scaleY)</h2> <p>Scales this vector by a scalar. Second argument to scale y separate from x is optional. Returns this vector for chaining.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.scale = <span class="keyword">function</span>(scaleX, scaleY) { <span class="keyword">this</span>.x *= scaleX; <span class="keyword">this</span>.y *= (scaleY || scaleX); <span class="keyword">return</span> <span class="keyword">this</span>; };</pre></div></div> </li> <li id="section-20"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-20">&#182;</a> </div> <h2>set(Vector2)</h2> <h2>set(x, y)</h2> <p>Sets this vector to the given values. Returns this vector for chaining.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.set = <span class="keyword">function</span>(x, y) { <span class="keyword">if</span>(x <span class="keyword">instanceof</span> Vector2) { <span class="keyword">this</span>.x = x.x; <span class="keyword">this</span>.y = x.y; } <span class="keyword">else</span> { <span class="keyword">this</span>.x = x || <span class="number">0</span>; <span class="keyword">this</span>.y = y || <span class="number">0</span>; } <span class="keyword">return</span> <span class="keyword">this</span>; };</pre></div></div> </li> <li id="section-21"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-21">&#182;</a> </div> <h2>setPolar(radians, length)</h2> <p>Set this vector by angle in degrees and magnitude. Returns this vector for chaining.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.setPolar = <span class="keyword">function</span>(rad, length) { <span class="keyword">return</span> <span class="keyword">this</span>.set(length, <span class="number">0</span>).rotate(rad); };</pre></div></div> </li> <li id="section-22"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-22">&#182;</a> </div> <h2>setPolarDeg(degrees, length)</h2> <p>Same as setPolar but in degrees.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.setPolarDeg = <span class="keyword">function</span>(deg, length) { <span class="keyword">return</span> <span class="keyword">this</span>.setPolar(deg / <span class="number">180</span> * Math.PI, length); };</pre></div></div> </li> <li id="section-23"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-23">&#182;</a> </div> <h2>sub(Vector2)</h2> <h2>sub(x, y)</h2> <p>Same as add, but subtracting. Returns this vector for chaining.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.sub = <span class="keyword">function</span>(x, y) { <span class="keyword">if</span>(y !== <span class="literal">undefined</span>) { <span class="keyword">this</span>.x -= x; <span class="keyword">this</span>.y -= y; } <span class="keyword">else</span> { <span class="keyword">this</span>.x -= x.x; <span class="keyword">this</span>.y -= x.y; } <span class="keyword">return</span> <span class="keyword">this</span>; };</pre></div></div> </li> <li id="section-24"> <div class="annotation"> <div class="pilwrap for-h2"> <a class="pilcrow" href="#section-24">&#182;</a> </div> <h2>toString()</h2> <p>Returns a string representation of this vector.</p> </div> <div class="content"><div class='highlight'><pre>Vector2.prototype.toString = <span class="keyword">function</span>() { <span class="keyword">return</span> <span class="string">"("</span> + <span class="keyword">this</span>.x + <span class="string">", "</span> + <span class="keyword">this</span>.y + <span class="string">")"</span>; }; module.exports = Vector2;</pre></div></div> </li> </ul> </div> </body> </html>