二维向量类

package com.codeTooth.actionscript.lang.utils.geom
{
        import flash.display.Graphics;
        
        /**
         * 
         * 一个基本的二维向量类
         * @author      Keith Peters(http://www.bit-101.com/)
         */
        public class Vector2D
        {
                private var _x:Number;
                private var _y:Number;
                
                /**
                 * Constructor.
                 */
                public function Vector2D(x:Number = 0, y:Number = 0)
                {
                        _x = x;
                        _y = y;
                }
                
                /**
                 * Can be used to visualize the vector. Generally used for debug purposes only.
                 * @param graphics The Graphics instance to draw the vector on.
                 * @param color The color of the line used to represent the vector.
                 */
                public function draw(graphics:Graphics, color:uint = 0, offsetX:Number = 0, offsetY:Number = 0):void
                {
                        graphics.lineStyle(0, color);
                        graphics.moveTo(0 + offsetX, 0 + offsetY);
                        graphics.lineTo(_x + offsetX, _y + offsetY);
                }
                
                /**
                 * Generates a copy of this vector.
                 * @return Vector2D A copy of this vector.
                 */
                public function clone():Vector2D
                {
                        return new Vector2D(x, y);
                }
                
                /**
                 * Sets this vector's x and y values, and thus length, to zero.
                 * @return Vector2D A reference to this vector.
                 */
                public function zero():Vector2D
                {
                        _x = 0;
                        _y = 0;
                        return this;
                }
                
                /**
                 * Whether or not this vector is equal to zero, i.e. its x, y, and length are zero.
                 * @return Boolean True if vector is zero, otherwise false.
                 */
                public function isZero():Boolean
                {
                        return _x == 0 && _y == 0;
                }
                
                /**
                 * Sets / gets the length or magnitude of this vector. Changing the length will change the x and y but not the angle of this vector.
                 */
                public function set length(value:Number):void
                {
                        var a:Number = angle;
                        _x = Math.cos(a) * value;
                        _y = Math.sin(a) * value;
                }
                public function get length():Number
                {
                        return Math.sqrt(lengthSQ);
                }
                
                /**
                 * Gets the length of this vector, squared.
                 */
                public function get lengthSQ():Number
                {
                        return _x * _x + _y * _y;
                }
                
                /**
                 * Gets / sets the angle of this vector. Changing the angle changes the x and y but retains the same length.
                 */
                public function set angle(value:Number):void
                {
                        var len:Number = length;
                        _x = Math.cos(value) * len;
                        _y = Math.sin(value) * len;
                }
                public function get angle():Number
                {
                        return Math.atan2(_y, _x);
                }
                
                /**
                 * Normalizes this vector. Equivalent to setting the length to one, but more efficient.
                 * @return Vector2D A reference to this vector. 
                 */
                public function normalize():Vector2D
                {
                        if(length == 0)
                        {
                                _x = 1;
                                return this;
                        }
                        var len:Number = length;
                        _x /= len;
                        _y /= len;
                        return this;
                }
                
                /**
                 * Ensures the length of the vector is no longer than the given value.
                 * @param max The maximum value this vector should be. If length is larger than max, it will be truncated to this value.
                 * @return Vector2D A reference to this vector.
                 */
                public function truncate(max:Number):Vector2D
                {
                        length = Math.min(max, length);
                        return this;
                }
                
                /**
                 * Reverses the direction of this vector.
                 * @return Vector2D A reference to this vector.
                 */
                public function reverse():Vector2D
                {
                        _x = -_x;
                        _y = -_y;
                        return this;
                }
                
                /**
                 * Whether or not this vector is normalized, i.e. its length is equal to one.
                 * @return Boolean True if length is one, otherwise false.
                 */
                public function isNormalized():Boolean
                {
                        return length == 1.0;
                }
                
                /**
                 * Calculates the dot product of this vector and another given vector.
                 * @param v2 Another Vector2D instance.
                 * @return Number The dot product of this vector and the one passed in as a parameter.
                 */
                public function dotProd(v2:Vector2D):Number
                {
                        return _x * v2.x + _y * v2.y;
                }
                
                /**
                 * Calculates the cross product of this vector and another given vector.
                 * @param v2 Another Vector2D instance.
                 * @return Number The cross product of this vector and the one passed in as a parameter.
                 */
                public function crossProd(v2:Vector2D):Number
                {
                        return _x * v2.y - _y * v2.x;
                }
                
                /**
                 * Calculates the angle between two vectors.
                 * @param v1 The first Vector2D instance.
                 * @param v2 The second Vector2D instance.
                 * @return Number the angle between the two given vectors.
                 */
                public static function angleBetween(v1:Vector2D, v2:Vector2D):Number
                {
                        if(!v1.isNormalized()) v1 = v1.clone().normalize();
                        if(!v2.isNormalized()) v2 = v2.clone().normalize();
                        return Math.acos(v1.dotProd(v2));
                }
                
                /**
                 * Determines if a given vector is to the right or left of this vector.
                 * @return int If to the left, returns -1. If to the right, +1.
                 */
                public function sign(v2:Vector2D):int
                {
                        return perp.dotProd(v2) < 0 ? -1 : 1;
                }
                
                /**
                 * 提供sign的一个快速的方法。此方法比sign快,避免了原本sign中需要创建对象的步骤。
                 * 
                 * @author      jim
                 * 
                 * @param       v2
                 * @return
                 */
                public function signQuickly(v2:Vector2D):int
                {
                        return (-_y * v2.x + _x * v2.y) < 0 ? -1 : 1;
                }
                
                /**
                 * Finds a vector that is perpendicular to this vector.
                 * @return Vector2D A vector that is perpendicular to this vector.
                 */
                public function get perp():Vector2D
                {
                        return new Vector2D(-y, x);
                }
                
                /**
                 * Calculates the distance from this vector to another given vector.
                 * @param v2 A Vector2D instance.
                 * @return Number The distance from this vector to the vector passed as a parameter.
                 */
                public function dist(v2:Vector2D):Number
                {
                        return Math.sqrt(distSQ(v2));
                }
                
                /**
                 * Calculates the distance squared from this vector to another given vector.
                 * @param v2 A Vector2D instance.
                 * @return Number The distance squared from this vector to the vector passed as a parameter.
                 */
                public function distSQ(v2:Vector2D):Number
                {
                        var dx:Number = v2.x - x;
                        var dy:Number = v2.y - y;
                        return dx * dx + dy * dy;
                }
                
                /**
                 * Adds a vector to this vector, creating a new Vector2D instance to hold the result.
                 * @param v2 A Vector2D instance.
                 * @return Vector2D A new vector containing the results of the addition.
                 */
                public function add(v2:Vector2D):Vector2D
                {
                        return new Vector2D(_x + v2.x, _y + v2.y);
                }
                
                /**
                 * Subtacts a vector to this vector, creating a new Vector2D instance to hold the result.
                 * @param v2 A Vector2D instance.
                 * @return Vector2D A new vector containing the results of the subtraction.
                 */
                public function subtract(v2:Vector2D):Vector2D
                {
                        return new Vector2D(_x - v2.x, _y - v2.y);
                }
                
                /**
                 * Multiplies this vector by a value, creating a new Vector2D instance to hold the result.
                 * @param v2 A Vector2D instance.
                 * @return Vector2D A new vector containing the results of the multiplication.
                 */
                public function multiply(value:Number):Vector2D
                {
                        return new Vector2D(_x * value, _y * value);
                }
                
                /**
                 * Divides this vector by a value, creating a new Vector2D instance to hold the result.
                 * @param v2 A Vector2D instance.
                 * @return Vector2D A new vector containing the results of the division.
                 */
                public function divide(value:Number):Vector2D
                {
                        return new Vector2D(_x / value, _y / value);
                }
                
                /**
                 * Indicates whether this vector and another Vector2D instance are equal in value.
                 * @param v2 A Vector2D instance.
                 * @return Boolean True if the other vector is equal to this one, false if not.
                 */
                public function equals(v2:Vector2D):Boolean
                {
                        return _x == v2.x && _y == v2.y;
                }
                
                /**
                 * Sets / gets the x value of this vector.
                 */
                public function set x(value:Number):void
                {
                        _x = value;
                }
                public function get x():Number
                {
                        return _x;
                }
                
                /**
                 * Sets / gets the y value of this vector.
                 */
                public function set y(value:Number):void
                {
                        _y = value;
                }
                public function get y():Number
                {
                        return _y;
                }
                
                /**
                 * Generates a string representation of this vector.
                 * @return String A description of this vector.
                 */
                public function toString():String
                {
                        return "[Vector2D (x:" + _x + ", y:" + _y + ")]";
                }
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值