钓鱼方法钓鱼技巧钓鱼攻略钓鱼秘籍钓鱼装备,尽在渔夫子

Vector3d类(三维粒子)

点击这里查看:myMath类

import myMath;
class Vector3d {
  var x:Number;
  var y:Number;
  var z:Number;
  /*格式化输出向量坐标,(将坐标舍入为3个十进制小数位)对实际数值不造成任何影响*/
  function toString() {
    var rx:Number = Math.round(this.x*1000)/1000;
    var ry:Number = Math.round(this.y*1000)/1000;
    var rz:Number = Math.round(this.z*1000)/1000;
    return "["+rx+", "+ry+", "+rz+"]";
  }
  /*重置Vector类*/
  function reset(x:Number, y:Number, z:Number):Void {
    this.x = x;
    this.y = y;
    this.z = z;
  }
  /*构造函数*/
  function Vector3d(x:Number, y:Number, z:Number) {
    this.x = x;
    this.y = y;
    this.z = z;
  }
  /*复制Vector类*/
  function getClone():Vector3d {
    return new Vector3d(this.x, this.y, this.z);
  }
  /*比较两个Vector类是否相等*/
  function equals(v:Vector3d):Boolean {
    return (this.x == v.x && this.y == v.y && this.z == v.z);
  }
  /*向量加法,改变的是当前对象*/
  function plus(v:Vector3d):Void {
    with (this) {
      x += v.x;
      y += v.y;
      z += v.z;
    }
  }
  /*将两个向量和存储在一个新的对象中*/
  function plusNew(v:Vector3d):Vector3d {
    return new Vector3d(this.x+v.x, this.y+v.y, this.z+v.z);
  }
  /*向量减法,改变的是当前对象*/
  function minus(v:Vector3d):Void {
    with (this) {
      x -= v.x;
      y -= v.y;
      z -= v.z;
    }
  }
  /*将两个向量差存储在一个新的对象中*/
  function minusNew(v:Vector3d):Vector3d {
    return new Vector3d(this.x-v.x, this.y-v.y, this.z-v.z);
  }
  /*向量求逆,改变的是当前对象*/
  function negate():Void {
    with (this) {
      x = -x;
      y = -y;
      z = -z;
    }
  }
  /*向量求逆后存储在一个新的对象中*/
  function negateNew():Vector3d {
    return new Vector3d(-this.x, -this.y, -this.z);
  }
  /*向量缩放*/
  function scale(s:Number):Void {
    with (this) {
      x *= s;
      y *= s;
      z *= s;
    }
  }
  function scaleNew(s:Number):Vector3d {
    return new Vector3d(this.x*s, this.y*s, this.z*s);
  }
  /*向量长度*/
  function getLength():Number {
    with (this) {
      return Math.sqrt(x*x+y*y+z*z);
    }
  }
  /*跟据给定向量长度,重新设置Vector对象的大小*/
  function setLength(len:Number):Void {
    var r:Number = this.getLength();
    if (r) {
      this.scale(len/r);
    } else {
      this.x = len;
    }
  }
  /*点积*/
  function dot(v:Vector3d):Number {
    with (this) {
      return x*v.x+y*v.y+z*v.z;
    }
  }
  /*叉积*/
  function cross(v:Vector3d):Vector3d {
    with (this) {
      var cx:Number = y*v.z-z*v.y;
      var cy:Number = z*v.x-x*v.z;
      var cz:Number = x*v.y-y*v.x;
      return new Vector3d(cx, cy, cz);
    }
  }
  /*向量的夹角*/
  function angleBetween(v:Vector3d):Number {
    var dp:Number = this.dot(v);
    var cosAngle:Number = dp/(this.getLength()*v.getLength());
    return myMath.acosD(cosAngle);
  }
  /*向量的投影*/
  /*向量的透视比例系数*/
  function getPerspective(viewDist:Number):Number {
    if (viewDist == undefined) {
      viewDist = 300;
    }
    return viewDist/(this.z+viewDist);
  }
  /*用于将三维中空间中的点投影为屏幕上的二维点坐标*/
  function persProject(p:Number):Void {
    with (this) {
      if (p == undefined) {
        p = getPerspective();
      }
      x *= p;
      y *= p;
      z = 0;
    }
  }
  function persProjectNew(p:Number):Vector3d {
    with (this) {
      if (p == undefined) {
        p = getPerspective();
      }
      return new Vector3d(p*x, p*y, 0);
    }
  }
  /*绕X轴旋转*/
  function rotateX(angle:Number):Void{
    with (myMath) {
        var ca:Number = cosD (angle);
        var sa:Number = sinD (angle);
    }
    with (this) {
        var tempY:Number = y * ca - z * sa;
        var tempZ:Number = y * sa + z * ca;
        y = tempY;
        z = tempZ;
    }
}
  /*参数ca和sa分别为传递角度的余弦和正弦值*/
  function rotateXTrig(ca:Number,sa:Number):Void{
     with (this) {
        var tempY:Number = y * ca - z * sa;
        var tempZ:Number = y * sa + z * ca;
        y = tempY;
        z = tempZ;
    }
}
  /*绕Y轴旋转*/
  function rotateY(angle:Number):Void{
    with (myMath) {
        var ca:Number = cosD (angle);
        var sa:Number = sinD (angle);
    }
    with (this) {
        var tempX:Number = x * ca + z * sa;
        var tempZ:Number = x * -sa + z * ca;
        x = tempX;
        z = tempZ;
    }
}
  /*参数ca和sa分别为传递角度的余弦和正弦值*/
  function rotateYTrig(ca:Number,sa:Number):Void{
    with (this) {
        var tempX:Number = x * ca + z * sa;
        var tempZ:Number = x * -sa + z * ca;
        x = tempX;
        z = tempZ;
    }
}
  /*绕Z轴旋转*/
  function rotateZ(angle:Number):Void{
    with (myMath) {
        var ca = cosD (angle);
        var sa = sinD (angle);
    }
    with (this) {
        var tempX:Number = x * ca - y * sa;
        var tempY:Number = x * sa + y * ca;
        x = tempX;
        y = tempY;
    }
}
  function rotateZTrig(ca:Number,sa:Number):Void{
    with (this) {
        var tempX:Number = x * ca - y * sa;
        var tempY:Number = x * sa + y * ca;
        x = tempX;
        y = tempY;
    }
}
  /*绕同时绕X轴和Y轴旋转*/
  function rotateXY(a:Number,b:Number):Void{
    with (myMath) {
        var ca:Number = cosD (a);
    var sa:Number = sinD (a);
        var cb:Number = cosD (b);
    var sb:Number = sinD (b);
    }
    with (this) {
        var rz:Number = y * sa + z * ca;
        y = y * ca - z * sa;
        z = x * -sb + rz * cb;
        x = x * cb + rz * sb;
    }
}
  function rotateXYTrig(ca:Number, sa:Number, cb:Number, sb:Number):Void {
    with (this) {
        var rz:Number = y * sa + z * ca;
        y = y * ca - z * sa;
        z = x * -sb + rz * cb;
        x = x * cb + rz * sb;
    }
}
  /*绕同时绕XYZ轴旋转*/
  function rotateXYZ(a:Number,b:Number,c:Number):Void{
    with (myMath) {
        var ca:Number = cosD (a);
    var sa:Number = sinD (a);
        var cb:Number = cosD (b);
    var sb:Number = sinD (b);
        var cc:Number = cosD (c);
    var sc:Number = sinD (c);
    }
    with (this) {
        var ry:Number = y * ca - z * sa;
        var rz:Number = y * sa + z * ca;
        var rx:Number = x * cb + rz * sb;
        z = x * -sb + rz * cb;
        x = rx * cc - ry * sc;
        y = rx * sc + ry * cc;
    }
  }
  function rotateXYZTrig(ca:Number, sa:Number, cb:Number, sb:Number, cc:Number, sc:Number):Void{
    with (this) {
        var ry:Number = y * ca - z * sa;
        var rz:Number = y * sa + z * ca;
        var rx:Number = x * cb + rz * sb;
        z = x * -sb + rz * cb;
        x = rx * cc - ry * sc;
        y = rx * sc + ry * cc;
    }
}
}

标签:flash
分类:生活点滴| 发布:渔夫子| 查看: | 发表时间:2006-7-31
原创文章如转载,请注明:转载自渔夫子 http://www.yufuzi.net/
本文链接:http://www.yufuzi.net/post/flash_Vector3d.html

相关文章

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。