/** * ... * @author Andreas Rønning * @version 0.1 */ package no.doomsday.aronning.math { import flash.display.Shape; public class { public var x:Number; public var y:Number; /** * Creates a new 2D vector * @param x * @param y */ function Vector2(x:Number = 0,y:Number = 0){ this.x = x; this.y = y; } /** * Set both components to 0 */ public function zero():void{ x = y = 0; } /** * Reverses both components */ public function inverse():void { //legacy x = ~x + 1; x = ~y + 1; } /** * Reverses both components */ public function reverse():void { x = ~x + 1; x = ~y + 1; } public function get magnitude():Number{ return Math.sqrt(x*x+y*y); } /** * Retrieve this vector's unit vector * @return * A new Vector2 instance */ public function getUnit():Vector2{ return new Vector2(x/magnitude, y/magnitude); } /** * Retrieve this vector's normal vector * @return * A new Vector2 instance */ public function getNormal():Vector2{ return new Vector2(-y,x); } /** * Truncates the vector to a maximum magnitude * Positive values also count to truncate negative values * @param max * The maximum magnitude of this vector */ public function truncate(max:Number):void { var mag:Number = Math.sqrt(x*x+y*y); if((mag ^ (mag >> 31)) - (mag >> 31) > (max ^ (max >> 31)) - (max >> 31)){ var v:Vector2 = getUnit(); x = v.x*max; y = v.y*max; } } /** * Clone this vector * @return * A duplicate Vector2 */ public function clone():Vector2{ return new Vector2(x,y); } /** * Multiply both vector components by a scalar * @param scalar */ public function scale(scalar:Number){ x*=scalar; y*=scalar; } /** * Get a string representation of this vector * @return * A string */ public function toString():String{ return "Vector2 x:"+x+" y:"+y; } /** * Get a shape representation of this vector * @return * A shape instance */ public function render():Shape{ var shape:Shape = new Shape(); shape.graphics.lineStyle(1,0); //direction shape.graphics.lineTo(x,y); //normal shape.graphics.moveTo(0,0); shape.graphics.lineStyle(1,0xFF0000); var n:Vector2 = getNormal(); shape.graphics.lineTo(n.x,n.y); return shape; } private static function getComponent(vector:Vector2,directionVector:Vector2):Number{ var alpha:Number = Math.atan2(directionVector.y,directionVector.x); var theta:Number = Math.atan2(vector.y,vector.x); var mag:Number = vector.magnitude; var a:Number = mag*Math.cos(theta-alpha); return a; } /** * Get a component vector from a source vector and a direction * @param vector * The source Vector2 * @param directionVector * A Vector2 representing a direction * @return */ public static function getComponentVector(vector:Vector2,directionVector:Vector2):Vector2{ var v:Vector2 = directionVector.getUnit(); var component:Number = getComponent(vector,directionVector); var vec:Vector2 = new Vector2(); vec.x = v.x*component; vec.y = v.y*component; return vec; } /** * Subtract one Vector2 from another * @param v1 * A Vector2 instance * @param v2 * A Vector2 instance * @return * A new Vector2 instance */ public static function subtract(v1:Vector2,v2:Vector2):Vector2{ //v-u = -u+v var v:Vector2 = v1.clone(); var u:Vector2 = v2.clone(); u.inverse(); return new Vector2(u.x + v.x, u.y + v.y); } /** * Add two Vector2 instances together * @param v1 * A Vector2 instance * @param v2 * A Vector2 instance * @return * A new Vector2 instance */ public static function add(v1:Vector2,v2:Vector2):Vector2{ return new Vector2(v1.x+v2.x,v1.y+v2.y); } /** * Get the dot product of two vectors * @param v1 * A Vector2 instance * @param v2 * A Vector2 instance * @return * The dot product as a number */ public static function dot(v1:Vector2,v2:Vector2):Number{ var n1:Vector2 = v1.getUnit(); var n2:Vector2 = v2.getUnit(); return n1.x*n2.x+n1.y*n2.y; } } }