模拟物体在2D平面投影坐标,是模拟2D物体在屏幕上的移动,旋转,色彩等变化的最基础的类
- package org.base {
- public class Vector {
- public var x : Number;
- public var y : Number;
- public function Vector(tx : Number, ty : Number) {
- x = tx;
- y = ty;
- }
- //得到数据
- public function toString():String {
- var rx = Math.round (x * 1000) / 1000;
- var ry = Math.round (y * 1000) / 1000;
- return "["+rx+","+ry+"]";
- }
- //设置数据
- public function reset(tx : Number, ty : Number) {
- x = tx;
- y = ty;
- }
- //复制Vector
- public function getClone():Vector {
- return new Vector(x,y);
- }
- //比较两个向量是否等同
- public function equals(v : Vector):Boolean {
- return x == v.x && y == v.y;
- }
- //向量的加法
- public function plus(v : Vector) {
- x += v.x;
- y += v.y;
- }
- //相加后返回新的向量
- public function plusNew(v : Vector) {
- return new Vector(x + v.x,y + v.y);
- }
- //向量相减
- public function minus(v : Vector) {
- x -= v.x;
- y -= v.y;
- }
- //相减后返回新的向量
- public function minusNew(v : Vector):Vector {
- return new Vector(x - v.x,y - v.y);
- }
- //逆向量
- public function negate() {
- x = - x;
- y = - y;
- }
- //判断是否互逆
- public function isNegate(v : Vector):Boolean {
- return x == - v.x && y == - v.y;
- }
- //逆向量后返回新向量
- public function negateNew():Vector {
- return new Vector(- x,- y);
- }
- //向量缩放
- public function scale(s : Number) {
- x *= s;
- y *= s;
- }
- //向量缩放后返后新的向量
- public function scaleNew(s : Number):Vector {
- return new Vector(x * s,y * s);
- }
- //向量的长度
- public function getLength():Number {
- return Math.sqrt(x * x + y * y);
- }
- //设定向量的长度
- public function setLength(l) {
- var r = getLength ();
- r == 0?x = l : scale (l / r);
- }
- //向量的角度
- public function getAngle():Number {
- return atan2D(y,x);
- }
- //设置向量的角度
- public function setAngle(angle : Number) {
- var r = getLength ();
- x = r * acosD (angle);
- y = r * asinD (angle);
- }
- //向量的旋转
- //左旋转angle>0右旋转angle<0
- public function rotate(angle : Number) {
- var ca = acosD (angle);
- var sa = asinD (angle);
- var rx = x * ca - y * sa;
- var ry = x * sa + y * ca;
- x = rx;
- y = ry;
- }
- //旋转后返回新向量
- public function rotateNew(angle : Number):Vector {
- var v = new Vector (x, y);
- v.rotate(angle);
- return v;
- }
- //向量的点积
- public function dot(v : Vector):Number {
- return (x * v.x + y * v.y);
- }
- //得到法向量(垂直向量)
- public function getNormal():Vector {
- return new Vector(- y,x);
- }
- //验证是否垂直
- public function isPerpTo(v : Vector):Boolean {
- return dot(v) == 0;
- }
- //向量的夹角
- public function angleBetween(v : Vector):Number {
- if (equals (v)) {
- return 0;
- }
- if (isNegate (v)) {
- return 180;
- }
- var dp : Number = dot (v);
- var ca : Number = dp / (getLength () * v.getLength ());
- var cs : Number = acosD (ca);
- return cs;
- }
- /**
- * 私有方法分别计算一个弧度的正弦对应的角度和余弦对象的角度
- * @param radian 一个弧度值
- */
- private function acosD(radian:Number):Number {
- return Math.cos(radian * Math.PI / 180);
- }
- private function asinD(radian:Number):Number {
- return Math.sin(radian * Math.PI / 180);
- }
- private function atan2D(x:Number,y:Number):Number {
- return Math.atan2(y,x)*(180/Math.PI);
- }
- }
- }