as3中基本的2D矢量类:Vector_2D

分享这个2D空间的矢量类,也因为我的博客上讲到的很多东西都用到了这个类。
//Vector_2D.as

package
{
    
    
    /**
        author: Vily
        本类实现2D空间当中矢量的基本属性和行为
    
*/
    
    public class Vector_2D{
        
        public var x:Number = 0;
        public var y:Number = 0;
        public function Vector_2D(px:Number = 0, py:Number = 0) {
            x = px;
            y = py;
        }        
        
        public function clone():Vector_2D {
            return new Vector_2D(this.x,this.y);
        }
        /**
            计算自身和矢量v点乘
        
*/
        public function dot(v:Vector_2D):Number {
            return x * v.x + y * v.y;
        }
        /**//**
            计算自身和矢量v点乘后的新矢量
        
*/
        public function dotNew(v:Vector_2D):Vector_2D {
            return new Vector_2D(x * v.x, y * v.y);
        }
        /**//**
            计算自身和矢量v的叉乘(按照右手定则)
            @return        返回值顺时针为正,逆时针为负, 等于0表示完两矢量夹角为180/0度
        
*/
        public function cross(v:Vector_2D):Number {
            
            return x * v.y - y * v.x;
        }
        /**//**
            计算自身和矢量v点乘的合
        
*/
        public function plus(v:Vector_2D):void {
            x += v.x;
            y += v.y;
        }
        public function plusNew(v:Vector_2D):Vector_2D {
            return new Vector_2D(x + v.x, y + v.y); 
        }
        /**//**
            计算自身和矢量v点乘的差
        
*/
        public function minus(v:Vector_2D):void {
            x -= v.x;
            y -= v.y;
        }
        
        public function minusNew(v:Vector_2D):Vector_2D {
            return new Vector_2D(x - v.x, y - v.y);    
        }
        /**//**
            计算自身和矢量标量s的乘积
        
*/
        public function mult(s:Number):void {
            x *= s;
            y *= s;
        }
        public function multNew(s:Number):Vector_2D {
            return new Vector_2D(x * s, y * s);
        }
        /**//**
            计算自身除以s
        
*/
        public function divide(s:Number):void{
            if(s<=0.00001){
                trace("分母不能为零");
            }else{
                x /= s;
                y /= s;
            }            
        }
        public function divideNew(s:Number):Vector_2D{
            if(s<=0){
                trace("分母不能为零");
            }else{
                return new Vector_2D(x/s,y/s);
            }
            return clone();
        }
        /**//**
            判断自己和矢量v是否相同
            @param            v 用于和自己做比较的矢量
            @return            返回true表示相同,否则就不同
        
*/
        public function equals(v:Vector_2D):Boolean {
            /**//**
                判断自己是否与矢量v相等
            
*/
            if(this.x == v.x && this.y == v.y){
                return true;
            }
            return false;
        }
        public function distance(v:Vector_2D):Number {
            var dx:Number = x - v.x;
            var dy:Number = y - v.y;
            return Math.sqrt(dx * dx + dy * dy);
        }
    
        //规范化(或单位化),得到和自身方向相同的单位矢量
        public function normalize():Vector_2D {
              var mag:Number = Math.sqrt(x * x + y * y);
              if(mag<=0){
                x = 0;
                y = 0;
                trace("Error:publicOrg.vily.primitives.Vector_2D::normalize()零矢量不能规范化");
                return this;
            }
              x /= mag;
            y /= mag;
            return this;
        }
        /**//**
            计算幅 , 模, 自身的值表示的点到原点连线的长度
        
*/
        public function magnitude():Number {
            return Math.sqrt(x * x + y * y);
        }
        /**//**
            计算自身的模的平方值
        
*/
        public function squareMagnitude():Number {            
            return (x * x + y * y);
        }
        /**//**
         *     计算自己在任意矢量v上的投影
        *    @param        v 为任意矢量
        *    @return        返回自身的投影的矢量
         
*/
        public function project(v:Vector_2D):Vector_2D {
            //计算自己在 b到原点连线 上的射影的新矢量
            var adotb:Number = this.dot(v);
            var len:Number = (v.x * v.x + v.y * v.y);
        
            var proj:Vector_2D = new Vector_2D(0,0);
            proj.x = (adotb / len) * v.x;
            proj.y = (adotb / len) * v.y;
            return proj;
        }
        // 以原点为中心使自己从当前的位置旋转rad弧度
        public function rotate(rad:Number):void{
            var p_x:Number = this.x;
            var p_y:Number = this.y;
            this.x = p_x * Math.cos(rad) - p_y * Math.sin(rad);
            this.y = p_x * Math.sin(rad) + p_y * Math.cos(rad);
        }
        /**//**
         *     计算自己在单位矢量n上的投影
        *    @param        n 单位矢量
         
*/
        public function projectN(n:Vector_2D):void {
            //计算自己在 n -- 单位向量到原点连线 上的射影的新矢量
            var adotb:Number = this.dot(n);
            this.x = n.x * adotb;
            this.y = n.y * adotb;
        }        
        /**//**
            @return        返回自身的值表示的点和原点的连线 与 水平向右的x轴之间夹角的弧度值(0 -> 2*PI)
        
*/
        public function getRadian():Number{
            //返回相对于(start_x,start_y)点的角度的弧度值
            
//计算现在位置变化后的方向弧度值
            var radians:Number = Math.atan(y/x);
            if(isNaN(radians)){
                return Math.PI/2;
            }
            if(y>=0 && x>=0){
                 return radians;
            }else if(y<0 && x>=0){
                radians = 2*Math.PI+radians;
                return radians;
            }else{
                radians = Math.PI+radians;
                return radians;
            }
        }
        /**//**
            @return        返回自身的值表示的点和原点的连线 与 水平向右的x轴之间夹角的角度值(0 -> 360)
        
*/
        public function getAngle():Number{
            //返回相对于(start_x,start_y)点的角度
            
//计算现在位置变化后的方向角度值
            var angle:Number = Math.atan(y/x) * 180/Math.PI;    
            if(y>=0 && x>=0){         
                return Math.round(angle);
            }else if(y<0 && x>=0){
                return Math.round(360+angle);
            }else{
                return Math.round(180+angle);    
            }
        }
        public function toString():String{
            return "x: "+ x+"  y: "+y;
        }
    }
}

// 

posted @ 2009-09-16 13:36  vily_雷  阅读(2336)  评论(0编辑  收藏  举报