as3 2d向量类 Vector2D

package Math2
{
	public class Vector2D
	{
		private var _x:Number; 
		private var _y:Number; 
		
		public function Vector2D(x:Number,y:Number)
		{
			_x = x;
			_y = 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 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 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 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 dotProd(v2:Vector2D):Number{ 
			return _x*v2.x+_y*v2.y; 
		} 
		
		//判断两向量是否垂直 
		public function crossProd(v2:Vector2D):Number{ 
			return _x*v2.y-_y*v2.x == 0; 
		}
		
		//返回两向量夹角的弦度值 
		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; 
		} 
		
		

		public function get x():Number
		{
			return _x;
		}

		public function set x(value:Number):void
		{
			_x = value;
		}

		public function get y():Number
		{
			return _y;
		}

		public function set y(value:Number):void
		{
			_y = value;
		}


	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值