Vector类

      模拟物体在2D平面投影坐标,是模拟2D物体在屏幕上的移动,旋转,色彩等变化的最基础的类

  1. package org.base {
  2.   public class Vector {
  3.     public var x : Number;
  4.     public var y : Number;
  5.     public function Vector(tx : Number, ty : Number) {
  6.       
  7.       x = tx;
  8.       y = ty;
  9.     
  10.     }
  11.     //得到数据
  12.     public function toString():String {
  13.       var rx = Math.round (x * 1000) / 1000;
  14.       var ry = Math.round (y * 1000) / 1000;
  15.       return "["+rx+","+ry+"]";
  16.     }
  17.     //设置数据
  18.     public function reset(tx : Number, ty : Number) {
  19.       x = tx;
  20.       y = ty;
  21.     }
  22.     //复制Vector
  23.     public function getClone():Vector {
  24.       return new Vector(x,y);
  25.     }
  26.     //比较两个向量是否等同
  27.     public function equals(v : Vector):Boolean {
  28.       return x == v.x && y == v.y;
  29.     }
  30.     //向量的加法
  31.     public function plus(v : Vector) {
  32.       x += v.x;
  33.       y += v.y;
  34.     }
  35.     //相加后返回新的向量
  36.     public function plusNew(v : Vector) {
  37.       return new Vector(x + v.x,y + v.y);
  38.     }
  39.     //向量相减
  40.     public function minus(v : Vector) {
  41.       x -= v.x;
  42.       y -= v.y;
  43.     }
  44.     //相减后返回新的向量
  45.     public function minusNew(v : Vector):Vector {
  46.       return new Vector(x - v.x,y - v.y);
  47.     }
  48.     //逆向量
  49.     public function negate() {
  50.       x = - x;
  51.       y = - y;
  52.     }
  53.     //判断是否互逆
  54.     public function isNegate(v : Vector):Boolean {
  55.       return x == - v.x && y == - v.y;
  56.     }
  57.     //逆向量后返回新向量
  58.     public function negateNew():Vector {
  59.       return new Vector(- x,- y);
  60.     }
  61.     //向量缩放
  62.     public function scale(s : Number) {
  63.       x *= s;
  64.       y *= s;
  65.     }
  66.     //向量缩放后返后新的向量
  67.     public function scaleNew(s : Number):Vector {
  68.       return new Vector(x * s,y * s);
  69.     }
  70.     //向量的长度
  71.     public function getLength():Number {
  72.       return Math.sqrt(x * x + y * y);
  73.     }
  74.     //设定向量的长度
  75.     public function setLength(l) {
  76.       var r = getLength ();
  77.       r == 0?x = l : scale (l / r);
  78.     }
  79.     //向量的角度
  80.     public function getAngle():Number {
  81.       return atan2D(y,x);
  82.     }
  83.     //设置向量的角度
  84.     public function setAngle(angle : Number) {
  85.       var r = getLength ();
  86.       x = r * acosD (angle);
  87.       y = r * asinD (angle);
  88.     }
  89.     //向量的旋转
  90.     //左旋转angle>0右旋转angle<0
  91.     public function rotate(angle : Number) {
  92.       var ca = acosD (angle);
  93.       var sa = asinD (angle);
  94.       var rx = x * ca - y * sa;
  95.       var ry = x * sa + y * ca;
  96.       x = rx;
  97.       y = ry;
  98.     }
  99.     //旋转后返回新向量
  100.     public function rotateNew(angle : Number):Vector {
  101.       var v = new Vector (x, y);
  102.       v.rotate(angle);
  103.       return v;
  104.     }
  105.     //向量的点积
  106.     public function dot(v : Vector):Number {
  107.       return (x * v.x + y * v.y);
  108.     }
  109.     //得到法向量(垂直向量)
  110.     public function getNormal():Vector {
  111.       return new Vector(- y,x);
  112.     }
  113.     //验证是否垂直
  114.     public function isPerpTo(v : Vector):Boolean {
  115.       return dot(v) == 0;
  116.     }
  117.     //向量的夹角
  118.     public function angleBetween(v : Vector):Number {
  119.       if (equals (v)) {
  120.         return 0;
  121.       }
  122.       if (isNegate (v)) {
  123.         return 180;
  124.       }
  125.       var dp : Number = dot (v);
  126.       var ca : Number = dp / (getLength () * v.getLength ());
  127.       var cs : Number = acosD (ca);
  128.       return cs;
  129.     }
  130.     /**
  131.   * 私有方法分别计算一个弧度的正弦对应的角度和余弦对象的角度
  132.   * @param radian 一个弧度值
  133.   */
  134.   private function acosD(radian:Number):Number {
  135.     return Math.cos(radian * Math.PI / 180);
  136.   }
  137.   private function asinD(radian:Number):Number {
  138.     return Math.sin(radian * Math.PI / 180);
  139.   }
  140.   private function atan2D(x:Number,y:Number):Number {
  141.     return Math.atan2(y,x)*(180/Math.PI);
  142.   }
  143.   
  144.   
  145.   
  146.   }
  147. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值