- UID
- 343
- 帖子
- 987
- 精华
- 13
- 积分
- 7771
- 阅读权限
- 101
- 来自
- 哈尔滨工程大学
- 在线时间
- 124 小时
- 注册时间
- 2004-12-17
- 最后登录
- 2008-7-11
|
2楼
发表于 2007-6-27 11:09
| 只看该作者
全部源代码如下:
- class Vxp3 {
- //---------------------------
- //三维向量的40个基本方法
- //最后更新:2007-06-14
- //版本:1.00_alpha
- //作者:las
- //E-mail:ilovelassie@163.com
- //版权:遵守GNU协议,任何人都可以自由复制修改传播,但不得用于商业用途。
- //----------------------------
- //定义三个坐标作为共有属性。
- public var ix:Number;
- public var iy:Number;
- public var iz:Number;
- //构造函数。
- public function Vxp3(param_x:Number, param_y:Number, param_z:Number) {
- this.ix = param_x;
- this.iy = param_y;
- this.iz = param_z;
- }
- //基本方法:
- //1.输出向量到输出窗口。
- public function toString(s:String):Void {
- trace(s+": x:"+this.ix+" y:"+this.iy+" z:"+this.iz);
- }
- //2.向量的重设。
- public function reset(param_x:Number, param_y:Number, param_z:Number):Void {
- this.ix = param_x;
- this.iy = param_y;
- this.iz = param_z;
- }
- //3.向量的复制。
- public function clone():Vxp3 {
- return (new Vxp3(this.ix, this.iy, this.iz));
- }
- //计算方法:
- //1.向量比较。
- public function equal(v:Vxp3):Boolean {
- return (this.ix == v.ix && this.iy == v.iy && this.iz == v.iz);
- }
- //2.向量加法。
- public function plus(v:Vxp3):Vxp3 {
- return (new Vxp3(this.ix+v.ix, this.iy+v.iy, this.iz+v.iz));
- }
- //3.向量减法。
- public function minus(v:Vxp3):Vxp3 {
- return (new Vxp3(this.ix-v.ix, this.iy-v.iy, this.iz-v.iz));
- }
- //4.向量求模。
- public function get mod():Number {
- return (Math.sqrt(this.ix*this.ix+this.iy*this.iy+this.iz*this.iz));
- }
- //5.向量设模。
- public function set mod(l:Number):Void {
- var r = this.mod;
- if (r == 0) {
- this.reset(0, 0, 0);
- } else {
- var v = this.scale(l/r);
- this.reset(v.ix, v.iy, v.iz);
- }
- }
- //6.向量点积。
- public function dot(v:Vxp3):Number {
- return (this.ix*v.ix+this.iy*v.iy+this.iz*v.iz);
- }
- //7.向量叉乘。
- public function cross(v:Vxp3):Vxp3 {
- var cx = this.iy*v.iz-this.iz*v.iy;
- var cy = this.iz*v.ix-this.ix*v.iz;
- var cz = this.ix*v.iy-this.iy*v.ix;
- return (new Vxp3(cx, cy, cz));
- }
- //8.向量夹角。
- public function angle(v:Vxp3):Number {
- var dp = this.dot(v);
- var cosAngle = dp/(this.mod*v.mod);
- return (Math.acos(cosAngle));
- }
- //9.向量的X轴方向角。
- public function angleX():Number {
- return (Math.acos(this.ix/this.mod));
- }
- //10.向量的Y轴方向角。
- public function angleY():Number {
- return (Math.acos(this.iy/this.mod));
- }
- //11.向量的Z轴方向角。
- public function angleZ():Number {
- return (Math.acos(this.iz/this.mod));
- }
- //旋转方法
- //12.围绕X轴旋转,参数为逆时针角速度。
- public function rotateX1(a:Number):Vxp3 {
- return (this.rotateX2(Math.cos(a), Math.sin(a)));
- }
- //13.围绕Y轴旋转,参数为逆时针角速度。
- public function rotateY1(a:Number):Vxp3 {
- return (this.rotateY2(Math.cos(a), Math.sin(a)));
- }
- //14.围绕Z轴旋转,参数为逆时针角速度。
- public function rotateZ1(a:Number):Vxp3 {
- return (this.rotateZ2(Math.cos(a), Math.sin(a)));
- }
- //15.围绕X轴旋转,参数为逆时针角速度的余弦值和正弦值。
- public function rotateX2(c:Number, s:Number):Vxp3 {
- var ny = this.iy*c-this.iz*s;
- var nz = this.iz*c+this.iy*s;
- return (new Vxp3(this.ix, ny, nz));
- }
- //16.围绕Y轴旋转,参数为逆时针角速度的余弦值和正弦值。
- public function rotateY2(c:Number, s:Number):Vxp3 {
- var nz = this.iz*c-this.ix*s;
- var nx = this.ix*c+this.iz*s;
- return (new Vxp3(nx, this.iy, nz));
- }
- //17.围绕Z轴旋转,参数为逆时针角速度的余弦值和正弦值。
- public function rotateZ2(c:Number, s:Number):Vxp3 {
- var nx = this.ix*c-this.iy*s;
- var ny = this.iy*c+this.ix*s;
- return (new Vxp3(nx, ny, this.iz));
- }
- //18.使用向量分解法的扩展旋转方法,参数为基准向量和要旋转角度值。
- public function rotateN1(param_n:Vxp3, a:Number):Vxp3 {
- return (this.rotateN2(param_n, Math.cos(a), Math.sin(a)));
- }
- //19.使用向量分解法的扩展旋转方法,参数为基准向量和要旋转角度的余弦和正弦值。
- public function rotateN2(param_n:Vxp3, c:Number, s:Number):Vxp3 {
- var n = param_n.clone();
- n.mod = 1;
- var v = n.scale(this.dot(n));
- return (((this.minus(v)).scale(c)).plus((n.cross(this)).scale(s)).plus(v));
- }
- //20.使用局部坐标系法的扩展旋转方法。
- public function rotateN3(v:Vxp3, a:Number):Vxp3 {
- var vi:Vxp3 = new Vxp3();
- var vj:Vxp3 = new Vxp3();
- var vk:Vxp3 = new Vxp3();
- var vc:Vxp3 = new Vxp3();
- var vs:Vxp3 = new Vxp3();
- vi = v.clone();
- if (vi.iy == 0 && vi.iz == 0) {
- vj.reset(0, 1, 0);
- } else {
- vj.reset(1, 0, 0);
- }
- vk = vj.cross(vi);
- vj = vk.cross(vi);
- vi.mod = 1;
- vj.mod = 1;
- vk.mod = 1;
- var vc = new Vxp3(this.dot(vi), this.dot(vj), this.dot(vk));
- vc = vc.rotateX1(a);
- var vs = vc.clone();
- vs.ix = vc.ix*vi.ix+vc.iy*vj.ix+vc.iz*vk.ix;
- vs.iy = vc.ix*vi.iy+vc.iy*vj.iy+vc.iz*vk.iy;
- vs.iz = vc.ix*vi.iz+vc.iy*vj.iz+vc.iz*vk.iz;
- return vs;
- }
- //缩放方法
- //21.同比例缩放。
- public function scale(s:Number):Vxp3 {
- return (new Vxp3(this.ix*s, this.iy*s, this.iz*s));
- }
- //22.X轴缩放。
- public function scaleX(s:Number):Vxp3 {
- return (new Vxp3(this.ix*s, this.iy, this.iz));
- }
- //23.Y轴缩放。
- public function scaleY(s:Number):Vxp3 {
- return (new Vxp3(this.ix, this.iy*s, this.iz));
- }
- //24.Z轴缩放。
- public function scaleZ(s:Number):Vxp3 {
- return (new Vxp3(this.ix, this.iy, this.iz*s));
- }
- //25.任意轴缩放,参数为基准向量和缩放系数。
- public function scaleN(param_n:Vxp3, s:Number):Vxp3 {
- var n = param_n.clone();
- n.mod = 1;
- var v = n.scale(this.dot(n)*(s-1));
- return (this.plus(v));
- }
- //屏幕投影
- //26.使用远点投影法返回X轴坐标。
- public function translateX(l:Number):Number {
- return (l*this.ix/(l-this.iz));
- }
- //27.使用远点投影法返回Y轴坐标。
- public function translateY(l:Number):Number {
- return (l*this.iy/(l-this.iz));
- }
- //28.新投影法,返回屏幕X坐标。
- public function tranToX(v:Vxp3):Number {
- var l:Number = v.mod;
- return (l*this.ix/(l-this.iz));
- }
- //29.新投影法,返回屏幕Y坐标
- public function tranToY(v:Vxp3):Number {
- var l:Number = v.mod;
- return (l*this.iy/(l-this.iz));
- }
- //正交投影
- //30.任意过原点直线上的投影。
- public function projectL(param_n:Vxp3):Vxp3 {
- var n = param_n.clone();
- n.mod = 1;
- return (n.scale(this.dot(n)));
- }
- //31.任意过原点平面上的投影,参数为平面的法向量。
- public function projectS(param_n:Vxp3):Vxp3 {
- var n = param_n.clone();
- n.mod = 1;
- return (this.minus(n.scale(this.dot(n))));
- }
- //镜像变换
- //32.向量关于X轴的镜像。
- public function mirrorX():Vxp3 {
- return (this.scaleX(-1));
- }
- //33.向量关于Y轴的镜像。
- public function mirrorY():Vxp3 {
- return (this.scaleY(-1));
- }
- //34.向量关于Z轴的镜像。
- public function mirrorZ():Vxp3 {
- return (this.scaleZ(-1));
- }
- //35.向量关于原点的镜像。
- public function mirrorO():Vxp3 {
- return (this.scale(-1));
- }
- //36.向量关于任意过原点直线的镜像。
- public function mirrorN(param_n:Vxp3):Vxp3 {
- var n = param_n.clone();
- n.mod = 1;
- return (this.minus(n.scale(2*this.dot(n))));
- }
- //错切变换
- //37.X轴Y轴方向的切变,参数为X轴方向的切变系数xs和Y轴方向的切变系数ys。
- public function shareXY(xs:Number, ys:Number):Vxp3 {
- return (new Vxp3(this.ix+this.iz*xs, this.iy+this.iz*ys, this.iz));
- }
- //38.Y轴Z轴方向的切变,参数为Y轴方向的切变系数ys和Z轴方向的切变系数zs。
- public function shareYZ(ys:Number, zs:Number):Vxp3 {
- return (new Vxp3(this.ix, this.iy+this.ix*ys, this.iz+this.ix*zs));
- }
- //39.Z轴X轴方向的切变,参数为Z轴方向的切变系数xs和X轴方向的切变系数xs。
- public function shareZX(zs:Number, xs:Number):Vxp3 {
- return (new Vxp3(this.ix+this.iy*xs, this.iy, this.iz+this.ix*zs));
- }
- }
复制代码 |
|