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









