导航

  • 首页
  • Tags列表
  • 管理
  • 简繁转换
Search Engine Optimization 站外搜索 站内搜索
« 室内污染消除法什么是XML »

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;
}
}
}

发表评论:

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

Search



  • 互联网 站内搜索

最新留言

最近发表

站点统计

  • 文章总数:244
  • 评论总数:246
  • 引用总数:0
  • 浏览总数:380993
  • 当前样式:default
  • 当前语言:zh-CN

图标汇集

  • 订阅到抓虾
    新闻蚂蚁
    周博通
    订阅到狗狗
    google reader
    bloglines
    my yahoo
    newsgator
    netvibes
    Rojo
  • 通过 W3C XHTML 1.0 Transitional 校验
  • 通过 W3C CSS 校验
  • 订阅本站的 ATOM 1.0 新闻聚合
  • 订阅本站的 RSS 2.0 新闻聚合

Powered By Z-Blog 1.6 Final Build 60802

Copyright Yufuzi Some Rights Reserved.
E-mail:yufuzi80@126.com QQ:20168130
备案序号:苏ICP备06015492号