AS3 的 2D向量类(Vector2D)

package {
import flash.display.Graphics;

/**
* 2D向量类
*/
public class Vector2D{
   private var _x:Number;
   private var _y:Number;
  
   //构造函数
   public function Vector2D():void{
    _x=x;
    _y=y;
   }
  
   //绘制一条线段
   public function draw(graphics:Graphics,color:uint=0):void{
    graphics.lineStyle(0,color);
    graphics.moveTo(0,0);
    graphics.lineTo(_x,_y);
   }
  
   //复制向量
   public function clone():Vector2D{
    return new Vector2D(x,y);
   }
  
   //将当前向量变成0向量
   public function zero():Vector2D{
    _x=0;
    _y=0;
    return this;
   }
  
   //判断是否是0向量
   public function isZero():Boolean{
    return _x==0 && _y==0;
   }
  
   //设置向量的大小
   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);
   }
  
   //获取当前向量大小的平方
   public function get lengthSQ():Number{
    return _x*_x+_y*_y;
   }
  
   //设置向量的方法
   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);
   }
  
   //将当前向量转化成单位向量
   public function normalize():Vector2D{
    if(length==0){
     _x=1;
     return this;
    }
    var len:Number=length;
    _x/=len;
    _y/=len;
    return this;
   }
  
   //截取当前向量
   public function truncate(max:Number):Vector2D{
    length=Math.min(max,length);
    return this;
   }
  
   //反转向量
   public function reverse():Vector2D{
    _x=-_x;
    _y=-_y;
    return this;
   }
  
   //判断当前向量是否是单位向量
   public function isNormalized():Boolean{
    return length==1.0;
   }
  
   //向量积
   public function doProd(v2:Vector2D):Number{
    return _x*v2.x+_y*v2.y;
   }
  
   //判断两向量是否垂直
   public function crossProd(v2:Vector2D):Number{
    return _x*v2.y-_y*v2.x;
   }
  
   //返回两向量夹角的弦度值
   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));
   }
  
   //返回向量的符号值
   public function sign(v2:Vector2D):int{
    return perp.dotProd(v2)<0?-1:1;
   }
  
   //返回坐标向量
   public function get perp():Vector2D{
    return new Vector2D(-y,x);
   }
  
   //返回当前向量与V2的距离
   public function dist(v2:Vector2D):Number{
    return Math.sqrt(distSQ(v2));
   }
  
   //返回当前向量与V2的距离的平方
   public function distSQ(v2:Vector2D):Number{
    var dx:Number=v2.x-x;
    var dy:Number=v2.y-y;
    return dx*dx+dy*dy;
   }
  
   //两向量相加
   public function add(v2:Vector2D):Vector2D{
    return new Vector2D(_x+v2.x,_y+v2.y);
   }
  
   //两向量相减
   public function subtract(v2:Vector2D):Vector2D{
    return new Vector2D(_x-v2.x,y-v2.y);
   }
  
   //数与向量的乘积
   public function multiply(value:Number):Vector2D{
    return new Vector2D(_x*value,_y*value);
   }
  
   //数与向量的商
   public function divide(value:Number):Vector2D{
    return new Vector2D(_x/value,_y/value);
   }
  
   //判断两向量是否相等
   public function equals(v2:Vector2D):Boolean{
    return _x==v2.x && _y==v2.y;
   }
  
   //设置X坐标
   public function set x(value:Number):void{
    _x=value;
   }
   public function get x():Number{
    return _x;
   }
  
   //设置Y坐标
   public function set y(value:Number):void{
    _y=value;
   }
   public function get y():Number{
    return _y;
   }
  
   //返回对象的字符形式
   public function toString():String{
    return "[Vector2D(X:"+_x+",y:"+_y+")]";
   }
}
}

转载于:https://my.oschina.net/ahuaahua/blog/28937

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值