class TVector3D { var x, y, z:Number; function TVector3D(x1:Number, y1:Number, z1:Number) { x = x1; y = y1; z = z1; } public function printf() { trace("("+x+" , "+y+" , "+z+")"); } public function reset(x1:Number, y1:Number, z1:Number) { x = x1; y = y1; z = z1; } public function duplicate() { return (new TVector3D(x, y, z)); } public function equal(b:TVector3D) { if ((x-b.x == 0) && (y-b.y == 0) && (z-b.z == 0)) { return true; } else { return false; } } public function reverse() { x = -x; y = -y; z = -z; } public function getReverse() { return (new TVector3D(-x, -y, -z)); } public static function plus(a:TVector3D, b:TVector3D) { return (new TVector3D(a.x+b.x, a.y+b.y, a.z+b.z)); } public function plusby(b:TVector3D) { x += b.x; y += b.y; z += b.z; } static function minus(a:TVector3D, b:TVector3D) { return (new TVector3D(a.x-b.x, a.y-b.y, a.z-b.z)); } public function minusby(b:TVector3D) { x -= b.x; y -= b.y; z -= b.z; } public function realmulby(k:Number) { x *= k; y *= k; z *= k; } public static function realmul(a:TVector3D, k:Number) { return (new TVector3D(a.x*k, a.y*k, a.z*k)); } public function len() { return (Math.sqrt(x*x+y*y+z*z)); } public function len2() { return (x*x+y*y+z*z); } public function setLen(s:Number) { this.realmulby(s/this.len()); } public function dotproby(b:TVector3D) { return (x*b.x+y*b.y+z*b.z); } static function crosspro(a:TVector3D, b:TVector3D):TVector3D { return (new TVector3D(a.y*b.z-b.y*a.z, a.z*b.x-b.z*a.x, a.x*b.y-b.x*a.y)); } public function anglewith(b:TVector3D) { return Math.acos(this.dotproby(b)/(this.len()*b.len()))*180/Math.PI; } public function radwith(b:TVector3D) { return Math.acos(this.dotproby(b)/(this.len()*b.len())); } public function getShadow(b:TVector3D) { return this.dotproby(b)/this.len(); } public function getPerspective(dist:Number) { if (dist == undefined) { dist = 300; } if (z+dist<=0) { return 0; } else { return (dist/(this.z+dist)); } } public function to2d(k:Number) { if (k == undefined) { k = this.getPerspective(); } return (new TVector3D(x*k, y*k)); } public function rotateX(cos:Number, sin:Number) { var y1 = y*cos-z*sin; var z1 = y*sin+z*cos; y = y1; z = z1; } public function rotateY(cos:Number, sin:Number) { var z1 = z*cos-x*sin; var x1 = z*sin+x*cos; z = z1; x = x1; } public function rotateZ(cos:Number, sin:Number) { var x1 = x*cos-y*sin; var y1 = x*sin+y*cos; x = x1; y = y1; } public function rotate(tx:Number, ty:Number, tz:Number) { var cosx:Number = Math.cos(tx/180*Math.PI); var sinx:Number = Math.sin(tx/180*Math.PI); var cosy:Number = Math.cos(ty/180*Math.PI); var siny:Number = Math.sin(ty/180*Math.PI); var cosz:Number = Math.cos(tz/180*Math.PI); var sinz:Number = Math.sin(tz/180*Math.PI); rotateX(cosx, sinx); rotateY(cosy, siny); rotateZ(cosz, sinz); } public function rotateAxis(b:TVector3D,st:TVector3D, ank:Number) { var tv = new TVector3D(); tv = TVector3D.minus(this,st); var vt = new TVector3D(); vt = b.getCopy(); vt.setLen(1); var vt0 = new TVector3D(); vt0 = vt.getCopy(); var k:Number = tv.dotproby(vt); vt.realmulby(k); var vt1 = new TVector3D(); vt1 = tv.getCopy(); vt1.minusby(vt); var vt2 = new TVector3D(); vt2 = TVector3D.crosspro(vt0,vt1); ank = ank/180*Math.PI; this.x = vt.x+vt1.x*Math.cos(ank)+vt2.x*Math.sin(ank)+st.x; this.y = vt.y+vt1.y*Math.cos(ank)+vt2.y*Math.sin(ank)+st.y; this.z = vt.z+vt1.z*Math.cos(ank)+vt2.z*Math.sin(ank)+st.z; } public function getCopy() { return (new TVector3D(this.x, this.y, this.z)); } public function middle(b:TVector3D):TVector3D { return (new TVector3D(0.5*(this.x+b.x), 0.5*(this.y+b.y), 0.5*(this.z+b.z))); } public function propPoint(b:TVector3D, k:Number):TVector3D { return (new TVector3D((this.x+b.x*k)/(1+k), (this.y+b.y*k)/(1+k), (this.z+b.z*k)/(1+k))); } public function distTo2(b:TVector3D):Number { return (this.len2()-Math.pow(this.dotproby(b), 2)/b.len2()); } }